Rails生产环境使用Outlook SMTP发邮件失败:认证错误
解决Rails生产环境Office365 SMTP认证失败问题
问题重现
本地环境使用以下Rails邮件配置可正常发送邮件,但生产环境抛出Net::SMTPAuthenticationError (535 5.7.3 Authentication unsuccessful)错误:
config.action_mailer.default_url_options = { host: ENV["HOST_NAME"] } config.action_mailer.perform_deliveries = true config.action_mailer.raise_delivery_errors = true config.action_mailer.default_options = { from: ENV["EMAIL_USERNAME"] } config.action_mailer.perform_caching = false config.action_mailer.delivery_method = :smtp config.action_mailer.smtp_settings = { address: 'smtp.office365.com', port: 587, domain: 'smtp.office365.com', user_name: ENV["EMAIL_USERNAME"], password: ENV["EMAIL_PASSWORD"], authentication: :login, enable_starttls_auto: true }
排查与解决步骤
验证生产环境环境变量
登录生产环境服务器,在Rails控制台执行以下命令,确认EMAIL_USERNAME和EMAIL_PASSWORD的取值和本地完全一致,无拼写错误、多余空格或特殊字符未转义:puts ENV["EMAIL_USERNAME"] puts ENV["EMAIL_PASSWORD"]调整Office365账户安全设置
- 若账户开启了现代认证,传统密码认证会失效,需开启两步验证后生成应用密码,用应用密码替换生产环境的
EMAIL_PASSWORD。 - 联系Office365管理员,确认账户未被设置SMTP发送限制的安全策略。
- 若账户开启了现代认证,传统密码认证会失效,需开启两步验证后生成应用密码,用应用密码替换生产环境的
优化SMTP配置细节
- 将
domain字段改为你的实际业务域名(如yourcompany.com),而非smtp.office365.com,Office365会验证发件域名的合法性。 - 尝试将
authentication改为:plain,部分Office365环境下该认证方式兼容性更好。调整后的SMTP配置示例:config.action_mailer.smtp_settings = { address: 'smtp.office365.com', port: 587, domain: 'yourcompany.com', user_name: ENV["EMAIL_USERNAME"], password: ENV["EMAIL_APP_PASSWORD"], # 替换为应用密码 authentication: :plain, enable_starttls_auto: true }
- 将
检查生产环境网络连通性
- 确认生产服务器的出站端口587未被防火墙或云服务商拦截,可通过telnet测试连接:
若能看到telnet smtp.office365.com 587220 MW4P221CA0003.NAMP221.PROD.OUTLOOK.COM Microsoft ESMTP MAIL Service ready的提示,说明网络连通正常。
- 确认生产服务器的出站端口587未被防火墙或云服务商拦截,可通过telnet测试连接:
确保发件人地址一致性
确认default_options[:from]的邮箱地址和smtp_settings[:user_name]完全一致,Office365要求发件人必须与SMTP认证账户匹配,不能使用其他邮箱地址作为发件人。
内容的提问来源于stack exchange,提问作者Praveenkumar
相关产品推荐
相关产品推荐

