.png)
Когда я используюPHPMailerДля отправки почты через Postfix я использую конфигурацию по умолчанию со следующими изменениями:
# SMTP from other servers to yours
smtpd_tls_key_file = /etc/postfix/myletsencryptcert.key
smtpd_tls_cert_file = /etc/postfix/myletsencryptcert.crt
smtpd_tls_CAfile = /etc/postfix/myletsencryptcert.crt
smtpd_tls_security_level = may
smtpd_tls_auth_only = yes
smtpd_tls_mandatory_protocols=!SSLv2,!SSLv3
smtpd_tls_protocols=!SSLv2,!SSLv3
smtpd_tls_loglevel = 1
smtpd_tls_session_cache_database =
btree:/var/lib/postfix/smtpd_tls_session_cache
Когда я использую эту конфигурацию и запускаюPHPMailer, он говорит, что соединение не удалось, сразу после выполнения STARTTLS
команды. МойPHPMailerКонфигурация - это
$mail = new PHPMailer(true);
$mail->isSMTP();
$mail->Host = 'localhost';
//$mail->SMTPAuth = true;
$mail->Username = '[email protected]';
//$mail->Password = 'passwordwhichissecretobviously';
$mail->SMTPSecure = 'tls';
$mail->Port = 25;
$mail->SMTPAutoTLS = false;
$mail->setFrom("[email protected]", "Some person");
$mail->addAddress("[email protected]");
$mail->isHTML(true);
$mail->Subject = "Web Development";
$mail->Body = "
Some random HTML message
";
$mail->AltBody = "some normal message without HTML";
$mail->XMailer = "0";
$mail->CharSet = 'UTF-8';
$mail->Encoding = 'base64';
$mail->DKIM_domain = 'example.com';
$mail->DKIM_private = '/right/path/to/dkimkey/which/works/properly/dkim.key';
$mail->DKIM_selector = 'default';
$mail->DKIM_passphrase = '';
$mail->DKIM_identity = $mail->From;
$mail->DKIM_copyHeaderFields = false;
И даже если я использую telnet и делаю это, я получаю после запуска команды STARTTLS.
Я обнаружил, что использование этого позволяет мне отправлять почту с помощьюPHPMailer:
$mail->SMTPOptions = array(
'ssl' => array(
'verify_peer_name' => false
)
);
Но я думаю, что это будет проблемой безопасности. Как еще я могу заставить это работать?
решение1
Проверка имени однорангового узла работает только в том случае, если имя однорангового узла известно.
Сделайте это известным, настроив имя сервера как Host
.
// this is a name not mentioned in the cert
$mail->Host = 'localhost';
// better: a full domain name
$mail->Host = 'mx8.mydomain.example';
У вас (должен) быть сертификат для имени вашего почтового сервера - сравнение этого имени в сертификате с localhost
недостаточно для определения соответствия сертификата. Любой почтовый клиент или тестовый инструмент, который хочет проверить ваш сертификат, должен знать имя, с которым он должен сравнивать.
Придирки:Значение SMTPSecure содержит значение константной переменной (строка "tls"
) — используйте имя ( PHPMailer::ENCRYPTION_STARTTLS
), поскольку само значение не объясняет его значения без изучения документации.
Отелнет: Использование простого инструмента тестирования, напримертелнетхороший выбор для выяснения проблем - но вы не можете использовать telnet
здесь - эта программа (обычно) не знает о шифровании TLS. Мне нравится использовать утилиту, включенную вopensslвместо:
openssl s_client -connect hostname:25 -starttls smtp
(да, он даже может продиктовать STARTTLS
вам и отобразить параметры соединения в более-менее понятной для человека форме)