使用 OpenSSL 测试与 Outlook 的 IMAP 连接

Test IMAP connection to Outlook using OpenSSL

我正在尝试使用 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,但两者都没有任何区别。

有人能指出我正确的方向吗?我已经在 Ubuntu 和 Windows 10 上使用最新版本的 OpenSSL 运行 此命令。

我可以使用您的命令进行连接,但我需要在连接时使用 -crlf 选项强制使用 \r\n 行结束字符,以便能够键入命令并让服务器识别它们。

也可以加上-quiet减少输出量:

openssl s_client -connect outlook.office365.com:993 -crlf -quiet

但是,在您的情况下,连接似乎正在重置。这意味着存在某种网络问题。可能有防火墙阻止您访问 outlook.office365.com 上的端口 993。例如如果您通常必须通过代理服务器进行连接,则可能会出现这种情况。

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.