Office 365 的 SMTP 无法识别的认证类型

我遇到了这个错误,并尝试了许多不同的选项。使用的是 Office 365。

错误:504 5.7.4 无法识别的认证类型 [MN2PR20CA0010.namprd20.prod.outlook.com]

设置如下:

  DISCOURSE_SMTP_ADDRESS: smtp.office365.com
  DISCOURSE_SMTP_PORT: 587
  DISCOURSE_SMTP_USER_NAME: email
  DISCOURSE_SMTP_PASSWORD: "PASSWORD"
  DISCOURSE_SMTP_ENABLE_START_TLS: true

请先使用 openssl 工具测试您的配置

  1. 编码您的 Office365 用户
echo -n "your email here " | openssl enc -base64
xxx_encoded_email_xxx
  1. 编码您的密码
echo -n "your password here" | openssl enc -base64
xxx_encoded_password_xxx
  1. 打开连接
openssl s_client -connect SMTP.office365.com:587 -starttls smtp -quiet -crlf
  1. 测试身份验证
  • 等待消息 250 SMTPUTF8
  • 发送 EHLO SMTP.office365.com
  • 等待响应
    250-PR3P189CA0029.outlook.office365.com Hello [88.138.0.68]
    250-SIZE 157286400
    250-PIPELINING
    250-DSN
    250-ENHANCEDSTATUSCODES
    250-AUTH LOGIN XOAUTH2
    250-8BITMIME
    250-BINARYMIME
    250-CHUNKING
    250 SMTPUTF8
    
  • 发送 AUTH LOGIN
  • 等待 334 VXNlcm5hbWU6
  • 发送您编码后的用户登录名 xxx_encoded_email_xxx
  • 等待 334 UGFzc3dvcmQ6
  • 发送您编码后的密码 xxx_encoded_password_xxx
  • 等待响应 235 2.7.0 Authentication successful
3 个赞

那么,如果 openssl 测试通过,但使用这些设置时 discourse-doctor 执行的连接测试仍然失败,接下来该怎么办?尽管 openssl 测试成功,我的 Discourse 连接仍因 504 5.7.4 无法识别的认证类型而失败……推测它未能识别 LOGIN 认证方法。我尝试在 app.yml 文件中添加 DISCOURSE_SMTP_AUTHENTICATION: login,但这并未解决问题。

仅供参考,以下是我的发现。我进入了 Docker 镜像,开始折腾 lib/tasks/emails.rake 脚本和 config/discourse.conf 文件。几个小时后,在尝试了 smtp.office365.com 和 .mail.protection.outlook.com 的 AUTH login 和 AUTH plain 所有可能的组合后,我取消了 STMP 启动上方代码块的注释。

# 我们想这样做,但 Net::SMTP 在使用 starttls 时会出错
#Net::SMTP.start(smtp[:address], smtp[:port]) do |s|
#  s.starttls if !!smtp[:enable_starttls_auto] && s.capable_starttls?
#  s.auth_login(smtp[:user_name], smtp[:password])
#end

直接运行这段代码导致了读取超时。
将其修改为调用 new 而不是 start 后,发送成功。

Net::SMTP.new(smtp[:address], smtp[:port]) do |s|
    s.enable_starttls
    s.auth_login(smtp[:user_name], smtp[:password])
end

这是我第一次接触 Ruby、rake 及相关工具。我无法解释为什么它能工作,也不确定这是否是通用情况下的“好做法”。
J。

哦,另外,我始终无法在 25 或 587 端口上让 my_domain.mail.protection.outlook.com 正常工作,能用的只有 smtp.office365.com:587

1 个赞

我使用 socketlabs.com 作为邮件投递服务,也曾遇到过类似的问题。在我的情况下,解决方案是编辑 lib/tasks/emails.rake 文件,具体如下:
将以下行:
Net::SMTP.start(smtp[:address], smtp[:port], 'localhost', smtp[:user_name], smtp[:password])
修改为:
Net::SMTP.start(smtp[:address], smtp[:port], 'localhost', smtp[:user_name], smtp[:password], smtp[:authentication])

如果不进行此修改,DISCOURSE_SMTP_AUTHENTICATION: login 参数将不会被传递给底层的 SMTP 代码。

我尚未测试此修改后的代码是否适用于其他认证方式,但它已解决了使用 login 认证时的问题。

3 个赞

我可以确认,在 Net::SMTP.start 调用中添加 smtp[:authentication],并在 app.yml 中设置 DISCOURSE_SMTP_AUTHENTICATION: login,即可解决电子邮件测试页面的问题。

我认为常规邮件是通过 mail 库发送的,只要在 app.yml 中设置 DISCOURSE_SMTP_AUTHENTICATION: login,该库就能正常工作。

不过,我仍然认为应该对 lib/tasks/emails.rake 进行修补,以使用 DISCOURSE_SMTP_AUTHENTICATION 设置。这样可以省去一些不必要的调试工作。

1 个赞

在我看来这像是一个 :bug:。我已提交了一个 PR:

3 个赞

你好,

在我的当前版本中,上述代码已针对 Net::SMTP.start(smtp[:address], smtp[:port], 'localhost', smtp[:user_name], smtp[:password], smtp[:authentication]) 进行了修复,但问题依旧存在。

错误:504 5.7.4 无法识别的认证类型,来自 smtp.office365.com

有人有任何建议吗?

1 个赞

如何编辑 lib/tasks/emails.rake 脚本以实现此功能?

作为对该问题的总体更新,Microsoft 正在逐步移除 SMTP 和 POP3 的旧版身份验证,如果您使用 O365 作为邮件提供商,这将带来诸多不便。当前默认策略已禁止 SMTP AUTH,您需要按邮箱单独启用该功能。希望这能有所帮助——我昨天上午为此折腾了许久。

特别是关于 POP 的问题确实令人遗憾,除非 Discourse 为入站邮箱增加 IMAP 支持,否则配置入站邮件将变得更加困难。

1 个赞

有一个简单的解决方案可以接收包含收件容器的邮件。它以前被称为“直截了当”,但有人反对这个名字,于是它被更改了,而我再也找不到它了。

此外,还有 群组收件箱的 IMAP 支持。但它主要仅支持 Gmail。

3 个赞

无论如何,自行搭建邮件服务器都应被视为最后的手段。我记得这叫做“直接投递”,建议搜索一下这个术语。

2 个赞

截至 2023 年,exchange 中不再支持 pop3 身份验证。

1 个赞

如果您正在使用 PHPMailer
请尝试注释/删除该行并重试://$mail->isSMTP(true);