我们从第三方来源获得人名,有些姓氏包含部门后缀,例如"(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
方括号的存在导致返回不响应addrs
的Mail::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]