1

我正在尝试在 Ruby on Rails 中解析一封作为附件的电子邮件?我不担心正则表达式,但更担心我用来获取解析输出的方法。我希望在没有任何邮件解析宝石的情况下做到这一点。下面的代码似乎有效,这是正确的方法吗?

模型.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

显示.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 回答