schap
1
我遇到了这个错误,并尝试了许多不同的选项。使用的是 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
evantill
(Eric Vantillard)
2
请先使用 openssl 工具测试您的配置
- 编码您的 Office365 用户
echo -n "your email here " | openssl enc -base64
xxx_encoded_email_xxx
- 编码您的密码
echo -n "your password here" | openssl enc -base64
xxx_encoded_password_xxx
- 打开连接
openssl s_client -connect SMTP.office365.com:587 -starttls smtp -quiet -crlf
- 测试身份验证
3 个赞
JMadd
3
那么,如果 openssl 测试通过,但使用这些设置时 discourse-doctor 执行的连接测试仍然失败,接下来该怎么办?尽管 openssl 测试成功,我的 Discourse 连接仍因 504 5.7.4 无法识别的认证类型而失败……推测它未能识别 LOGIN 认证方法。我尝试在 app.yml 文件中添加 DISCOURSE_SMTP_AUTHENTICATION: login,但这并未解决问题。
JMadd
4
仅供参考,以下是我的发现。我进入了 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。
JMadd
5
哦,另外,我始终无法在 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 个赞
gzegzol
(Grzegorz Gutowski)
7
我可以确认,在 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 个赞
你好,
在我的当前版本中,上述代码已针对 Net::SMTP.start(smtp[:address], smtp[:port], 'localhost', smtp[:user_name], smtp[:password], smtp[:authentication]) 进行了修复,但问题依旧存在。
错误:504 5.7.4 无法识别的认证类型,来自 smtp.office365.com。
有人有任何建议吗?
1 个赞
tahoetech
(Dave Stewart)
10
如何编辑 lib/tasks/emails.rake 脚本以实现此功能?
作为对该问题的总体更新,Microsoft 正在逐步移除 SMTP 和 POP3 的旧版身份验证,如果您使用 O365 作为邮件提供商,这将带来诸多不便。当前默认策略已禁止 SMTP AUTH,您需要按邮箱单独启用该功能。希望这能有所帮助——我昨天上午为此折腾了许久。
特别是关于 POP 的问题确实令人遗憾,除非 Discourse 为入站邮箱增加 IMAP 支持,否则配置入站邮件将变得更加困难。
1 个赞
pfaffman
(Jay Pfaffman)
12
有一个简单的解决方案可以接收包含收件容器的邮件。它以前被称为“直截了当”,但有人反对这个名字,于是它被更改了,而我再也找不到它了。
此外,还有 群组收件箱的 IMAP 支持。但它主要仅支持 Gmail。
3 个赞
无论如何,自行搭建邮件服务器都应被视为最后的手段。我记得这叫做“直接投递”,建议搜索一下这个术语。
2 个赞
截至 2023 年,exchange 中不再支持 pop3 身份验证。
1 个赞
如果您正在使用 PHPMailer
请尝试注释/删除该行并重试://$mail->isSMTP(true);