10

使用Mail gem(即Rails + ActionMailer),是否有一种干净的方式来获取收件人的显示名称?

我可以通过以下方式获取地址:

mail.to.first

我可以通过以下方式获取格式化的显示名称+地址:

mail.header_fields.select{ |f| f.name == "To" }.first.to_s

但是我怎样才能得到显示名称部分(即在<and之前>)。我知道有人会建议一个正则表达式,但这不是我想要的,因为我必须解析出任何编码,这可能是 Mail gem 已经做的事情。我是 PHP 中一个流行的 Mailer 库的作者,我意识到当 8 位字符开始发挥作用时,在标题中仅假设前面的位<并且在标题中是人类可读的陷阱。>

我可以做这个:

mail.header_fields.select{ |f| f.name == "To" }.first.parse.individual_recipients.first.display_name.text_value

但一定有更好的方法吗?:)

4

2 回答 2

23

想通了,抱歉。对于点击此线程寻找解决方案的其他任何人:

mail[:to].display_names.first
于 2011-08-27T08:11:36.113 回答
2

问题是这个 gem 的括号访问和点访问是不同的。

文档

mail = Mail.new
mail.to = 'Mikel Lindsaar <mikel@test.lindsaar.net>, ada@test.lindsaar.net'
mail.to    #=> ['mikel@test.lindsaar.net', 'ada@test.lindsaar.net']
mail[:to]  #=> '#<Mail::Field:0x180e5e8 @field=#<Mail::ToField:0x180e1c4
mail['to'] #=> '#<Mail::Field:0x180e5e8 @field=#<Mail::ToField:0x180e1c4
mail['To'] #=> '#<Mail::Field:0x180e5e8 @field=#<Mail::ToField:0x180e1c4

mail[:to].encoded   #=> 'To: Mikel Lindsaar <mikel@test.lindsaar.net>, ada@test.lindsaar.net\r\n'
mail[:to].decoded   #=> 'Mikel Lindsaar <mikel@test.lindsaar.net>, ada@test.lindsaar.net'
mail[:to].addresses #=> ['mikel@test.lindsaar.net', 'ada@test.lindsaar.net']
mail[:to].formatted #=> ['Mikel Lindsaar <mikel@test.lindsaar.net>', 'ada@test.lindsaar.net']

所以要获取显示名称,您可以使用#display_name

mail[:to].addrs.first.display_name #=> Mikel Lindsaar

用于#address获取电子邮件地址

mail[:from].addrs.first.address #=> mikel@test.lindsaar.net
于 2021-03-17T16:47:11.070 回答