10

Mail gem(つまり、Rails + ActionMailer)を使用して、受信者の表示名を取得するクリーンな方法はありますか?

私は次のアドレスを取得できます:

mail.to.first

そして、フォーマットされた表示名とアドレスを次のように取得できます。

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

しかし、どうすれば表示名の部分だけを取得できますか(つまり、<との前>)。誰かが正規表現を提案しようとしていることは知っていますが、それは私が探しているものではありません。それは、メールの宝石がおそらくすでに行っているエンコーディングを解析する必要があるからです。私はPHPで人気のあるメーラーライブラリの作成者であり、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

落とし穴は、ブラケットアクセスとドットアクセスがこの宝石では異なるということです。

ドキュメントから:

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 に答える