почта DNS DKIM SPF и т.д.

Разбираемся с отправкой почты с нашего сервера kkmspb.ru через phpMailer. Наш сайт находится на хостинге infobox.

Почта нашего домена kkmspb.ru делегирована на Яндекс.

Как сделать так ,чтобы почта отправляемая через smtp сервер яндекса приходила к получателю как шифрованная и подписанная и НЕ попадала в спам.

SOA Start of Authority
в SOA указываются NS-сервера являющиеся авторитетными для данной зоны

DKIM DomainKeys Identified Mail
SPF Sender Policy Framework

По инструкции яндекса надо на DNS прописать следующие опции:

Тип записи Имя поддомена Приоритет Значение
MX @ 10 mx.yandex.net.
TXT (SPF) @ не указывается v=spf1 redirect=_spf.yandex.net
TXT (DKIM) mail._domainkey не указывается Скопируйте значение из настроек Почты
CNAME mail не указывается domain.mail.yandex.net.

Сделали эти записи , ждем пару дней, пока все dns сервера обменяются информацией. То есть наши dns нашего провайдера типа ns1.infobox.org должны обменяться с основными серверами google 8.8.8.8 и т.д.

И вот тут начинается полное не понимание что , кому , куда прописывать. Чего потом ждать ... И самое главное как проверить пересылку почты...

Первый рабочий вариант случился , когда мы ушли от яндекс и ушли от infobox, что имеется ввиду:

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

Так вот то , что яндекс предлагает вам добавить в DNS TXT это открытый ключ, но как получить у яндекса его пару - закрытый ключ, с которым вам надо работать в коде phpMailer вашего сайта. Яндекс его не предоставляет естественно.

А надо ли вам это, если вы можете сгенерировать сами эту пару ключей например на сайте https://dkimcore.org. Там все расписано , за пару часов разберетесь.

Главное обратите внимание на слово селектор, dkimcore.org автоматом вам его генерирует , а пароль генерируется банально пустой.
privatekey.txt - закрытый ключ сгенерированный dkimcore.org. Наш работающий вариант php :


<?php
use PHPMailerPHPMailerPHPMailer;
use PHPMailerPHPMailerException;

require_once($_SERVER["DOCUMENT_ROOT"].'/lk/PHPMailer_6.2/src/Exception.php');
require_once($_SERVER["DOCUMENT_ROOT"].'/lk/PHPMailer_6.2/src/PHPMailer.php');
require_once($_SERVER["DOCUMENT_ROOT"].'/lk/PHPMailer_6.2/src/SMTP.php');

// PHP Version 7.1.33

$mail_ = new PHPMailer(true);

try 
{
	$mail_->SMTPAuth = true;
	$mail_->Host = 'ssl://smtp.kassovye-apparaty.ru';
	$mail_->Username = 'p@kassovye-apparaty.ru';
	$mail_->Password = "......";
	$mail_->CharSet = "utf-8";
	
	//$mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS; // Enable TLS encryption; `PHPMailer::ENCRYPTION_SMTPS` encouraged
	$mail->SMTPSecure = 'ssl';
	//$mail_->Port = 587;
	$mail_->Port = 465;


	$email="you-email@gmail.com";
	
	$mail_->setFrom("p@kassovye-apparaty.ru","kassovye-apparaty.ru");
	$mail_->addAddress($email, 'dear friend'); // Add a recipient

	$mail_->isHTML(true);                                  // Set email format to HTML
	$mail_->Subject = "this is title for test";
	$mail_->Body    = "this is body";
	$mail_->AltBody = 'This is the body in plain text for non-HTML mail clients';
	
	$mail_->IsMail();
	$mail_->Encoding = 'base64';
	
	if( ! file_exists(dirname(__FILE__).'/privatekey.txt'))
	{
		echo '!file_exists '.dirname(__FILE__).'/privatekey.txt';
	}
	
	$mail_->DKIM_domain = 'kassovye-apparaty.ru';
	$mail_->DKIM_private = dirname(__FILE__).'/privatekey.txt'; // Make sure to protect the key from being publicly accessible!
	$mail_->DKIM_selector = '1623401940.apparaty';
	$mail_->DKIM_passphrase = '';
	$mail_->DKIM_identity = $mail_->From;

	
	$mail_->send();

	echo  "<h1>Письмо успешно отправлено на $email</h1>";
} 
catch (Exception $e) 
{
	echo  "<h1>Message could not be sent to $email</h1>";
}

?>


В получаемом письме на gmail.com удобно смотреть оригинал письма , там должно появиться запись примерно такого содержания:

DKIM: PASS, домен kassovye-apparaty.ru

Это означает , что письмо наше было корректно зашифровано и пописано. И яндекс тут не нужен оказывается для шифрования вашего письма.

Но надо добавить в DNS TXT запись вашей открытой части ключа:

1623401940.apparaty._domainkey.kassovye-apparaty.ru.

v=DKIM1;t=s;n=core;p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCwIvHN0MmOGRzQe8wVBGNk9G6GMShl0V4eoRZDYuuY3wYin5oD9qF+B2jQgFTgdzoMB081Gh7FAWmah9RjxX1GTUjuLfU20pdEbP1r8PPxfUOUsBIbm8fXVIBjDgX4xcJb9P93Pu52ZZtUbUtQm3/DLRBXznNVfYK84so2Yvp8uwIDAQAB

1623401940.apparaty - это тот самый селектор.

MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCwIvHN0MmOGRzQe8wVBGNk9G6GMShl0V4eoRZDYuuY3wYin5oD9qF+B2jQgFTgdzoMB081Gh7FAWmah9RjxX1GTUjuLfU20pdEbP1r8PPxfUOUsBIbm8fXVIBjDgX4xcJb9P93Pu52ZZtUbUtQm3/DLRBXznNVfYK84so2Yvp8uwIDAQAB - это открытый ключ.

Но есть еще нюанс - DNS сервер сайта kassovye-apparaty.ru расположен на reghouse.ru и там изменения вступают в силу минут через 40 , а не как обещано через 2-3 дня... На infobox я так и не смог настроить DNS.

.