我有一个巨大的mbox文件,其中可能有500封电子邮件。
如下所示:
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
我想知道如何删除所有引用的文本,删除除To,From和Date行之外的大多数标题,并且仍然有点连续。
我的目标是能够将这些电子邮件打印为书籍格式,目前每个程序都希望每页打印一封电子邮件,或者所有标题和引用文本。有关从哪里开始使用shell工具制作小程序的任何建议?
答案 0 :(得分:6)
Mail::Box::Mbox可让您轻松地将文件解析为单独的邮件。 Mark Overmeer的slides from YAPC::Europe 2002详细介绍了为什么解析比看起来困难得多。使用这个库还将处理mh,IMAP和许多其他格式,而不仅仅是mbox。
#!/usr/bin/perl
use warnings;
use strict;
use Mail::Box::Manager;
my $file = shift || $ENV{MAIL};
my $mgr = Mail::Box::Manager->new(
access => 'r',
);
my $folder = $mgr->open( folder => $file )
or die "$file: Unable to open: $!\n";
for my $msg ($folder->messages)
{
my $to = join( ', ', map { $_->format } $msg->to );
my $from = join( ', ', map { $_->format } $msg->from );
my $date = localtime( $msg->timestamp );
my $subject = $msg->subject;
my $body = $msg->body;
# Strip all quoted text
$body =~ s/^>.*$//msg;
print <<"";
From: $from
To: $to
Date: $date
$body
}
您可能需要重新考虑删除引用文本的请求 - 如果您使用交错式回复格式化的电子邮件会怎么样?剥离引用的文本会使这种电子邮件很难理解:
Foo wrote: > I like bar. Bar? Who likes bar? > It is better than baz. Everyone knows that. -- Quux
此外,您打算如何处理附件,非文本/纯MIME类型,编码文本实体和其他奇怪的内容?
答案 1 :(得分:1)
首先,我可能会使用“formail”来提取只有你想要的标题的邮件。要么是这样,要么在awk中使用某种状态表来查看你是否在标题中,如果你在标题中,则除了所需的标题之外除去所有标题,如果不是,则删除引号。< / p>
答案 2 :(得分:0)
使用shell工具可能不是最好的答案,因为有许多语言库可以处理mbox,无论是Ruby,Perl还是其他什么。您还必须考虑引用字符并不总是“&gt;”,这可能会搞砸您的取消引用过程。至于提取你想要的标题,在任何语言中都应该不难。我知道这是一个普遍的答案,可能不够具体......