You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rails Action Mailer外发邮件为何被重定向到mydomain?

问题根因

两个核心配置错误直接导致故障:

  1. 投递方式配置矛盾:你显式设置了config.action_mailer.delivery_method = :sendmail,这种模式下Action Mailer会直接调用本地系统的sendmail二进制发信,你下面写的整段smtp_settings外部SMTP配置完全不会被加载,等于无效配置。
  2. 重定向日志不是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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 01:45:43