NoMethod错误,当"to"包含具有不可解析字符的名称时



我们从第三方来源获得人名,有些姓氏包含部门后缀,例如"(R&D)"。当尝试通过ActionMailer发送电子邮件时,我们得到一个源自邮件gem的NoMethodError错误。

可以不使用ActionMailer复制,如下所示:

to = "Kris Leech <kris@example.com>"
mail = Mail.new { to(to) }
mail[:to].addrs # => [#<Mail::Address]
to = "Kris Leech [TECH] <kris@example.com>"
mail = Mail.new { to(to) }
mail[:to].addrs # => NoMethodError: undefined method `addrs' for Mail::UnstructuredField

方括号的存在导致返回不响应addrsMail::UnstructuredField,而不是Mail::StructuredField

可以看到有一个解析错误:

mail[:to].errors # => [["To", "Kris Leech [TECH] <kris.leech@example.com>", #<Mail::Field::IncompleteParseError: Mail::AddressList can not parse |Kris Leech [TECH] <kris@example.com>|: Only able to parse up to "Kris Leech ">]]

如何转义或更正"的名称部分?

根据规范,当名称部分包含保留字符时,必须加引号。

这在Mail::Utilities中实现。

所以我们可以&;quote&;名称部分如下:

QuoteName = Class.new do
extend Mail::Utilities
def self.call(name)
quote_phrase(name)
end
end
to = "#{QuoteName.('Kris Leech [TECH]')} <kris@example.com>"
mail = Mail.new { to(to) }
mail[:to].addrs # => [#<Mail::Address]

最新更新