Всем привет!

Плагин достаточно прост в управлении и настройке. Впрочем, и с ним возможны неполадки. Причин тому, что не работает Contact form 7 на WordPress может быть несколько. Приведем наиболее распространенные из них.

Почему не работает контактная форма WordPress?

Неподходящая тема или ошибка в теме

Частая проблема, из-за которой не работает контактная форма WordPress – неподходящая тема или же ошибки в Javascript-е темы. Для того чтобы понять, по этой ли причине у вас не работает форма обратной связи WordPress, нужно зайти в админку и выбрать вкладку «Темы». Там поменять шаблон на «тему по умолчанию» и после этого проверить работу отправки сообщений и внешний вид контактной формы. Если после этого сообщения отправляются, и почта работает – значит, нужно править ошибки в выбранной вами теме, так как из-за нее и не отправляется сообщение.

Несоответствие плагинов с Contact Form 7

Плагин для WordPress Contact Form 7 может не работать из-за того, что другие плагины на вашем сайте конфликтуют с ним, и в результате Вордпресс не отправляет почту. Чтобы исключить данную проблему – поочередно отключаем остальные плагины один за одним, каждый раз обновляя страницу обратной связи. Если после отключения одного из плагинов, контактная форма заработала, значит вы нашли корень проблемы. Ищите, чем заменить конфликтующий плагин. Если же вы отключили все плагины, а Contact Form 7 так и не работает, ищем ошибку дальше.

Письма попадают в спам

Возможен вариант, что письма попадают в спам. Если писем ежедневно приходит достаточно большое количество, спам-фильтр может начать их блокировать. Чтобы избежать этого, нужно зайти в настройки почты, которую вы используете для Вордпресс-блога, и отметить важные письма как не спам (если вы все-таки нашли их в папке со спамом). После того, почтовый сервис должен впредь их распознавать как не спамные.

Проверить работу обратной связи без плагина

Вы можете протестировать отправку почты на своем блоге без участия плагина. Вот статья о том, как это сделать – ». Это верный способ узнать, где спряталась ошибка – в самом плагине Contact Form, либо же она возникает непосредственно при отправке почты в WordPress.

Проблема вызвана хостингом

Чаще всего это выглядит так: сообщение отправляется, но не приходит на почту.

Бывает, что по какой-то причине (например, в случае атаки на сервер или же массовой рассылки писем) хостинг перестал отправлять письма. В этом случае настройка отправки почты на WordPress без участия вашего провайдера не обойдется. Необходимо связаться с технической поддержкой вашего хостинг-провайдера и выяснить причины проблемы. В данном случае вы не будете получать письма не только из контактной формы WordPress, но и сообщения о новых комментариях на блоге.

Но чаще всего подобные проблемы возникают при . В данном случае вам нужно обратить внимание на настройку почты на WordPress.

Плагин WP Mail SMTP

В Вордпресс есть встроенная функция отправки писем PHP Mail, но не на всех хостингах она работает корректно. Потому, если Вордпресс не отправляет почту, потребуется установить плагин WP Mail SMTP. Он активизирует возможность подключаться к SMTP-серверу. При этом ваш хостинг-провайдер должен допускать возможность подключения к внешним SMTP-серверам, а объем рассылок в день не должен превышать 2000 писем (ограничения Гугл и Яндекса).

Если данные условия соблюдены, переходим к WP Mail SMTP.

После того, как плагин установлен, потребуется создать почтовый ящик на Gmail, либо на Яндексе. Почту для домена на Яндексе можно создать перейдя по ссылке — .

Если вы создаете почтовый ящик блога на стороннем ресурсе, а не на хостинге, у вас появится ряд преимуществ. Вы не будете зависеть от стабильности работы хостинга, вам не придется доплачивать за увеличение объемов почты. Кроме того, работать в привычном интерфейсе почтового сервиса удобнее.

Ниже приведен образец настройки WP Mail SMTP на WordPress на примере e-mail на Yandex.ru.

