我正在尝试使用 PHP 通过 IMAP 访问 Outlook 邮件服务器。由于这没有按预期工作并且错误消息没有帮助,我查找了测试基本连接的方法并遇到了以下代码行:
openssl s_client -connect outlook.office365.com:993
据说,这应该让我使用加密连接连接到邮件服务器,以便我可以发出一些命令来实际登录等。
但是,该命令仅生成以下输出:
CONNECTED(00000003)
write:errno=104
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 0 bytes and written 313 bytes
Verification: OK
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
Early data was not sent
Verify return code: 0 (ok)
---
我尝试研究错误消息 (
write:errno=104
),这导致了一些建议,例如使用 -tls1_2
参数强制执行 TLSv1.2,但这两者都没有任何区别。
有人能指出我正确的方向吗?我已经使用最新版本的 OpenSSL 在 Ubuntu 和 Windows 10 上运行了此命令。
我可以使用您的命令进行连接,但在连接时我需要使用
\r\n
选项强制 -crlf
行结束字符,以便能够键入命令并使服务器识别它们。
您还可以添加
-quiet
来减少输出量:
openssl s_client -connect outlook.office365.com:993 -crlf -quiet
但是,在您的情况下,连接似乎正在重置。这意味着存在某种网络问题。防火墙可能会阻止您访问
993
上的 outlook.office365.com
端口。例如如果您通常必须通过代理服务器进行连接,则可能会出现这种情况。
最新版本的
openssl s_client
有一个-proxy
选项,但似乎不允许指定代理用户名和密码。此外,即使您不需要向代理服务器进行身份验证,它也可能无法与您的代理一起使用。一种解决方法可能是使用 http://ntlmaps.sourceforge.net/。我过去曾尝试过,但已经是 15 年前的事了。
您也可以尝试使用
cURL
的 IMAP 支持而不是 openssl s_client
,因为它具有更好的代理支持。
另一种可能性是连接到端口
143
并使用 STARTTLS
而不是连接到端口 993
。显然,如果端口 993
被防火墙屏蔽,那么端口 143
也可能被防火墙屏蔽,但在您的情况下,它似乎是允许的:
openssl s_client -connect outlook.office365.com:143 -starttls imap -crlf -quiet
如果您位于代理后面并且无法直接连接到 IMAP 服务器,那么您还可以使用类似 EmailEngine 之类的东西来处理连接本身并允许通过 REST API 访问邮箱内容。
我们看到此错误是因为
outlook.office365.com
正在解析服务器上的 ipv6 地址。我们必须更新防火墙规则以包含服务器的 ipv6 地址以允许此流量,并且它开始正常工作。