
當我使用PHP郵件程式要透過 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
當我使用這個配置並運行時PHP郵件程式,在發出命令後立即顯示連線失敗STARTTLS
。我的PHP郵件程式配置是
$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 命令後得到。
我發現使用它可以讓我發送郵件PHP郵件程式:
$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 值包含 const 變數的值(字串"tls"
) - 使用名稱 ( PHPMailer::ENCRYPTION_STARTTLS
),因為如果不查看文檔,則該值本身無法解釋其含義。
關於遠端登入:使用簡單的測試工具,例如遠端登入是解決問題的一個不錯的選擇 - 但你不能telnet
在這裡使用 - 該程式(通常)不知道 TLS 加密。我喜歡使用包含的實用程序開放式SSL反而:
openssl s_client -connect hostname:25 -starttls smtp
(是的,它甚至可以為您拼出STARTTLS
並以某種人類可讀的方式顯示連接參數)