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

使用Devise发送注册/重置密码邮件时遇Net::SMTPSyntaxError:501发件人语法错误

解决Devise发送邮件时的Net::SMTPSyntaxError: 501 Sender syntax error问题

嘿,我之前也踩过这个坑!你遇到的这个错误根源很明确:你的发件人地址被HTML转义了,SMTP服务器无法识别&lt;和&gt;这些HTML实体,它需要的是原始的尖括号<和>。

问题出在哪?

看你自定义的Devise邮件类里写的default from: '"My Site" &lt;me@mysite.com&gt;',这段代码最终会生成带转义实体的发件人字符串:"My Site" &lt;me@mysite.com&gt;,但SMTP协议要求的正确格式是"My Site" <me@mysite.com>(用真实的尖括号),这就直接触发了服务器的501语法错误。

怎么修复?

直接把default from里的HTML转义实体换成真实的尖括号就行,不需要转义:

CustomDeviseMailer < Devise::Mailer
  include Roadie::Rails::Automatic
  layout 'email'
  # 替换成真实的尖括号,不要用HTML转义实体
  default from: '"My Site" <me@mysite.com>'
  
  def confirmation_instructions(record, token, opts = {})
    check_white_label record, opts
    super
  end
  
  def reset_password_instructions(record, token, opts = {})
    check_white_label record, opts
    super
  end
end

额外的小提示

  • 如果你的SMTP服务器比较严格,不支持带显示名称的发件人格式(就是"显示名称" <邮箱地址>这种形式),可以直接简化成纯邮箱地址:me@mysite.com试试
  • 要是你是在视图或者其他地方动态生成发件人地址,得注意别让模板引擎自动转义HTML实体,确保最终传给Devise的是未转义的原始字符串

另外,你也可以在每个邮件方法里显式指定发件人,覆盖全局设置,比如在confirmation_instructions里这么写:

def confirmation_instructions(record, token, opts = {})
  check_white_label record, opts
  opts[:from] = '"My Site" <me@mysite.com>'
  super
end

这样能确保每个邮件都用正确的发件人格式,避免全局设置可能出现的转义问题。

内容的提问来源于stack exchange,提问作者Antarr Byrd

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:09:09