1

添付ファイルである Ruby on Rails で電子メールを解析しようとしていますか? 正規表現については心配していませんが、解析された出力を取得するために使用する方法については心配しています。メール解析の宝石なしでこれを行うことを検討しています。以下のコードは動作しているように見えますが、これは正しい方法ですか?

model.rb

def parse_delivered_to
  str = File.read("public/emails/email.txt").to_s
  delivered_to = str.match(/(Delivered-To: )[\w+\-.]+@[a-z\d\-.]+\.+[a-z]+[a-z]+[a-z]/i)
end

show.html.erb

<%= @email.parse_delivered_to %><br>
4

1 に答える 1

2

分析

電子メールの仕様では、現在の表現では一致しない複数行のヘッダーが許可されています。さらに、あなたの正規表現では、許可されているすべてのアドレス文字が許可されているとは思いません。

解決

procmail の^TO_構文のバリエーションを使用すると、複数行のアドレス パターンをより自由に一致させることができます。例えば:

header.scan( /^Delivered-To:(.*[^-a-zA-Z0-9_.])?/im ).flatten.map(&:strip)

いくつかのテストと例

header = "Delivered-To:\n  Foo <foo@example.com>"
header.scan( /^Delivered-To:(.*[^-a-zA-Z0-9_.])?/im ).flatten.map(&:strip)
header.scan( /^Delivered-To:(.*[^-a-zA-Z0-9_.])?/im ).flatten.map(&:strip)
=> ["Foo <foo@example.com>"]

header.scan( /^Delivered-To:(.*[^-a-zA-Z0-9_.])?/im).
 flatten.map(&:strip).to_s.scan(/[\w@.+_-]+/).grep(/@/).first.to_s
=> "foo@example.com"

'Delivered-To: foo.bar+extension@example.com'.
  scan( /^Delivered-To:(.*[^-a-zA-Z0-9_.])?/im).
  flatten.map(&:strip).to_s.scan(/[\w.+_-]+/)
=> ["foo.bar+extension"]

'Delivered-To: foo.bar-extension@example.com'.
  scan( /^Delivered-To:(.*[^-a-zA-Z0-9_.])?/im).
  flatten.map(&:strip).to_s.scan(/[\w.+_-]+/)
=> ["foo.bar-extension"]
于 2012-07-20T15:36:39.817 に答える