Rails Action Mailer外发邮件为何被重定向到mydomain?
问题根因
两个核心配置错误直接导致故障:
- 投递方式配置矛盾:你显式设置了
config.action_mailer.delivery_method = :sendmail,这种模式下Action Mailer会直接调用本地系统的sendmail二进制发信,你下面写的整段smtp_settings外部SMTP配置完全不会被加载,等于无效配置。 - 重定向日志不是SMTP服务返回的,是Rails 7默认开启的
force_ssl强制HTTPS跳转触发的:如果邮件模板里用了*_path辅助方法生成相对路径链接/资源地址,Action Mailer渲染时会发起本地HTTP请求解析路径,碰到强制SSL规则就会返回301跳转到https://mydomain,直接中断邮件渲染和投递流程,这也是你看到重定向日志的直接原因。
你之前在命令行测试sendmail、msmtp都能正常发信,已经排除了网络、SMTP账号、系统邮件组件的问题,故障完全出在应用层配置。
修复步骤
修正投递方式配置
如果要走外部SMTP服务器mail.mydomain发信,必须把投递方式改成:smtp,否则SMTP配置永远不生效:# 将原来的:sendmail改为:smtp config.action_mailer.delivery_method = :smtp如果你确实打算用本地sendmail发信,直接删掉多余的smtp_settings配置块,避免无效配置干扰排查。
修正SMTP和mailer基础配置
首先打开投递报错方便排查,不要注释掉错误抛出:config.action_mailer.raise_delivery_errors = true补全静态资源主机配置,同时修正SMTP的TLS参数——465端口用隐式SSL,不要同时开ssl和tls两个参数,会触发握手冲突:
config.action_mailer.default_url_options = { host: 'mydomain', protocol: 'https' } config.action_mailer.asset_host = 'https://mydomain' config.action_mailer.smtp_settings = { address: 'mail.mydomain', port: 465, domain: 'mydomain', user_name: <your_smtp_account>, password: <your_smtp_password>, authentication: 'plain', ssl: true, tls: false, open_timeout: 5, read_timeout: 5 }排查邮件模板的链接写法
检查所有触发投递的邮件模板,所有链接、图片资源地址必须用*_url辅助方法生成带域名的绝对路径,绝对不能用*_path生成相对路径,这是触发重定向打断投递的最常见诱因。重载配置验证
改完配置后必须重启Rails应用和good_job后台进程(后台进程不会自动加载新配置),先在生产控制台做发信测试:# 进入生产环境控制台 rails c -e production # 执行测试发信 ActionMailer::Base.mail( to: 'your_test_mail@example.com', from: 'no-reply@mydomain', subject: 'Config Test', body: 'If you receive this email, the mail config works.' ).deliver_now如果这步能正常收信,再走正常业务流程触发邮件投递即可。
补充兜底排查
如果改完上述配置仍然出现重定向日志,检查production环境的SSL配置,把good_job触发的内部请求排除在强制跳转之外:
config.force_ssl = true config.ssl_options = { redirect: { exclude: -> request { request.user_agent&.include?('GoodJob') } } }
内容的提问来源于stack exchange,提问作者TimP
相关产品推荐
相关产品推荐

