У меня есть огромный файл mbox, в котором может быть около 500 писем.
Это выглядит так:
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
Я хотел бы знать, как я могу удалить весь цитируемый текст, удалить большую часть заголовков, кроме строк «Кому», «От» и «Дата», и при этом сохранить его непрерывность.
Моя цель - иметь возможность печатать эти электронные письма в формате книги, и на данный момент каждая программа хочет печатать одно электронное письмо на странице или все заголовки и цитируемый текст. Есть предложения, с чего начать создание небольшой программы с помощью инструментов оболочки?
эй считается за тело, так что все должно быть в порядке?
В вашем примере ничто не сможет сказать, где начинается тело. В RFC-822 тело определяется пустой строкой перед ним.
Но между «Привет» и заголовком эволюции есть пустая строка?
Когда я писал эти сообщения, я этого не видел. Не уверен, что это потому, что я был на работе, где меня заставляли использовать IE, или кто-то его редактировал.
Хорошо, я снова смотрю на это на работе, и пустая строка исчезла. Должно быть ошибка в IE.





Для начала я бы, вероятно, использовал «formail» для извлечения писем с нужными вам заголовками. Либо так, либо используйте какую-то таблицу состояний в awk, чтобы увидеть, находитесь ли вы в заголовке или нет, и либо удалите все, кроме желаемых заголовков, если вы находитесь в заголовке, и удалите кавычки, если нет.
Ответ Хадсона лучше моего. Возникает мета-вопрос: должны ли мы удалять наши ответы, когда появляется что-то получше, или только когда ваш ответ «плохой»?
Использование инструментов оболочки может быть не лучшим ответом на это, поскольку существует множество библиотек на многих языках для работы с mbox, будь то Ruby, Perl или что-то еще. Вы также должны учитывать, что символы цитирования не всегда являются ">", что может испортить ваш процесс отмены кавычек. Что касается извлечения нужных заголовков, это не должно вызывать затруднений на любом языке. Я знаю, что это общий ответ, возможно, недостаточно конкретный ...
Почта :: Ящик :: 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
}
Вы можете пересмотреть свой запрос на удаление цитируемого текста - что, если вы отправляете электронное письмо с чередующимися ответами? Удаление цитируемого текста сделало бы такое электронное письмо очень трудным для понимания:
Foo wrote: > I like bar. Bar? Who likes bar? > It is better than baz. Everyone knows that. -- Quux
Кроме того, что вы планируете делать с вложениями, нетекстовыми / простыми типами MIME, закодированными текстовыми объектами и другими странностями?
Спасибо за Ваш ответ. Нет вложений для печати, весь текст на английском языке, и большинство писем не чередуются с кавычками, что сэкономит много бумаги.
Просто q быстрый вопрос, но принимает ли этот perl параметр или он использует переменную среды $ MAIL
Сценарий принимает параметр (my $ file = shift) или, если он не задан, по умолчанию используется переменная среды (|| $ ENV {MAIL}).
Это почти именно то, что я хочу, но по двум причинам. Электронные письма не упорядочены в хронологическом порядке, однако они находятся в исходном файле, и в конце строк есть много знаков, которые я хотел бы удалить.
на самом деле, сотрите это, они не в хронологическом порядке в исходном файле ... черт возьми, я не знаю, как это исправить.
Есть ли простой способ отсортировать сообщения в хронологическом порядке?
= 20 из-за того, что он не является текстовым / простым, а вместо этого доступен для печати в кавычках. Вам нужно будет использовать синтаксический анализатор MIME для их преобразования и переформатирования, или if = 20 - единственный особый случай '$ body = ~ s / = 20 $ // msg;'. Для сортировки вы можете сделать что-то вроде 'for (sort {$ a-> timestamp <=> $ b-> timestamp} @ $ folder) {...}'
Вы его не показываете, но если между заголовками и телом нет пустой строки, значит, у вас все в порядке.