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

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

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

Kvanto
Оцените автора
Добавить комментарий

  1. tiaurus

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

    <a class="mail-to-author" rel="nofollow" href="mailto:<?php the_author_meta('user_email'); ?>?subject=с сайта n-wp.ru: <?php the_title(); ?> (<?php the_permalink() ?>)&body=<?php the_permalink() ?>" title="Написать автору">Написать автору</a>

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

    Ответить
    1. Kvanto автор

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

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

      Ответить
      1. tiaurus

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

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

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

        Ответить
        1. Kvanto автор

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

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

          Ответить
          1. Apathetic

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

                                    <?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');
                        ?>
                            <!-- Сообщение отправлено! (можете поменять текст)-->
                            <div style="text-align:center;">
                                <p>Спасибо, <b><?=$user_login;?></b>, Ваше сообщение успешно отправлено!</p>
                            </div>
                            <!--End Message Sent-->
                        <?php
                        }
                        if(!isset($_POST['send']) || $error != '')
                        {
                        ?>
                        <!--Error Message-->
                        <?=$error;?>
                        <form method="post" name="contFrm" id="contFrm" action="">
                            <label>Сообщение</label><br/>
                            <textarea name="message" cols="50" rows="6"  id="message"><?=$message;?></textarea><br/>
                            <input name="send" type="submit" class="button" id="send" value="Отправить" />
                        </form>
                        <?php } } else { ?>
            <p>Войдите, чтобы получить возможность отправить сообщение автору этого объявления</p>
              <?php } ?>
            Ответить
            1. Apathetic

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

              Ответить
          2. Apathetic

            Перепроверил и протестировал код. Теперь всё точно работает. Вставляйте в 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");
            		?>
            			<div style="text-align:center;">
            			<p>Спасибо, <b><?=$user_login;?></b>, Ваше сообщение успешно отправлено!</p>
            			</div>
            		<?php
            	}
            	if(!isset($_POST['send']) || $error != '')
            	{ ?>
            		<form method="post" name="contFrm" id="contFrm" action="">
            		<label>Ваше сообщение: </label><br/>
            		<textarea name="message" cols="50" rows="6"  id="message"><?=$message;?></textarea><br/>
            		<input name="send" type="submit" class="button" id="send" value="Отправить" />
            		</form>
            	<?php }} 
            		else
            	{ ?>
            		<p>Войдите, чтобы получить возможность отправить сообщение автору этого объявления</p>
            <?php } ?>
            
            Ответить
            1. Kvanto автор

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

              Ответить
              1. Apathetic

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

                $to       = get_post_meta($post->ID, 'wtf_comail', true);
                Ответить
                1. Kvanto автор

                  Да, логика регистраций именно такая. Сначала хотел всех регистрировать и брать оплату за размещение объявлений. Но потом понял, что на сайте в первую очередь нужен контент. И чем меньше кликов на пути его создания, тем больше контента. А вот за использование контента можно уже и деньги брать.

                  Ответить
            2. Kvanto автор

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

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

              Ответить
              1. Apathetic

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

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

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

                Ответить
                1. Kvanto автор

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

                  Ответить
                2. vedmed

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

                  Ответить
      2. tiaurus

        Кстати, хорошая мысль — форма обратной связи с автором. Нужно реализовать ее на n-wp.ru.

        Ответить
        1. artstorm

          Форма обратной связи с автором, + его последние посты и Био и граватаром — http://tkacheff.ru/697/plugins-author-metabox/

          Ответить
  2. dan9

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

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

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

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

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

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

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

    Ответить
  3. YuryZidane

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

    Ответить
    1. tiaurus

      Посмотрите ответы на вопрос о модальном окне — https://n-wp.ru/modalnoe-okno/

      Ответить