Есть ли модуль CPAN для извлечения текущего уровня контента из электронного письма? - PullRequest
4 голосов
/ 14 февраля 2011

Я ищу модуль, который сделает все возможное для извлечения непосредственного уровня контента (т.е. отбрасывания любого цитируемого контента и блока подписи) из простого текстового компонента электронного письма.

У нас уже есть некоторый код, который имеет шанс на него, поэтому, если не существует существующего модуля, который это делает, идеи имени нового модуля также будут оценены (Text::ExtractImmediateLevelOfContentFromEmail кажется немного громоздким).

1 Ответ

3 голосов
/ 14 февраля 2011

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

use Email::MIME;
my $email = Email::MIME->new($message);
my $body;
$email->walk_parts(sub {
    my ($part) = @_;
    return unless $part->content_type =~ m[text/plain];
    $body .= $part->body;
});

# strip quoted lines and attribution line
$body =~ s/^.+ wrote:\n(?=\n* ?>)//m;
$body =~ s/^ ?>.*\n//gm;

# strip signature
$body =~ s/-- \R.+//;

Конечно, вы можете добавить другие эвристические правила для удаления строк атрибуции, написанных на других языках, а также для удаления стиля Outlookцитируемый текст.Я бы предложил некоторые эвристические методы, чтобы избежать зачистки текста в кавычках, если сообщение распознается с использованием чередования в стиле чередования.Это потому, что чередующиеся ответы могут потерять некоторое значение, если вы удалите цитируемый текст.

Если вы хотите выделить это в модуле, я бы назвал его Email::ExtractBody или Email::ExtractText.В POD я бы подчеркнул, что в модуле используется эвристический подход с максимальными усилиями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...