Как я могу получить полную почту :: Spamassassin :: Объект MailMessage из текста?
-
25-09-2019 - |
Вопрос
Я использую следующий код для создания отчета спама с помощью 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();
Проблема, которую у меня есть, это то, что она классифицирует «образец-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 вернет почту :: Spamassassin :: Объект сообщений с проанализированными только заголовками». Это означает, что это не вернет полное сообщение?
Решение
Вам не хватает одного персонажа:
my $mail = $sa->parse(\@lines);
Из документов (с акцентом добавлены):
parse($message, $parse_now [, $suppl_attrib])
Разбор вернет
Mail::SpamAssassin::Message
Объект с только что заголовки проанализированы. При вызове этой функции есть два дополнительных параметра, которые могут быть переданы:$message
это тожеundef
(который будет использоватьSTDIN
), скаляр всего сообщения, Справочник массива сообщения с 1 строкой на элемент массива, или файл, который содержит все содержимое сообщения; а также$parse_now
, что указывает, создать ли дерево MIME в разбираемости или позже по мере необходимости.
При изменении выше я получаю следующий вывод (HTML-раздетый):
ПТС Имя правила Описание ------------------------------------------------- ---------------------------------2.6 bayes_00 body: Байесовская вероятность спама составляет от 0 до 1% [Оценка: 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>
Для этих последних четырех примеров функционирует как ожидалось.
Другие советы
Это правильный способ построить сообщение:
my $mail = Mail::SpamAssassin::Message->new({ "message" => $content });