如何解析Ruby中的邮箱文件?

时间:2013-05-03 16:06:39

标签: ruby parsing email mbox

Ruby gem rmail具有解析本地磁盘上的邮箱文件的方法。不幸的是,这个宝石已经崩溃了(在Ruby 2.0.0中)。它可能无法修复,因为人们正在迁移到gem mail

Gem mail有方法Mail.read('filename.txt'),但只解析邮箱中的第一条消息。

那个gem和内置Net::IMAP已经充斥着网络,通过imap访问邮箱的教程。

那么,还是有办法解析一个普通的文件,没有imap吗? 作为我小组中唯一的红宝石主义者,我宁愿不诉诸http://docs.python.org/2/library/mailbox.html使自己难堪。

或者更糟糕的是,PHP的imap_open('/var/mail/www-data', ...) - 如果只有Net::IMAP.new接受了类似的文件名。

3 个答案:

答案 0 :(得分:7)

好消息是Mbox format真的很简单,虽然它的简单性是它最终被取代的原因。解析大型邮箱文件以提取单个邮件并不是特别有效。

如果您可以将邮箱文件拆分为单独的字符串,则可以将这些字符串传递给Mail库进行解析。

一个示例起点:

def parse_message(message)
  Mail.new(message)

  do_other_stuff!
end

message = nil

while (line = STDIN.gets)
  if (line.match(/\AFrom /))
    parse_message(message) if (message)
    message = ''
  else
    message << line.sub(/^\>From/, 'From')
  end
end

关键是每条消息都以"From "开头,其后面的空格是密钥。标题将定义为From:,任何以">From"开头的行都将被视为 实际上是"From"。这样的事情使得这种编码方法真的不合适,但如果Maildir不是一个选项,那么这就是你必须做的事情。

答案 1 :(得分:1)

您可以使用tmail parsing email boxes,但它已被mail取代,但我真的不能find a class that substitutes it。所以你可能想和tmail保持一致。

编辑:正如@tadman指出的,它不应该与ruby 1.9一起使用。但是你可以移植这个类(并把它放在github上供其他人使用:-))

答案 2 :(得分:0)

mbox格式就像你能得到的一样简单。它只是所有消息的串联,用空行分隔。每条消息的第一行以五个字符“From”开头;当消息被添加到文件中时,任何以“From”开头的行都带有>前缀,因此您可以可靠地使用行以“From”开头的事实作为指示它是消息的开头

当然,由于这是一种旧格式,并且从未标准化,因此有许多变体。一个变体使用Content-Length标头来确定消息的长度,并且此变体的某些实现无法插入“&gt;”。但是,我认为这在实践中很少见。

mbox格式的一个大问题是文件需要由邮件代理修改;因此,每个实现都有一些锁定过程。当然,那里没有标准化,因此您需要注意在阅读邮箱时修改邮箱的其他进程。实际上,许多邮件系统通过使用maildir格式来解决这个问题,其中邮箱实际上是一个目录,每条消息都是一个文件。

您可能想要做的其他事情包括MIME解码,但您应该能够找到执行此操作的实用程序。