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

У меня сайт “доска объявлений”.
Внизу каждого объявления нужно создать два поля: текст обращения по объявлению и 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     = 'Ответ на ваше объявлениеrnИмя отправителя : $user_login rnКонтакт : $user_emailrn Объявление, на которое отправлен ответ: $adrnn" . "Текст сообщения : rn$messagern';
            wp_mail($sendto, $subject, $msg, 'From: $user_emailrnReply-To: $user_emailrnReturn-Path: $user_emailrn');
            ?>
            

            Спасибо, < ?=$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)rnИмя : $user_login rnКонтакт : $user_emailrnСообщение : rn$message rnn";
            wp_mail($to, $subject, $msg, "From: $user_emailrnReply-To: $user_emailrnReturn-Path: $user_emailrn");
            ?>
            

            Спасибо, < ?=$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. Добрый день! код полезный,спасибо!
    Скажите пожалуйста, а как сделать так, чтобы поле для ввода сообщения не сразу было видно, а только после того, как я нажму на отельную кнопку “Написать сообщение автору”, после этого должна выплывать эта форма для ввода сообщения?

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

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


*