3

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

Gemmail有 method Mail.read('filename.txt'),但它只解析邮箱中的第一条消息。

那个 gem 和 builtinNet::IMAP已经在网上充斥着关于通过 imap 访问邮箱的教程。

那么,还有没有办法在没有 imap的情况下解析一个普通的旧文件?作为我小组中唯一的 ruby​​ist,我宁愿不求助于http://docs.python.org/2/library/mailbox.html让自己尴尬。

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

4

3 回答 3

7

好消息是Mbox 格式非常简单,尽管它的简单性是它最终被替换的原因。解析大型邮箱文件以提取单个消息并不是特别有效。

如果您可以将邮箱文件拆分为单独的字符串,则可以将这些字符串传递给 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 不是一个选项,这就是你必须做的。

于 2013-05-03T16:34:26.573 回答
1

您可以使用 tmail解析邮箱,但它被替换为邮件,但我真的 找不到替代它的类。因此,您可能希望与 tmail 保持一致。

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

于 2013-05-03T16:21:44.993 回答
1

mbox 格式非常简单。它只是所有消息的串联,用空行分隔。每条消息的第一行以五个字符“From”开头;将消息添加到文件时,任何以“From”开头的行都有一个>前缀,因此您可以可靠地使用以“From”开头的行作为消息开始的指示符。

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

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

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

于 2013-05-03T16:25:27.373 回答