Где SMTP Port – это SMTP порт сервера, на котором размещен почтовый ящик (в моем примере – SMTP порт Яндекс-почты).

Вместо вы вписываете название почтового ящика, который создали для вашего домена (любое имя @ название домена).

Такой же почтовый адрес вам необходимо указать в общих параметрах блога («Параметры» — «Общие настройки»).

Именно сюда вам должно прийти тестовое письмо, если все настроено верно.

Вот видео-инструкция о том, как настроить WP Mail SMTP:

Еще один плагин почты для WordPress, который похожим образом решает вопросы отправки-получения писем — Configure SMTP. Он так же достаточно прост в установке и настройке. Выбирайте тот плагин, который вам больше по душе.

Если вы все же не хотите создавать почтовый ящик на Яндексе или Гмейле, можно попробовать решить проблему с отправкой почты на Вордпресс и непосредственно на хостинге. Для этого вам также потребуется создать почтовый ящик, но на хостинге. При этом он должен быть такого вида: (где после собачки – название вашего домена).

Дело в том, что WordPress в строке отправителя указывает такой адрес, а некоторые хостинги не отправляют почту, если такого е-мэйла не существует фактически.

По такому же принципу можно устранить некоторые неполадки, если не работает Contact Form 7 на WordPress. В поле From при настройке плагина на вкладке «Письмо» впишите подобный почтовый адрес с именем домена.

Надеюсь, приведенные советы помогут вам исправить неполадки при отправке почты в WordPress, а также решить проблемы с работой плагина Contact Form.

Отправляет письмо на почту. Похожа на mail() в PHP.

Имя отправителя по умолчанию: WordPress , а email по умолчанию: [email protected] . Их можно переписать изменив заголовок письма на:

From: Example User

Функция использует фильтры wp_mail_from и wp_mail_from_name , которые влияют на адрес email"a и имя отправителя, соответственно, при этом поле From (от кого) собирается заново. Если только wp_mail_from (email) возвращает значение, то имя указываться не будет вообще: (From: [email protected])

Тип письма по умолчанию text/plain , а значит в теле письма нельзя использовать html теги. Изменить тип письма можно через фильтр wp_mail_content_type или указав заголовок: content-type: text/html .

Кодировка по умолчанию соответствует кодировке блога (обычно utf-8). Кодировка устанавливается через фильтр wp_mail_charset .

Для работы этой функции сервер должен работать с SMTP и должен быть установлен smtp_port в php.ini.

Это pluggable функция - т.е. её можно заменить из плагина. Это значит, что она будет работать (подключается) только после подключения всех плагинов, а до этого момента функция еще не определена... Поэтому нельзя вызывать эту и зависящие от неё функции прямо из кода плагина. Их нужно вызывать через хук plugins_loaded или позднее, например хук init .

Замена функции (переопределение) - в плагине можно создать функцию с таким же названием, тогда она заменит текущую функцию.

Хуки из функции
Возвращает

true, если удалось отправить письмо и false, если нет.

true не означает, что письмо дошло до адресата, а означает только то, что функция проделала всю процедуру отправки письма без ошибок.

Использование

wp_mail($to, $subject, $message, $headers, $attachments); $to(строка/массив) (обязательный) email получателя письма. Несколько получателей указываются в массиве или через запятую в строке.
По умолчанию: нет $subject(строка) (обязательный) Тема письма (заголовок).
По умолчанию: нет $message(строка) (обязательный) Тело письма (содержание, контент).
По умолчанию: нет $headers(строка/массив)

Заголовки письма, указывающие на его атрибуты. Для продвинутого использования. Может быть:

  • from - от кого. Пр. [email protected]
  • content-type - text/html , text/plain
  • cc - [email protected] - точная копия (carbon copy) - вторичные получатели письма, которым направляется копия. Они видят и знают о наличии друг друга.
  • bcc - [email protected] - скрытая точная копия (blind carbon copy) - скрытые получатели письма, чьи адреса не показываются другим получателям.
  • reply-to - [email protected]
  • и любые другие произвольные параметры.

