Как я могу получить полный объект Mail :: SpamAssassin :: MailMessage из текста? - PullRequest
1 голос
/ 04 февраля 2010

Я использую следующий код для создания отчета о спаме с помощью SpamAssassin:

use Mail::SpamAssassin;

my $sa = Mail::SpamAssassin->new();

open FILE, "<", "mail.txt";
my @lines = <FILE>;
my $mail = $sa->parse(@lines);

my $status = $sa->check($mail);

my $report = $status->get_report();
$report =~ s/\n/\n<br>/g;

print "<h1>Spam Report</h1>";
print $report;

$status->finish();
$mail->finish();
$sa->finish();

Проблема в том, что она классифицирует «sample-nonspam.txt» как спам:

Content preview: [...] 

Content analysis details: (6.9 points, 5.0 required) 

pts rule name description 
---- ---------------------- -------------------------------------------------- 
-0.0 NO_RELAYS Informational: message was not relayed via SMTP 
1.2 MISSING_HEADERS Missing To: header 
0.1 MISSING_MID Missing Message-Id: header 
1.8 MISSING_SUBJECT Missing Subject: header 
2.3 EMPTY_MESSAGE Message appears to have no textual parts and no 
Subject: text 
-0.0 NO_RECEIVED Informational: message has no Received headers 
1.4 MISSING_DATE Missing Date: header 
0.0 NO_HEADERS_MESSAGE Message appears to be missing most RFC-822 headers 

И эта информация находится в файле. Что меня беспокоит, так это то, что в документации говорится: «Parse вернет объект Mail :: SpamAssassin :: Message с только что проанализированными заголовками». Означает ли это, что он не вернет полное сообщение?

Ответы [ 2 ]

1 голос
/ 04 февраля 2010

Вам не хватает одного символа:

my $mail = $sa->parse(\@lines);

Из документов (с добавлением акцента):

parse($message, $parse_now [, $suppl_attrib])

Parse вернетсяMail::SpamAssassin::Message объект с только что проанализированными заголовками.При вызове этой функции есть два необязательных параметра, которые могут быть переданы: $message - это либо undef (который будет использовать STDIN), скаляр всего сообщения, ссылка на массив сообщения с1 строка на элемент массива или глобус файла, который содержит все содержимое сообщения;и $parse_now, который указывает, создавать ли дерево MIME во время синтаксического анализа или позже при необходимости.

С указанным выше изменением я получаю следующий вывод (HTML-код):

 pts rule name              description
---- ---------------------- --------------------------------------------------
-2.6 BAYES_00               BODY: Bayesian spam probability is 0 to 1%
                            [score: 0.0000]

Как уже упоминалось в документах, parse является гибким.Вместо этого вы можете использовать

my $mail = $sa->parse(join "" => <FILE>);  # scalar of the entire message

или

my $mail = $sa->parse(\*FILE);             # a file glob with the entire contents

или

my $mail;
{ local $/; $mail = $sa->parse(<FILE>) }   # scalar of the entire message

или даже

open STDIN, "<", "mail.txt" or die "$0: open: $!";
my $mail = $sa->parse(undef);              # undef means read STDIN

Вы удалите my @lines = <FILE> чтобы эти последние четыре примера работали как положено.

0 голосов
/ 04 февраля 2010

Это правильный способ создания сообщения:

my $mail = Mail::SpamAssassin::Message->new({ "message" => $content });
...