开发者

Mail gem. Extract recipient display name and address as separate values

开发者 https://www.devze.com 2023-03-31 17:14 出处:网络
Using the Mail gem (i.e. Rails + ActionMailer), is there a clean way to get the display name of the recipient?

Using the Mail gem (i.e. Rails + ActionMailer), is there a clean way to get the display name of the recipient?

I can get the address with:

mail.to.first

And I can get the formatted display name + address with:

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

But how can I get just the display name part (i.e. before the < and >). I know somebody is going to suggest a Regex, but that's not what I'm looking for, since I'd then have to parse out any encoding, which is something the Mail gem probably already does. I'm the author of a popular Mailer library in PHP and am aw开发者_如何学Pythonare of the pitfalls of just assuming the bit before < and > is human-readable, in the headers, when 8-bit characters come into play.

I can do this:

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

But there must be a better way? :)


Figured it out, sorry. For anyone else who hits this thread looking for the solution:

mail[:to].display_names.first


The gotcha is that bracket access and dotted access are different for this gem.

From the doc:

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']

So to get the display name, you can use #display_name

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

Use #address to get the email address

mail[:from].addrs.first.address #=> mikel@test.lindsaar.net
0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号