По умолчанию: ""

$attachments(строка/массив) Файлы, которые следует прикрепить к письму. Указываем полный путь до файла (название файла включительно). Если нужно прикрепить несколько файлов указываем их названия в массиве или в строке через перенос строки.
По умолчанию: array()

Примеры

#1. Пример отправки письма

Отправим письмо от My Name с прикрепленным файлом attach.zip:

На некоторых серверах (хостингах) в поле FROM (в части email) обязательно должен фигурировать домен сайта, иначе, например, яндекс почта не получит письмо. Проверял на хостинге Бегет.

Т.е. в этом случае лучше не указывать From: , а изменить только часть этого поля, только имя, через фильтр:

Add_filter("wp_mail_from_name", function($from_name){ return "Мое имя, а не WordPress"; // тут можно указать свою почту: [email protected] });

// удалим фильтры, которые могут изменять заголовок $headers // remove_all_filters("wp_mail_from"); // remove_all_filters("wp_mail_from_name"); $attachments = array(WP_CONTENT_DIR . "/uploads/attach.zip"); $headers = "From: My Name " . "\r\n"; wp_mail("[email protected]", "Тема", "Содержание", $headers, $attachments); // [email protected] - кому отправляем.

#2. Пример использования массива для указания заголовков письма:

// подразумевается что $to, $subject, $message уже определены... // удалим фильтры, которые могут изменять заголовок $headers // remove_all_filters("wp_mail_from"); // remove_all_filters("wp_mail_from_name"); $headers = array("From: Me Myself ", "content-type: text/html", "Cc: John Q Codex ", "Cc: [email protected]", // тут можно использовать только простой email адрес); wp_mail($to, $subject, $message, $headers);

#3. Отправим письмо двум пользователям сразу и зададим формат письма html:

$multiple_to_recipients = array("[email protected]", "[email protected]"); add_filter("wp_mail_content_type", "set_html_content_type"); wp_mail($multiple_to_recipients, "The subject", "

The HTML message

"); // Сбросим content-type, чтобы избежать возможного конфликта remove_filter("wp_mail_content_type", "set_html_content_type"); function set_html_content_type() { return "text/html"; }

#4. Настройка параметров отправки через фильтры

#1 Этот пример показывает как изменить тип письма на html, используя фильтр wp_mail_content_type:
add_filter("wp_mail_content_type", function($content_type){ return "text/html"; }); wp_mail("[email protected]", "The subject", "

The HTML message

");
#2 Укажем свой адрес email в заголовке письма:
add_filter("wp_mail_from", "vortal_wp_mail_from"); function vortal_wp_mail_from($email_address){ return "[email protected]"; } // получим заголовок: WordPress
#3 Укажем имя в заголовке письма:
add_filter("wp_mail_from_name", "vortal_wp_mail_from_name"); function vortal_wp_mail_from_name($email_from){ return "XXX"; } // получим заголовок: XXX

Код wp mail : wp-includes/pluggable.php WP 5.2.1

0) { $from_name = substr($content, 0, $bracket_pos - 1); $from_name = str_replace(""", "", $from_name); $from_name = trim($from_name); } $from_email = substr($content, $bracket_pos + 1); $from_email = str_replace(">", "", $from_email); $from_email = trim($from_email); // Avoid setting an empty $from_email. } elseif ("" !== trim($content)) { $from_email = trim($content); } break; case "content-type": if (strpos($content, ";") !== false) { list($type, $charset_content) = explode(";", $content); $content_type = trim($type); if (false !== stripos($charset_content, "charset=")) { $charset = trim(str_replace(array("charset=", """), "", $charset_content)); } elseif (false !== stripos($charset_content, "boundary=")) { $boundary = trim(str_replace(array("BOUNDARY=", "boundary=", """), "", $charset_content)); $charset = ""; } // Avoid setting an empty $content_type. } elseif ("" !== trim($content)) { $content_type = trim($content); } break; case "cc": $cc = array_merge((array) $cc, explode(",", $content)); break; case "bcc": $bcc = array_merge((array) $bcc, explode(",", $content)); break; case "reply-to": $reply_to = array_merge((array) $reply_to, explode(",", $content)); break; default: // Add it to our grand headers array $headers[ trim($name) ] = trim($content); break; } } } } // Empty out the values that may be set $phpmailer->clearAllRecipients(); $phpmailer->clearAttachments(); $phpmailer->clearCustomHeaders(); $phpmailer->clearReplyTos(); // From email and name // If we don"t have a name from the input headers if (! isset($from_name)) { $from_name = "WordPress"; } /* If we don"t have an email from the input headers default to wordpress@$sitename * Some hosts will block outgoing mail from this address if it doesn"t exist but * there"s no easy alternative. Defaulting to admin_email might appear to be another * option but some hosts may refuse to relay mail from an unknown domain. See * https://core.trac.wordpress.org/ticket/5007. */ if (! isset($from_email)) { // Get the site domain and get rid of www. $sitename = strtolower($_SERVER["SERVER_NAME"]); if (substr($sitename, 0, 4) == "www.") { $sitename = substr($sitename, 4); } $from_email = "wordpress@" . $sitename; } /** * Filters the email address to send from. * * @since 2.2.0 * * @param string $from_email Email address to send from. */ $from_email = apply_filters("wp_mail_from", $from_email); /** * Filters the name to associate with the "from" email address. * * @since 2.3.0 * * @param string $from_name Name associated with the "from" email address. */ $from_name = apply_filters("wp_mail_from_name", $from_name); try { $phpmailer->setFrom($from_email, $from_name, false); } catch (phpmailerException $e) { $mail_error_data = compact("to", "subject", "message", "headers", "attachments"); $mail_error_data["phpmailer_exception_code"] = $e->getCode(); /** This filter is documented in wp-includes/pluggable.php */ do_action("wp_mail_failed", new WP_Error("wp_mail_failed", $e->getMessage(), $mail_error_data)); return false; } // Set mail"s subject and body $phpmailer->Subject = $subject; $phpmailer->Body = $message; // Set destination addresses, using appropriate methods for handling addresses $address_headers = compact("to", "cc", "bcc", "reply_to"); foreach ($address_headers as $address_header => $addresses) { if (empty($addresses)) { continue; } foreach ((array) $addresses as $address) { try { // Break $recipient into name and address parts if in the format "Foo " $recipient_name = ""; if (preg_match("/(.*)<(.+)>/", $address, $matches)) { if (count($matches) == 3) { $recipient_name = $matches; $address = $matches; } } switch ($address_header) { case "to": $phpmailer->addAddress($address, $recipient_name); break; case "cc": $phpmailer->addCc($address, $recipient_name); break; case "bcc": $phpmailer->addBcc($address, $recipient_name); break; case "reply_to": $phpmailer->addReplyTo($address, $recipient_name); break; } } catch (phpmailerException $e) { continue; } } } // Set to use PHP"s mail() $phpmailer->isMail(); // Set Content-Type and charset // If we don"t have a content-type from the input headers if (! isset($content_type)) { $content_type = "text/plain"; } /** * Filters the wp_mail() content type. * * @since 2.3.0 * * @param string $content_type Default wp_mail() content type. */ $content_type = apply_filters("wp_mail_content_type", $content_type); $phpmailer->ContentType = $content_type; // Set whether it"s plaintext, depending on $content_type if ("text/html" == $content_type) { $phpmailer->isHTML(true); } // If we don"t have a charset from the input headers if (! isset($charset)) { $charset = get_bloginfo("charset"); } // Set the content-type and charset /** * Filters the default wp_mail() charset. * * @since 2.3.0 * * @param string $charset Default email charset. */ $phpmailer->CharSet = apply_filters("wp_mail_charset", $charset); // Set custom headers if (! empty($headers)) { foreach ((array) $headers as $name => $content) { $phpmailer->addCustomHeader(sprintf("%1$s: %2$s", $name, $content)); } if (false !== stripos($content_type, "multipart") && ! empty($boundary)) { $phpmailer->addCustomHeader(sprintf("Content-Type: %s;\n\t boundary=\"%s\"", $content_type, $boundary)); } } if (! empty($attachments)) { foreach ($attachments as $attachment) { try { $phpmailer->addAttachment($attachment); } catch (phpmailerException $e) { continue; } } } /** * Fires after PHPMailer is initialized. * * @since 2.2.0 * * @param PHPMailer $phpmailer The PHPMailer instance (passed by reference). */ do_action_ref_array("phpmailer_init", array(&$phpmailer)); // Send! try { return $phpmailer->send(); } catch (phpmailerException $e) { $mail_error_data = compact("to", "subject", "message", "headers", "attachments"); $mail_error_data["phpmailer_exception_code"] = $e->getCode(); /** * Fires after a phpmailerException is caught. * * @since 4.4.0 * * @param WP_Error $error A WP_Error object with the phpmailerException message, and an array * containing the mail recipient, subject, message, headers, and attachments. */ do_action("wp_mail_failed", new WP_Error("wp_mail_failed", $e->getMessage(), $mail_error_data)); return false; } }

Один из основных «компонентов» любого веб-приложения – это возможность посылать почтовые сообщения — е-мейл.

Однако это не означает, что каждое приложение использует свой собственный почтовый клиент. (Хотя люди, конечно, создают свои).

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

Понятие E-mail

Перед тем, как мы углубимся в то, что WordPress API может предложить для отсылки писем, редактирования их настроек и подобных вещей, важно знать пару важных моментов об e-mail.
А именно, важно понять, как работают компоненты, которые создают само письмо, а это нечто большее, чем только адрес, тема и содержание. Существуют некоторые технические нюансы, которые следует уяснить, прежде чем приступать к созданию собственных писем.

«Шапка» электронного письма содержит минимум информации: от кого и кому письмо было отправлено. Также можно встретить и другие сведения. Например, время, когда письмо было послано или получено.

Когда мы работаем с программой WordPress, отправитель письма назначается по умолчанию. Если он не указан, то адрес отправителя принимает вид «wordpress@domain . com »

Если вы хотите установить другой адрес «ответа», например «[email protected] », то такая возможность доступна в настройках.

Лучше всего работать с оглавлениями, используя массивы.

Тип MIME

Когда придет время указывать формат отправки письма, вы, вероятно, увидите два альтернативных формата:

  • Plain text

Вы привыкли видеть HTML в большинстве современных e-mail клиентов, однако, если у вас упрощенный клиент, или он настроен на отображение только обычного текста, или вы читаете письмо на дисплее старого телефона, то содержимое будет отображаться в Plain text.

Программа WordPress соответственно позволяет отправлять письма как в формате HTML, так и в формате Plain Text.

После того, как мы взглянем на пример, где показано, как программно отправлять электронные письма, нами будет тщательно изучено все происходящее. Вкратце, существует определенный «хук», который значительно все упрощает, однако мы не увидим его в действии, пока не разберемся со всеми необходимыми фрагментами письма.

Вложения (Attachments)

Как известно, вложением является любой файл, прикрепленный к основному письму, отправленный получателю вместе с текстом.

Дело в том, что существуют некоторые нормы и правила отсылки электронного письма с вложением, и они не обязательно предусмотрены в приложении. Вместо этого, сервера, почтовые клиенты устанавливают свои ограничения на определенные виды входящих файлов.

Например:

  • Некоторые клиенты не допускают отправку/получение файлов формата ZIP и EXE (т.е. архивы и исполнительные файлы)
  • Большинство сервисов имеют лимит по размеру прикрепленного файла.
  • Определенные типы писем могут быть помечены как спам автоматически (основываясь на вложениях и содержимом тексте)

Разумеется, правила изменить мы не можем. Но стоит знать ограничения тех, кому мы отправляем письма, и оставаться в установленных рамках. Но не стоит волноваться! Отправить е-мейл в соответствии с данными условиями и заданными целями в программе WordPress не составит труда!

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

«Кому», «Тема», «Сообщение»

В большинстве случаев e-mail состоит из трех основных пунктов: «кому» (адрес электронной почты получателя), «Тема» и «Сообщение» (основной текст).

В WordPress достаточно легко работать с данной информацией. Достаточно всего лишь обеспечить каждую «графу» своей строчкой.

Разумеется, если вы хотите отправить сразу несколько писем, то можно как повторять отсылку е-мейла желаемое количество раз, отправляя по одному письму каждому пользователю, так и использовать массив из адресов получателей в WordPress Mail API , тогда письмо отправиться всем, кто был включен в этот массив.

И запомните! Если вы хотите изменить стандартный reply - to (ответный) адрес на свой, загляните в «Оглавление».

Использование WordPress Email API

Мы рассмотрели все основные моменты и готовы приступить к основной части статьи, а то есть, к изучению WordPress Email API.

Если разобраться, весь функционал по этой теме сосредоточен в функции wp_mail, однако существуют еще некоторые «хуки», о которых нам тоже следует знать, если мы хотим использовать все преимущества системы.

Основные «Хуки»

  • wp _ mail _ content _ type позволяет установить тип MIME исходящего письма
  • wp _ mail _ from – это фильтр, с помощью которого можно установить электронный адрес отправителя, не прибегая к массиву $headers .
  • wp _ mail _ from _ name – фильтр с аналогичной функцией, но для указания имени отправителя (также без использования массива $headers.)
  • wp _ login – Хук, который мы будем использовать для демонстрации, посылая е-мейл человеку, когда тот авторизируется в приборной панели WordPress.

Для полноты картины, я поделюсь своим кодом ниже, и вы сможете увидеть все, что мы сейчас разобрали, в действии, тем самым изучить, как это все работает.


"; $message .= "Your account has been created. Your login information is below:"; $message .= "
"; $message .= "

    "; $message .= "
  • Username: " . $input["email-address"] . "
  • "; $message .= "
  • Password: " . $password . "
  • "; $message .= "
"; $message .= "
"; $message .= "You can login to the application here."; add_filter("wp_mail_content_type", create_function("", "return "text/html";")); add_filter("wp_mail_from", "acme_mail_from"); add_filter("wp_mail_from_name", "acme_mail_from_name"); wp_mail($input["email-address"], "Your Acme Account Has Been Created!", $message, array()); } function acme_mail_from($email) { // NOTE: replace with @. This was causing problems with the syntax highlighter. return "donotreplyacme.com"; } function acme_mail_from_name($name) { return "The Acme Company"; }

< ? php

function acme_email_individual ($ input ) {

* Note: assume that $input has keys for "email-address".

// Generate the password

$ password = wp_generate_password (12 , false ) ;

// Email the user that they"re profile was created

$ message . = "

" ;

$ message . = "Your account has been created. Your login information is below:" ;

$ message . = "
" ;

$ message . = "

    " ;

    $ message . = "

  • Username: " . $ input [ "email-address" ] . "
  • " ;

    $ message . = "

  • Password: " . $ password . "
  • " ;

    $ message . = "

" ;

$ message . = "
" ;

add_filter ("wp_mail_content_type" , create_function ("" , "return "text/html";" ) ) ;

add_filter ("wp_mail_from" , "acme_mail_from" ) ;

// Generate the password = Генерируем пароль

// Email the user that they"re profile was created = Отправляем письмо пользователю, аккаунт которого был создан

// NOTE: replace with @. This was causing problems with the syntax highlighter = Обратите внимание! Надо замените [ at ] на «@». (Это бы вызывало проблемы с выделением синтаксиса)

Разбор кода должен все прояснить. После написания основной информации мы, используя плюсы предусмотренных в программе «хуков», создаем «strings» (строки) как аргументы и, в конце концов, вызываем саму функцию wp_mail .

Однако заметьте, что мы допускаем использование пустых массивов для некоторых аргументов $headers . А все потому, что у нас есть пользовательский фильтр для указания «From Name »(Имени отправителя) и “From Address ”(Адреса отправителя)

Этот метод не является однозначно лучше, чем альтернативный. Однако теперь мы видим, что существует несколько способов осуществить поставленную задачу.

Если на вашем сайте открытая регистрация или есть форум с оповещениями, то сайт наверняка отправляет немало писем по электронной почте. Все они, по умолчанию, отправляются через стандартный системный транспорт. Такой простой подход не требует дополнительных настроек, а письма отправляются весьма быстро. Однако, это накладывает и серьезные недостатки.

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

В большинстве случаев решением может стать отправка писем через сторонние сервисы, например Gmail или Яндекс почта для домена (ПДД). Также можно настроить отправку писем через ваш собственный почтовый сервер, который, как правило, есть даже на самом простом веб-хостинге.

Минусы отправки писем через системный транспорт

Как было отмечено выше, отправка писем в WordPress, по умолчанию, работает без дополнительных настроек, но цена этому весьма высока.

Письма могут попадать в спам

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

Письмо, отправленное через системный транспорт, не содержит дополнительных электронных подписей, которые могут свидетельствовать о надежности и легитимности отправителя..

Отправка писем через почтовый сервис позволит автоматически добавлять DKIM-подписи, свидетельствующие о надежности и легитимности отправителя. Отправляющие сервера (SMTP-серверы) Яндекс Почты и Gmail автоматически добавляют DKIM-подписи к каждому письму. С ними лишь владелец домена (и закрытого ключа DKIM) может отправлять письма с верными DKIM-подписями.

DKIM-подписи не отменяют того, что кто-то другой сможет отправить письмо используя ваш адрес (admin@сайт), но принимающий почтовый сервер будет видеть, что письмо отправил кто-то другой, а не владелец домена.

SPF-записи устанавливаются в настройках домена (DNS) и позволяют владельцу домена показать почтовым сервисам с каких серверов могут отправляться письма этого домена. Каждый почтовый сервис предлагает свою собственную SPF-запись со своим списком серверов. Если вы отправляете письма через Яндекс почту и делаете рассылки через Mailchimp, то необходимо совместить их SPF-записи в одну.

Письма могут пропадать

Еще один прием, который используется почтовиками для отсеивания плохих писем — это Greylisting. Здесь, в момент отправки письма, получающий сервер может ответить вашему сайту что-то вроде «я сейчас занят, зайди с этим письмом минут через десять». Сайт не знает что делать в таком случае — письмо было передано для отправки, на этом все, поэтому отправляемое письмо просто пропадет и не будет доставлено адресату.

Если ваше письмо отправляется почтовым сервисом, то ваш отправляющий сервер скажет «окей, гугл», отложит письмо в очередь неотправленной почты и будет пытаться доставить его еще несколько раз. Расчет прост — при отправке огромного количества почты за короткий промежуток времени, как это обычно делают спамеры, нет времени пытаться доставить письмо несколько раз.

Не дойти письмо может и в случае, если получающий сервер просто на время выключен или потерял доступ к сети. Поэтому отправка писем через SMTP более надежная.

Отправка писем через SMTP

Принципиальной разницы между отправкой через внешний почтовый сервис (Яндекс Почта, Gmail) или свой собственный SMTP-сервер нет. Это одно и тоже. Но если вы решили использовать свой собственный или выделенный хостингом SMTP-сервер, следует внимательно отнестись к его настройкам. Не забудьте установить правильные DKIM- и SPF-записи в настройках домена.

Google и Яндекс не запрещают отправку писем через свои сервера подобным образом, но имеют некоторые ограничения на количество отправляемых сообщений в день. Например, Gmail имеет явно указанное ограничение в 2000 писем в день . Яндекс не сообщает конкретных цифр, а служба поддержки намекнула, что этот показатель динамический.

Заметим, что на многих хостинг-площадках подключения к внешним серверам блокируются (информацию можно получить в поддержке хостинга или с помощью команды telnet). В этом случае можно попросить поддержку хостинга разрешить подключения. Иногда такие просьбы могут принять во внимание. Или использовать внутренний почтовый сервер предоставляемый хостинг-провайдером. Как правило, он будет работать даже быстрее, чем внешний, потому что обычно располагается на том же физическом сервере, что и ваш сайт (веб-сервер).

На личном опыте было замечено, что Яндекс Почта для домена не сохраняет письма отправленные через SMTP-сервер в папке исходящих сообщений, а Gmail сохраняет.

Плагин WP Mail SMTP

Все письма в WordPress отправляются с помощью функции wp_mail() , которая работает на популярной библиотеке PHP Mailer. Чтобы позволить WordPress и wp_mail() отправлять письма через SMTP-сервер необходимо установить и настроить плагин WP Mail SMTP из официальной директории WordPress.org.

Активировав плагин, перейдите в раздел Настройки → Email в панели управления.

Займемся настройкой на странице Advanced Email Options. Ниже указано описание и необходимые значения для каждого пункта.

From Email — адрес, с которого будут отправляться письма и на который получатель отправит ответ, нажав на кнопку «Ответить» в своей почте.

From Name — имя отправителя, можно указать название сайта или свое имя и фамилию.

Mailer — отправка писем через системный транспорт (функция mail()) или через SMTP-сервер. Выбираем «Send all WordPress emails via SMTP».

SMTP Host — адрес SMTP-сервера. Можно узнать у службы поддержки или в справочном разделе. Для Яндекс Почты используйте smtp.yandex.ru , для Gmail — smtp.gmail.com .

SMTP Port — порт SMTP-сервера, зависит от типа шифрования (Encryption). Для Яндекс Почты и Gmail используйте порт 465 .

Encryption — тип шифрования. Для Яндекс почты и Gmail необходимо установить «Use SSL encryption».

Authentication — требуется ли выполнять авторизацию на почтовом сервере. Устанавливаем «Yes: Use SMTP authentication».

Username — логин от почты. Как правило, полный адрес почтового ящика, должен совпадать со значением, указанным в поле From Email.

Password — пароль от почтового ящика.

Сохранив настройки, можно отправить тестовое письмо. Для этого введите адрес своего ящика и нажмите кнопку «Send Test». На указанный адрес будет отправлено небольшое письмо, а на экране появится служебная информация с результатами. Проверьте, пришло ли письмо на указанный адрес? Если нет, то что-то настроено неправильно и WordPress не сможет отправлять письма.

С помощью полученного тестового письма можно проверить корректно ли настроены DKIM и SPF. Для этого откройте исходный код письма. В Gmail это называется «Show Original». В Яндекс Почте «Свойства письма».

В заголовках письма должна содержаться строка «Authentication-Results». Если DKIM и SPF настроены правильно, то вы увидите spf=pass и dkim=pass .

Authentication-Results: mx.google.com; spf=pass (google.com: domain of [email protected] designates 2a02:6b8:0:1630::18 as permitted sender) [email protected]; dkim=pass [email protected]

Яндекс почта показывает зеленую галочку рядом с письмом, если DKIM-подпись верна.

Полезные материалы и заключение

Отправление писем через SMTP-сервер более надежный и правильный способ доставлять письма. Чтобы использовать SMTP не обязательно разбираться с настройкой и администрированием почтовых серверов. Сервисы Яндекса и Google хорошо справляются с поставленной задачей и для небольшого проекта это то, что надо.

Настройка DKIM и SPF — тема для отдельной статьи. Руководства по настройке, как правило, можно найти в справочных разделах почтовых сервисов или узнать у службы поддержки хостинг-провайдера.

В популярной системе управления хостингом cPanel настройки почты вынесены в раздел «Почта». На вкладке «Проверка подлинности электронной почты» можно управлять настройками DKIM и SPF.

  • Синтакс SPF-записей на официальном сайте.
  • Настройка DKIM-подписей и SPF-записей в Google Apps.
  • SPF для ПДД . DKIM-ключ для ПДД можно получить на странице настроек в Яндексе.