2

我有一个巨大的 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 工具从哪里开始编写小程序的任何建议?

4

3 回答 3

7

Mail::Box::Mbox可让您轻松地将文件解析为单独的消息。来自 YAPC::Europe 2002的 Mark Overmeer 的幻灯片详细说明了为什么解析比看起来要困难得多。使用这个库还将处理 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

    }

您可能需要重新考虑删除引用文本的请求——如果您发送的电子邮件格式为交错回复,该怎么办?去掉引用的文本会使这种电子邮件很难理解:

  福写道:
  > 我喜欢酒吧。

  酒吧?谁喜欢酒吧?

  > 这比 baz 好。

  每个人都知道这一点。

  --
  曲

此外,您打算如何处理附件、非文本/纯 MIME 类型、编码文本实体和其他奇怪的东西?

于 2008-12-10T17:25:37.207 回答
1

首先,我可能会使用“formail”来提取仅包含您想要的标题的邮件。要么这样,要么在 awk 中使用某种状态表来查看您是否在标题中,如果您在标题中,则去掉除所需标题之外的所有内容,如果不在,则去掉引号。

于 2008-12-10T17:04:15.923 回答
1

使用 shell 工具可能不是最好的答案,因为有许多语言的库可以处理 mbox,无论是 Ruby、Perl 还是其他语言。您还必须考虑引用字符并不总是“>”,这可能会破坏您的取消引用过程。至于提取您想要的标题,这在任何语言中都应该不难。我知道这是一个笼统的答案,可能还不够具体......

于 2008-12-10T17:10:13.260 回答