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
接受了类似的文件名。
答案 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解码,但您应该能够找到执行此操作的实用程序。