Почтовый камень. Извлечь отображаемое имя и адрес получателя как отдельные значения

Используя гем Mail (то есть Rails + ActionMailer), есть ли чистый способ получить отображаемое имя получателя?

Я могу получить адрес с:

mail.to.first

И я могу получить отформатированное отображаемое имя + адрес с помощью:

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

Но как я могу получить только часть отображаемого имени (т.е. до < а также >). Я знаю, что кто-то собирается предложить Regex, но это не то, что я ищу, так как тогда мне придется анализировать любую кодировку, что, вероятно, уже делает гем Gem Mail. Я являюсь автором популярной библиотеки Mailer на PHP и знаю о подводных камнях, связанных с предположением о том, что нужно делать раньше. < а также > читается человеком в заголовках, когда в игру вступают 8-битные символы.

Я могу сделать это:

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

Но должен быть лучший способ?:)

2 ответа

Решение

Разобрался, извини. Для всех, кто ищет эту тему, ищет решение:

mail[:to].display_names.first

Проблема в том, что доступ к скобкам и точечный доступ для этого драгоценного камня различаются.

Из документа :

      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
Другие вопросы по тегам