Как я могу переформатировать сообщения в файле mbox с помощью bash или Perl?

У меня есть огромный файл 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

Я хотел бы знать, как я могу удалить весь цитируемый текст, удалить большую часть заголовков, кроме строк «До», «От» и «Дата», и при этом иметь несколько непрерывных заголовков.

Моя цель - иметь возможность печатать эти электронные письма в формате книги, и в настоящее время каждая программа хочет печатать одно электронное письмо на страницу или все заголовки и цитируемый текст. Любые предложения о том, с чего начать при запуске небольшой программы с помощью инструментов оболочки?

10.12.2008 16:59:29
Вы не показываете его, но если между заголовками и телом нет пустой строки, вы находитесь в глубоком ду-ду.
Paul Tomblin 10.12.2008 17:02:55
эй считается телом, так что должно быть хорошо?
user1253538 10.12.2008 17:10:09
В вашем примере, ничто не сможет сказать, где начинается тело. В RFC-822 тело определяется пустой строкой перед ним.
Paul Tomblin 10.12.2008 17:22:54
Но есть ли пустая строка между «Привет» и заголовком эволюции?
user1253538 11.12.2008 10:15:19
Это не было видно для меня, когда я писал эти сообщения. Не уверен, что это потому, что я был на работе, где меня заставили использовать IE, или кто-то отредактировал его.
Paul Tomblin 11.12.2008 11:53:22
3 ОТВЕТА
РЕШЕНИЕ

Mail :: Box :: Mbox позволит вам легко разбирать файл на отдельные сообщения. Слайды Марка Овермера из 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

    }

Возможно, вы захотите пересмотреть свой запрос на удаление цитируемого текста - что если вы отправите электронное письмо с чередованными ответами? Извлечение цитируемого текста очень затруднит понимание такого рода писем:

  Фу написал:
  > Мне нравится бар.

  Бар? Кто любит бар?

  > Это лучше, чем баз.

  Все это знают.

  - 
  Quux

Кроме того, что вы планируете делать с вложениями, нетекстовыми / простыми типами MIME, закодированными текстовыми объектами и другими странностями?

7
10.12.2008 17:40:27
Спасибо за Ваш ответ. Вложения для печати отсутствуют, весь текст
user1253538 11.12.2008 10:08:39
Просто быстрый вопрос, но принимает ли этот perl параметр или использует переменную среды $ MAIL
user1253538 11.12.2008 12:00:11
Сценарий принимает параметр (my $ file = shift) или, если он не указан, по умолчанию используется переменная окружения (|| $ ENV {MAIL}).
Hudson 11.12.2008 15:19:51
Это почти то, что я хочу, но по двум причинам. Похоже, что электронные письма не упорядочены в хронологическом порядке, однако они находятся в исходном файле, и в конце строк есть много
user1253538 12.12.2008 14:36:26
на самом деле, поцарапайте это, они не в хронологическом порядке в оригинальном файле ... черт, я не знаю, как это исправить.
user1253538 12.12.2008 14:37:24

Для начала, я бы, вероятно, использовал «formail» для извлечения писем только с теми заголовками, которые вы хотите. Либо так, либо используйте какую-то таблицу состояний в awk, чтобы увидеть, в заголовке вы или нет, и либо удалите все, кроме нужных заголовков, если вы в заголовке, и удалите кавычки, если это не так.

1
10.12.2008 17:04:15
Ответ Хадсона лучше моего. Что поднимает мета-вопрос: должны ли мы удалять наши ответы, когда что-то лучше, или только когда ваш ответ «плохой»?
Paul Tomblin 11.12.2008 15:22:28

Использование инструментов оболочки может быть не лучшим ответом на это, поскольку на многих языках есть много библиотек для работы с mbox, будь то Ruby, Perl или что-то еще. Вам также следует учитывать, что символы цитирования не всегда являются символом «>», что может испортить процесс удаления цитирования. Что касается извлечения заголовков, которые вы хотите, это не должно быть трудным на любом языке. Я знаю, что это общий ответ, может быть, не достаточно конкретный ...

1
10.12.2008 17:10:13