如何使用 openssl 和 Microsoft Exchange Online 发送电子邮件?

如何使用 openssl 和 Microsoft Exchange Online 发送电子邮件?

Microsoft 在 Exchange Online 中禁用基本身份验证,我着手在我们的应用程序中添加对现代身份验证的支持。我们的应用程序发送基本的电子邮件警报。目前,我们使用 SMTP 基本身份验证或开放中继来实现这一点,但现代身份验证将是一个不错的补充。

为了全面了解该过程,我想手动完成整个电子邮件过程。我在 Microsoft 有一个开发租户,我已在其中注册了我们的应用程序。我获取具有电子邮件范围的 Oauth 令牌没有遇到任何问题。我无法完成与 SMTP 服务器的通信。

由于通信必须加密,我使用 openssl(而不是 telnet)。我使用以下命令连接到服务器:

openssl s_client -connect smtp.office365.com:587 -crlf -starttls smtp

围绕 SSL 协商有一些反馈,然后服务器做出响应:

250 SMTPUTF8

那时我认为我应该使用 EHLO 命令。然而,

EHLO

响应只是(服务器每次尝试都会发生变化)

' [AM4PR0101CA0056.eurprd01.prod.exchangelabs.com] 

此时我不确定该怎么做。我认为可能需要在 ehlo 命令后插入一些域(以识别要连接的 Microsoft 在线租户?)。但是,无论我插入什么域,响应始终是:

501 5.5.4 Invalid domain name [AM4PR0101CA0056.eurprd01.prod.exchangelabs.com]

有人能解释一下如何通过 OpenSSL 与 Microsoft Exchange Online 租户发起通信吗?我在 EHLO 后面应该放什么?我连接的地址是否正确?我只是想发出 AUTH XOAUTH2 命令来登录我的租户。

我已经能够在 Gmail 的 smtp 服务器 (smtp.gmail.com) 上完成整个过程。在那里,无论您在 ehlo 命令后添加什么,发出该命令后,您都会收到欢迎,并可以使用各种 AUTH 命令继续登录。

答案1

我的问题出在最初的命令中:

openssl s_client -connect smtp.office365.com:587 -crlf -starttls smtp

特别是 -crlf 标志 - 如果没有它,我可以在 EHLO 之后输入任何内容,并且仍然会受到 SMTP 服务器的欢迎并继续进行 AUTH。

该标志似乎与行尾有关,而 SMTP 服务器对此非常挑剔。因此,此命令对我有用:

openssl s_client -connect smtp.office365.com:587 -starttls smtp

我读过其他资料,提到添加此标志可以解决问题,对我来说,删除它就可以解决问题。我建议遇到同样问题的人尝试这两种方法。

答案2

EHLO是旧版本的“高级”继承者helo,旨在让您的 SMTP 客户端自我介绍。类似于说“你好!我是罗布,很高兴认识你。”您需要在 EHLO 后提供您自己的主机名。

RFC 5312

句法:

"EHLO" "(space)" "( Domain / address-literal )" "CRLF"

EHLO 命令中给出的域名必须是主主机名(解析为地址 RR 的域名),或者,如果主机没有名称,则必须是地址文字,如第 4.1.3 节所述,并在第 4.1.4 节的 EHLO 讨论中进一步讨论。

某些 SMTP 服务器实现比其他服务器更严格,要求客户端连接时正确实现 SMTP 协议。请注意,不良的 SMTP 实现通常会(显著)增加您的垃圾邮件分数。

相关内容