如何按时间顺序重新排列mbox文件?

7

我有一个由Evolution创建的单个spool mbox文件,其中包含我想要打印的一些电子邮件。我的问题是这些邮件没有按时间顺序放入mbox文件中。我想知道使用bash、perl或python将文件从最早到最晚排序的最佳方法。对于发送给我的文件,我想按收到时间排序,对于我发送的文件,我想按发送时间排序。也许使用maildir文件或类似文件更容易吗?

当前电子邮件的格式如下:

From x@blah.com Fri Aug 12 09:34:09 2005
Message-ID: <42FBEE81.9090701@blah.com>
Date: Fri, 12 Aug 2005 09:34:09 +0900
From: me <x@blah.com>
User-Agent: Mozilla Thunderbird 1.0.6 (Windows/20050716)
X-Accept-Language: en-us, en
MIME-Version: 1.0
To: someone <someone@hotmail.com>
Subject: Re: (no subject)
References: <BAY101-F9353854000A4758A7E2CCA9BD0@phx.gbl>
In-Reply-To: <BAY101-F9353854000A4758A7E2CCA9BD0@phx.gbl>
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 8bit
Status: RO
X-Status: 
X-Keywords:                 
X-UID: 371
X-Evolution-Source: imap://x+blah.com@blah.com/
X-Evolution: 00000002-0010

Hey

the actual content of the email

someone wrote:

> lines of quotedtext

我想知道是否有一种方法可以利用这些信息,例如使用Perl等轻松重新组织文件。

不要在标签中预测答案 - user3850
我需要用特定语言来获取答案,这就是为什么相关标签被添加的原因。 - user1253538
如果您希望用这些语言回答,请在问题中说明。 - user3850
我已经加了标签,请不要再删除它们。 - user1253538
1
我只是在寻求帮助,而不是要求完成工作。没有人强迫任何人回答。 - user1253538
3个回答

15
这是使用Python的方法:
#!/usr/bin/python2.5
from email.utils import parsedate
import mailbox

def extract_date(email):
    date = email.get('Date')
    return parsedate(date)

the_mailbox = mailbox.mbox('/path/to/mbox')
sorted_mails = sorted(the_mailbox, key=extract_date)
the_mailbox.update(enumerate(sorted_mails))
the_mailbox.flush()

交付日期:可能不可用。根据RFC,日期仍然是给定邮件的官方“日期”。 - Keltia
1
你是对的。我更喜欢使用它,因为我不想让发件人的错误时钟决定我的排序顺序。 - user3850
谢谢您的回复。除了主题,是否有一种简便的方法可以打印整个消息?我在查找email.get的信息时遇到了困难。 - user1253538
似乎还存在着Unicode或\n字符无法解释的问题,有没有一种设置字符集或类似方法的方式? - user1253538
这就是我所说的“让我们替你做工作”的意思。您可以在此处找到文档:http://docs.python.org/library/mailbox.html - user3850

2

如果使用Thunderbird的ImportExportTools插件将邮件导入mbox中,Python解决方案将无法起作用。 这里存在一个问题:消息必须以以下格式的'from'行为前缀:

From - Tue Apr 27 19:42:22 2010

但是ImportExportTools在这样的“from”行中添加前缀:
From - Sat May 01 2010 15:07:31 GMT+0400 (Russian Daylight Time)

因此,存在两个错误:

  1. 序列“time year”被拆分为“year time”
  2. 带有GMT信息的额外垃圾与时区名称一起

由于Python的mailbox.py/UnixMailbox对“from”行匹配有硬编码的正则表达式,因此某些消息无法解析。

我已将错误消息写给了作者,但是有许多错误导入的消息 :(。


-5

重写 mbox 有什么意义呢?当您加载邮箱时,可以在内存中重新排序邮件。您想要按哪个时间排序?收到日期?发送日期?无论如何,所有用于处理 mbox 的 Ruby/Python/Perl 模块都可以做到这一点。


因为我想要打印文件,而不是在电脑上查看。 - user1253538
你想将邮箱打印成一个文件吗?如果是这样的话,我建议你编写一个脚本来读取mbox中的每个消息,并使用类似enscript或a2ps的工具(可能使用模板)进行打印。这样会更加方便和美观。 - Keltia
1
mbox文件本身已经是一个单一的文件,问题在于单一文件中的电子邮件并不按照时间顺序排列。我更倾向于保持它的文本格式,目前我可以直接将其发送到lpr(打印机):只是它不按照时间顺序排列。 - user1253538

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接