【问题标题】:How to parse mailbox file in Ruby?如何在 Ruby 中解析邮箱文件?
【发布时间】:2013-04-28 02:40:40
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 一个文字邮箱文件?在迪斯科消失之前,不是每个人都搬到Maildir 吗?
  • 是的,就是这样。

标签: ruby parsing email mbox


【解决方案1】:

好消息是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:,任何以"&gt;From" 开头的行都将被视为 实际上是"From"。正是这样的事情使得这种编码方法确实不够用,但如果 Maildir 不是一个选项,这就是你必须做的。

【讨论】:

  • 快速浏览有问题的邮箱可以确认/^From / 而不是/From: / 确实分隔了邮件。
【解决方案2】:

你可以使用tmailparsing email boxes,但是它被mail取代了,但我真的不能find a class that substitutes it。因此,您可能希望与 tmail 保持一致。

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

【讨论】:

  • 根据我的经验,tmail 在 1.9.x 中确实被破坏了。它已被 mail 弃用。
【解决方案3】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-22
    • 1970-01-01
    • 2015-05-12
    • 2012-05-03
    • 2014-07-11
    • 1970-01-01
    相关资源
    最近更新 更多