Вам не хватает одного символа:
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>
чтобы эти последние четыре примера работали как положено.