如何解析Delivered-To标头?

时间:2012-07-20 15:06:21

标签: ruby-on-rails ruby parsing

我试图在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>

1 个答案:

答案 0 :(得分:2)

分析

电子邮件规范允许multiline headers,您当前的表达式不匹配。另外,我认为你的正则表达式不允许所有允许的地址字符。

解决方案

使用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"]