Ruby on Rails SMTP配置报错550 Sender verify failed求助
问题:发送邮件出现550 Sender verify failed (Net::SMTPFatalError)错误
在Rails项目配置SMTP发送邮件时遇到该错误,项目的SMTP配置如下:
config.action_mailer.delivery_method = :smtp config.action_mailer.default_url_options = { host: 'MIIP' } config.action_mailer.smtp_settings = { address: 'myadress.com, # 注意:引号未闭合,且与控制台使用的地址拼写不一致 user_name: 'noreply@myadresswerk.com', password: 'password' # 注意:缺少逗号,存在Ruby语法错误 port: 587, ssl_context_starttls: OpenSSL::SSL::SSLContext.new.tap do |ctx| ctx.verify_mode = OpenSSL::SSL::VERIFY_NONE end, authentication: :login, openssl_verify_mode: 'none' }
但直接在Rails控制台执行以下代码时,邮件发送成功:
smtp = Net::SMTP.new('myaddr.com', 587) smtp.start('localhost', 'noreply@myaddr.com', 'password', :login) do |smtp| smtp.send_message 'Hello world!', 'noreply@myaddr.com', 'receiver@gmail.com' end
额外说明:必须设置OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE,否则会出现SSL_connect returned=1 errno=0 state=error: certificate verify failed (hostname mismatch)错误。
解决办法
对比成功的控制台代码和Rails配置,问题集中在以下几点,逐一修正即可:
修正配置中的语法与拼写错误
- 补充
address字段的闭合引号:address: 'myaddr.com'(统一为控制台使用的正确地址拼写) - 在
password: 'password'末尾添加逗号,修复Ruby语法解析错误
- 补充
添加
domain参数匹配HELO主机名
控制台代码中smtp.start的第一个参数'localhost'是SMTP握手时的HELO/EHLO主机名,Rails默认会用default_url_options[:host](即'MIIP'),而该主机名不被SMTP服务器认可,导致发件人验证失败。需在smtp_settings中显式指定:domain: 'localhost'简化冗余的SSL配置
配置中ssl_context_starttls和openssl_verify_mode重复设置了证书验证规则,保留其中一种即可,推荐用更简洁的写法:openssl_verify_mode: OpenSSL::SSL::VERIFY_NONE
修正后的完整SMTP配置示例:
config.action_mailer.delivery_method = :smtp config.action_mailer.default_url_options = { host: 'MIIP' } config.action_mailer.smtp_settings = { address: 'myaddr.com', user_name: 'noreply@myadresswerk.com', password: 'password', port: 587, domain: 'localhost', authentication: :login, openssl_verify_mode: OpenSSL::SSL::VERIFY_NONE }
修改完成后重新测试邮件发送,即可解决550 Sender verify failed错误。
内容的提问来源于stack exchange,提问作者faa_q
相关产品推荐
相关产品推荐

