如何在 Windows 上对 PHPMailer/OpenSSL TLS SMTP 进行故障排除?

Posted

技术标签:

【中文标题】如何在 Windows 上对 PHPMailer/OpenSSL TLS SMTP 进行故障排除?【英文标题】:How to troubleshoot PHPMailer/OpenSSL TLS SMTP on Windows? 【发布时间】:2019-06-30 01:35:45 【问题描述】:

我在 Windows 上的 XAMPP 上使用 OpenSSL 运行 phpMailer。

我在与我们的邮件网关建立 TLS 加密的 SMTP 连接时遇到问题。

我已开启SMTP transcript debugging for PHPMailer。成绩单不是超级信息 IMO:

[06-Feb-2019 13:48:08 timezone/redacted] SERVER -> CLIENT: 220 redactedmailserver.example.com ESMTP Postfix

[06-Feb-2019 13:48:08 timezone/redacted] CLIENT -> SERVER: EHLO redactedclientname

[06-Feb-2019 13:48:08 timezone/redacted] SERVER -> CLIENT: 250-redactedmailserver.example.com
250-SIZE 52428800
250-ETRN
250-STARTTLS
250-AUTH CRAM-MD5 PLAIN LOGIN DIGEST-MD5
250-AUTH=CRAM-MD5 PLAIN LOGIN DIGEST-MD5
250-ENHANCEDSTATUSCODES
250 8BITMIME

[06-Feb-2019 13:48:08 timezone/redacted] CLIENT -> SERVER: STARTTLS

[06-Feb-2019 13:48:08 timezone/redacted] SERVER -> CLIENT: 220 2.0.0 Ready to start TLS

[06-Feb-2019 13:48:08 timezone/redacted] SMTP Error: Could not connect to SMTP host.
[06-Feb-2019 13:48:08 timezone/redacted] CLIENT -> SERVER: QUIT

[06-Feb-2019 13:48:08 timezone/redacted] SERVER -> CLIENT: 
[06-Feb-2019 13:48:08 timezone/redacted] SMTP ERROR: QUIT command failed: 
[06-Feb-2019 13:48:08 timezone/redacted] SMTP Error: Could not connect to SMTP host.
[06-Feb-2019 13:48:08 timezone/redacted] SMTP Error: Could not connect to SMTP host.

文字记录至少证明了错误信息具有误导性; PHPMailer is 成功连接到 SMTP 服务器,但 STARTTLS 出现问题。不过,错误消息和脚本没有提示具体的 TLS 问题可能是什么。

a closed issue on the PHPMailer Github 中描述了类似的症状,但那里的问题解决涉及使用 OpenSSL 命令行客户端对连接进行故障排除,如PHPMailer troubleshooting page 中所述。此页面提供了有关how to test the underlying OpenSSL connection outside of the PHP context 的一些说明,其中应详细说明连接可能失败的原因。它说运行以下命令:

echo QUIT | openssl s_client -starttls smtp -crlf -connect redactedemailserver.example.com:587

我想这适用于 Linux 上的 bash,但我在 Windows 上运行 XAMPP。我尝试运行一个希望等效的 PowerShell 命令:

echo QUIT | C:\xampp\php\extras\openssl\openssl.exe s_client -starttls smtp -crlf -connect redactedemailserver.example.com:587

但似乎什么也没发生。重新出现一个新的 PowerShell 提示符,并且 openssl 没有明显的输出。

我还尝试在没有echo QUIT | 的情况下运行该命令。不过,什么也没发生。

在 Windows 上,我可以使用哪些 PowerShell/openssl.exe 命令来确定 STARTTLS 失败的原因?

版本号:

XAMPP 7.1.7 PHP 7.1.7 PHPMailer 6.0.6 OpenSSL 1.0.2l

【问题讨论】:

我用 PHPMailer (php.net/manual/en/context.ssl.php) 的 SMTPOptions 属性做了一些蛮力实验。如果我设置verify_peer_name => false,则 STARTTLS 有效。我仍然想知道如何在 Windows 上获得详细的 OpenSSL 证书诊断信息,这样我就可以确切地弄清楚为什么证书对等名称没有成功验证。 一个写得很好的问题,谢谢!不幸的是,关于在 Windows 上诊断 OpenSSL,我没有什么要补充的。 【参考方案1】:

XAMPP 7.1.7 包含两个 openssl.exe 副本。

位于C:\xampp\php\extras\openssl 的副本不起作用。从 PowerShell 启动时,没有任何反应。从命令提示符启动时,会出现一个错误消息框,上面写着The ordinal 4070 could not be located in the dynamic link library。这似乎可能是result of a bad build。

但是,位于C:\xampp\apache\bin 的副本按照 PHPMailer 故障排除指南中的说明工作。

所以我最初的问题的答案是只运行故障排除指南中给出的命令,但使用未损坏的 openssl.exe 副本:

echo QUIT | C:\xampp\apache\bin\openssl.exe s_client -starttls smtp -crlf -connect redactedemailserver.example.com:587

【讨论】:

以上是关于如何在 Windows 上对 PHPMailer/OpenSSL TLS SMTP 进行故障排除?的主要内容,如果未能解决你的问题,请参考以下文章

在 Windows 7 上对音频文件使用 u-law 压缩

如何在 Mac 的 Dock 上对应用程序的多个窗口进行分组

如何在 PHPMailer 中指定 SMTP 服务器?

如何在 phpmailer 中嵌入图像 - 我做不到,为啥?

如何在 xampp 上使用 phpmailer 发送邮件

如何在 PHPMailer 主题字段中插入图标​​或图像