当我使用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 值包含 const 变量的值(字符串"tls"
) - 使用名称(PHPMailer::ENCRYPTION_STARTTLS
),因为如果不查看文档,该值本身无法解释其含义。
关于远程登录:使用简单的测试工具,例如远程登录是解决问题的好选择 - 但你不能telnet
在这里使用 - 这个程序(通常)不知道 TLS 加密。我喜欢使用附带的实用程序openssl反而:
openssl s_client -connect hostname:25 -starttls smtp
(是的,它甚至可以为您拼写STARTTLS
并以某种人类可读的方式显示连接参数)