2008-12-10 45 views
1

我有一個巨大的mbox文件,其中可能有500封電子郵件。如何使用bash或Perl重新格式化mbox文件中的消息?

它看起來像如下:

From [email protected] Fri Aug 12 09:34:09 2005 
Message-ID: <[email protected]> 
Date: Fri, 12 Aug 2005 09:34:09 +0900 
From: me <[email protected]> 
User-Agent: Mozilla Thunderbird 1.0.6 (Windows/20050716) 
X-Accept-Language: en-us, en 
MIME-Version: 1.0 
To: someone <[email protected]> 
Subject: Re: (no subject) 
References: <[email protected]> 
In-Reply-To: <[email protected]> 
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://[email protected]/ 
X-Evolution: 00000002-0010 

Hey 

the actual content of the email 

someone wrote: 

> lines of quotedtext 

我想知道我怎麼可以刪除所有引用文字,剝離大部分的頭,除了收件人,發件人和日期線,而且還有它有點連續。

我的目標是能夠將這些電子郵件作爲書籍格式打印出來,此時每個程序都希望每頁打印一封電子郵件,或者所有的標題和引用文本。對於從哪裏開始使用shell工具來啓動一個小程序有什麼建議?

+0

你不會顯示一個,但是如果標題和正文之間沒有空白行,那麼您就處於深層次的doo-doo中。 – 2008-12-10 17:02:55

+0

嘿被算作身體,所以它應該罰款? – 2008-12-10 17:10:09

+0

在你的例子中,沒有什麼能夠告訴身體何處開始。在RFC-822中,主體由其之前的空白行定義。 – 2008-12-10 17:22:54

回答

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

作爲一個開始,我可能會使用「formail」來提取只包含所需頭文件的郵件。要麼是這樣,要麼在awk中使用某種狀態表來查看你是否在標題中,並且如果你在標題中,除了想要的標題之外,將其中的所有內容除去,如果不是。

0

使用shell工具可能不是最好的答案,因爲有許多語言庫處理mbox,無論是在Ruby,Perl或其他。您還必須考慮引用字符並非總是「>」,這可能會導致您的報價流程失效。至於提取你想要的標題,這在任何語言中都不難。我知道這是一個普遍的答案,也許不夠具體......