Рано или поздно у больших проектов появляется задача отправлять не мало электронных писем своим пользователям. Конечно для этого можно использовать сторонние сервисы, которые есть и платные и бесплатные, но все же хотелось бы отправлять письма со своего сайта. Причем даже если сайт не на 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 генератор
Заполняем форму и нажимаем кнопку Создать ключи. В качестве "Селектора" напишем текст mail (можно любой).
Инструмент генерирует нам Приватный и Публичный DKIM ключи, а также TXT запись и TXT значение. Не закрываем страницу с данным инструментом и скачиваем все эти данные, нажав кнопку "Скачать все в ZIP".
Полученный архив сохраняем на ПК и распаковываем все файлы в нем, некоторые файлы из этого архива нам понадобиться позже.
На странице с DKIM генератором скопируем параметр TXT значение
Теперь переходим в панель управления хостингом. И открываем раздел для настройки DNS.
Выбираем из списка наш домен.
И в разделе Быстрое добавление создаем TXT запись вида mail._domainkey.cost-site.com где mail это наш селектор выбранный при генерации DKIM ключей (вместо mail там мог быть любой текст, например info, ggg и тд) со значением которое мы скопировали в буфер обмена на странице генератора DKIM.
Теперь добавим TXT запись вида _domainkey.cost-site.com со значением o=-
o=-
Означает "все сообщения с этого домена подписываются"
o=~
Означает "некоторые сообщения с этого домена подписываются"
Далее добавим DMARC TXT запись вида _dmarc.cost-site.com со значением v=DMARC1; p=none; ruf=mailto:info@cost-site.com
info@cost-site.com почта на которую будут приходить отчеты
SPF запись оставляем без изменений, так как отправка писем будет идти с сервера Beget. Подробнее о SPF записи можно почитать тут и тут
Проверим результат наших стараний с помощью инструмента Проверка SPF, DKIM, DMARC записей
Заполним поля формы нашими значениями и нажмем кнопку Анализ
Результат должен быть следующим
Теперь нам понадобится компонент PHPMailer. Скачать его можно на GitHub. Рекомендуем использовать версию 6.1.5. Данную версию вы можете скачать и с нашего сайта по этой ссылке
Извлекаем файлы из архива. Создаем в корне сайта папку PHPMailer. Копируем в нее ранее извлеченные файлы.
Теперь из архива скачанного со страницы генератора DKIM нам понадобится файл dkim_private.pem. Его нужно скопировать на наш сайт, но при этом нельзя чтобы доступ к нему могли получить третьи лица. В нашем примере данный файл мы скопируем в корень сайта.
Для тестирования наших писем мы воспользуемся сервисом https://www.mail-tester.com/. При переходе по ссылке вы увидите тестовую почту на которую нам нужно отправить письмо. А после отправки нажать кнопку "Затем проверьте оценку"
Создаем файл 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 для этого тоже есть инструмент.