Отправка писем пользователями прямо с сайта

У меня сайт “доска объявлений”.
Внизу каждого объявления нужно создать два поля: текст обращения по объявлению и e-mail отправителя (либо брать адрес из его учетной записи). При нажатии кнопки “Отправить” письмо уходит автору объявления (свой e-mail авторы оставляют при создании объяв).
Как это можно реализовать?

Казалось бы, тривиальная задача. Но googling и яндексирование ответов не дали. Поиск по профильным сайтам тоже не помог. Может, не то ищу?

19 Комментарии

  1. Я использую кнопку отправки письма автору поста на этом сайте (да и на других). Код примерно такой:

    Написать автору

    Вставляется в single.php, желательно внутрь цикла вывода содержимого поста.

    • Все верно. Так же поступил сначала и я. Однако, выяснилось, что не у всех пользователей корректно или вообще как-то настроен на компьютере почтовик по умолчанию. Поэтому не всегда ссылка “mailto:” обрабатывается корректно.

      Вот поэтому мне нужно сделать так, чтобы тело письма отправитель писал прямо у меня на сайте. А по кнопке “Отправить” мой сайт отправлял бы это тело по адресу автора объявления.

      • Я встречал один способ создания формы обратной связи с автором поста тут. Но способ муторный и мне не понравился. Есть не совсем понятный перевод этой статьи на русский тут, но доля муторности и непонятности в нем такая же, как и в оригинале.

        Гораздо проще использовать какую-нибудь уже готовую контактную форму, передавая в нее аргументы текущего поста. Например, есть замечательный плагин для создания контактных форм Contact Form 7, и для него придумали передавать аргумент sendto.

        Да что там – ведь есть уже готовое решение: плагин Send E-mail. Он по умолчанию отправляет письмо автору поста, в который вставлена контактная форма.

        • Плагин Send E-Mail не подойдет, т.к. мыло автора объявления у меня находится в произвольном поле. Объявления могут создавать и незарегистрированные пользователи.

          Буду пробовать Contact Form 7 с указанным хаком.

          • Не нужно никаких хаков. Вам же нужна простейшая вещь – форма из одного поля и одной кнопки. Зачем использовать какой-то тяжелый плагин для этого? Следующий код я не тестировал, но он должен работать. Вставьте его в луп в том месте, где хотите, чтобы отображалась форма. Я так понял, что сообщения должны иметь возможность отправлять только зарегистрированные пользователи, поэтому никакой дополнительной защиты от спама не предусмотрено. Пожелания по доработке приветствуются =)

                                    < ?php if ( is_user_logged_in() ) {
            				 get_currentuserinfo();
            				 $sendto   = get_the_author_meta('user_email'); // email адресата
                             $subject  = 'Ответ на ваше объявление'; // тема
            				 $ad	   = the_title();
            				 $adlink   = the_permalink();
                             $message  = ''; // сообщение
            				 
            			if(isset($_POST['send']))
                        {
                             $message  = $_POST['message'];
                             if(get_magic_quotes_gpc())
                             {
                                 $message = stripslashes($message);
                             }
                             $msg     = 'Ответ на ваше объявление\r\nИмя отправителя : $user_login \r\nКонтакт : $user_email\r\n Объявление, на которое отправлен ответ: $ad\r\n\n" . "Текст сообщения : \r\n$message\r\n';
                             wp_mail($sendto, $subject, $msg, 'From: $user_email\r\nReply-To: $user_email\r\nReturn-Path: $user_email\r\n');
                        ?>
                            
                            

            Спасибо, < ?=$user_login;?>, Ваше сообщение успешно отправлено!

            < ?php } if(!isset($_POST['send']) || $error != '') { ?> < ?=$error;?>


            < ?php } } else { ?>

            Войдите, чтобы получить возможность отправить сообщение автору этого объявления

            < ?php } ?>
            • Быстрофикс:
              Вместо the_title() и the_permalink() нужно использовать get_the_title() и get_the_permalink() в пятой и шестой строках соотвественно.

          • Перепроверил и протестировал код. Теперь всё точно работает. Вставляйте в loop.

            < ?php  if ( is_user_logged_in() ) { 
            	get_currentuserinfo();
            	$to			= get_the_author_meta('user_email');
            	$subject	= 'Ответ на ваше объявление';
            	$adlink		= get_permalink();
            	if(isset($_POST['send']))
            	{
            		$message  = $_POST['message'];
            		$msg     = "Ответ на ваше объявление ($adlink)\r\nИмя : $user_login \r\nКонтакт : $user_email\r\nСообщение : \r\n$message \r\n\n";
            		wp_mail($to, $subject, $msg, "From: $user_email\r\nReply-To: $user_email\r\nReturn-Path: $user_email\r\n");
            		?>
            			

            Спасибо, < ?=$user_login;?>, Ваше сообщение успешно отправлено!

            < ?php } if(!isset($_POST['send']) || $error != '') { ?>


            < ?php }} else { ?>

            Войдите, чтобы получить возможность отправить сообщение автору этого объявления

            < ?php } ?>
            • Отлично. А теперь нужно научить этот код брать мыло адресата не из user_email, а из произвольного поля wtf_comail. Авторы объявлений не регистрируются у меня на сайте.

              • Т.е. для того, чтобы отправить объявление, регистрация не нужна, а чтобы ответить на него – нужна?
                Если я правильно понял, адрес автора объявления хранится в custom field wtf_comail? Если так, то просто замените третью строчку на

                $to       = get_post_meta($post->ID, 'wtf_comail', true);
                • Да, логика регистраций именно такая. Сначала хотел всех регистрировать и брать оплату за размещение объявлений. Но потом понял, что на сайте в первую очередь нужен контент. И чем меньше кликов на пути его создания, тем больше контента. А вот за использование контента можно уже и деньги брать.

            • Работает! Чисто, красиво, быстро! Аж загляденье!

              А как научить код отправлять каждое сообщение с сайта еще и мне на почту? Надо же знать, что люди людям пишут))

              • В таком случае третья строка должна выглядеть так:

                                 $to       = get_post_meta($post->ID, 'wtf_comail', true) . ', ' . get_settings('admin_email');
                

                Если позволите, замечу, что, на мой взгляд, подглядывать – не очень этично =) Но если бы мне очень-очень сильно хотелось читать, что пишут автору объявления, я бы обязательно указал, что “Копия вашего сообщения будет отправлена администратору сайта”. Впрочем, это остается на ваше усмотрение, разумеется.

                • Хм… пожалуй, Вы правы. Это излишнее любопытство, которое сложно честно оправдать каким-то полезным результатом. Раньше не задумывался об этом.

                • Здравствуйте!
                  Вы даже не представляете как выручили!
                  А не могли бы Вы подсказать, как в статье, рядом с формой вывести счетчик её отправки.
                  Если это конечно возможно.
                  Спасибо.

  2. Очень сырая форма, юзать в данном виде не рекомендуется!

    Нет проверки на пустую строку,
    Я бы добавил ещё

    $_POST['message'] =  substr(htmlspecialchars(trim($_POST['message'])), 0, 100);

    и проверку на количество сообщений у пользователя (!= ‘0’)

    Ну и интервал между отправками писем добавить для полноты реализации.

    И форма работает не только в цикле. Так как инфа из get_the_author_meta, а в цикле из формы нужна только get_permalink();

    Да и юзать форму лучше в виде функции.

  3. Добрый день! код полезный,спасибо!
    Скажите пожалуйста, а как сделать так, чтобы поле для ввода сообщения не сразу было видно, а только после того, как я нажму на отельную кнопку “Написать сообщение автору”, после этого должна выплывать эта форма для ввода сообщения?

Оставить комментарий

Ваш электронный адрес не будет опубликован.


*