SeoLik

20 апреля 2020, 18:42
1122

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

В нашей статье рассмотрим настройку SPF, DKIM, DMARC и PTR записи на примере хостинга Beget.

 

У нас есть сайт cost-site.com (сайт может быть поддоменом, или сайт вида site.com или www.new.site.com и тд).

Задача: отправлять email письмо, средствами php mail() и при этом чтобы письмо проходило проверки и не попадало в спам в почтовых сервисах ( Яндекс, Gmail и тд).

Обратите внимание, что даже если вы настроите все как в нашей инструкции это не 100% гарантия того что письма не будут попадать в спам, но вероятность такого попадания в разы меньше.

 

И так начинаем!

Технология DKIM (DomainKeys Identified Mail) обеспечивает верификацию отправителя и гарантию целостности доставленного электронного сообщения. Подтверждение пользователя происходит на основе электронной подписи письма, создаваемой с применением асимметричной криптографии. Данная подпись добавляется в служебные заголовки письма и передается незаметно для конечного пользователя.

Открываем DKIM генератор

dkim генератор

Заполняем форму и нажимаем кнопку Создать ключи. В качестве "Селектора" напишем текст mail (можно любой).

dkim

Инструмент генерирует нам Приватный и Публичный DKIM ключи, а также TXT запись и TXT значение. Не закрываем страницу с данным инструментом и скачиваем все эти данные, нажав кнопку "Скачать все в ZIP".

dkim private 

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

pem ключи

На странице с DKIM генератором скопируем параметр TXT значение

Теперь переходим в панель управления хостингом. И открываем раздел для настройки DNS.

хостинг панель управления dns

Выбираем из списка наш домен.

И в разделе Быстрое добавление создаем TXT запись вида mail._domainkey.cost-site.com где mail это наш селектор выбранный при генерации DKIM ключей (вместо mail там мог быть любой текст, например info, ggg и тд) со значением которое мы скопировали в буфер обмена на странице генератора DKIM.

Теперь добавим TXT запись вида _domainkey.cost-site.com со значением o=-

o=-
Означает "все сообщения с этого домена подписываются"

o=~
Означает "некоторые сообщения с этого домена подписываются"

_domainkey

Далее добавим DMARC TXT запись вида _dmarc.cost-site.com со значением v=DMARC1; p=none; ruf=mailto:info@cost-site.com

info@cost-site.com почта на которую будут приходить отчеты

dmarc

SPF запись оставляем без изменений, так как отправка писем будет идти с сервера Beget. Подробнее о SPF записи можно почитать тут и тут

spf запись

 

Проверим результат наших стараний с помощью инструмента Проверка SPF, DKIM, DMARC записей

Заполним поля формы нашими значениями и нажмем кнопку Анализ

Проверка SPF, DKIM, DMARC записей

Результат должен быть следующим

Теперь нам понадобится компонент  PHPMailer. Скачать его можно на GitHub. Рекомендуем использовать версию 6.1.5. Данную версию вы можете скачать и с нашего сайта по этой ссылке

Извлекаем файлы из архива. Создаем в корне сайта папку PHPMailer. Копируем в нее ранее извлеченные файлы. 

PHPMailer

 

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

Для тестирования наших писем мы воспользуемся сервисом https://www.mail-tester.com/. При переходе по ссылке вы увидите тестовую почту на которую нам нужно отправить письмо. А после отправки нажать кнопку "Затем проверьте оценку"

mail-tester

 

Как отправить подписанное DKIM письмо с сайта

Создаем файл test_mail.php в корне сайта со следующим содержанием:

error_reporting(E_ALL);
ini_set('display_errors', true);
ini_set('error_reporting',  E_ALL); 

use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

require $_SERVER['DOCUMENT_ROOT'].'/PHPMailer/src/Exception.php';
require $_SERVER['DOCUMENT_ROOT'].'/PHPMailer/src/PHPMailer.php';
//require $_SERVER['DOCUMENT_ROOT'].'/PHPMailer/src/SMTP.php';


$mail = new PHPMailer;
$mail->setFrom('noreply@cost-site.com', 'MyNameCompany');
$mail->addAddress('test-pep9y46d2@srv1.mail-tester.com', ''); // куда отправить письмо, укажите нужный email
$mail->CharSet = 'UTF-8';
$mail->Subject  ='Тестовое письмо с dkim подписью';
$mail->Body     = 'Текст нашего письма без HTML разметки'; // письмо без html 
$mail->IsHTML(true);
$mail->msgHTML('<strong>Текст нашего письма с HTML разметкой</strong>' ); // письмо с html


$mail->DKIM_domain = 'cost-site.com';
$mail->DKIM_private = $_SERVER['DOCUMENT_ROOT'].'/dkim_private.pem';
$mail->DKIM_selector = 'mail'; //Наш селектор
$mail->DKIM_identity = $mail->From;

if ($mail->send()) {
 echo 'Письмо успешно отправлено!';
} else {
 echo 'Ошибка: '. $mail->ErrorInfo;
}

 

Переходим по ссылке https://cost-site.com/test_mail.php и видим текст "Письмо успешно отправлено!" Смотрим оценку на mail-tester.com.

проверка письма

Внимание! Также возможно во время оценки будет сообщение что вам нужно настроить PRT запись! Для этого, вам нужно написать в поддержку хостинга и попросить его установить PTR запись для вашего домена. Но для этого у вас на аккаунте должен быть выделенный ip и ваш домен должен быть на этом выделенном IP. Хостинг может спросить какова цель добавления PRT запись, в ответ укажите что вам нужно чтобы при проверке на сайте https://www.mail-tester.com был максимальный результат.

А чтобы проверить наличие PRT записи у нас на SeoLik для этого тоже есть инструмент.