Comment puis-je obtenir un plein Mail :: SpamAssassin :: objet MailMessage du texte?
-
25-09-2019 - |
Question
J'utilise le code suivant pour générer un rapport de spam en utilisant 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();
Le problème que j'ai est qu'il classe « échantillon nonspam.txt » comme spam:
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
Et que les informations -is- dans le fichier. Ce qui me préoccupe est que, dans la documentation, il déclare « Parse retournera un Mail :: SpamAssassin :: objet du message avec juste les en-têtes analysables. ». Est-ce que cela signifie qu'il ne reviendra pas un message complet?
La solution
Vous manque un seul caractère:
my $mail = $sa->parse(\@lines);
A partir de la documentation (avec un accent ajouté):
parse($message, $parse_now [, $suppl_attrib])
Parse retourne un objet
Mail::SpamAssassin::Message
avec seulement les en-têtes analysés. Lors de l'appel de cette fonction, il y a deux paramètres facultatifs qui peuvent être transmis à:$message
est soitundef
(qui utiliseraSTDIN
), un scalaire du message entier, une référence de tableau du message avec une ligne par élément de matrice , ou un glob de fichier qui contient le contenu du message; et$parse_now
, qui spécifie si oui ou non pour créer l'arborescence MIME au moment de l'analyse ou plus tard si nécessaire.
Avec le changement ci-dessus, je reçois la sortie suivante (HTML dépouillé):
pts rule name description ---- ---------------------- -------------------------------------------------- -2.6 BAYES_00 BODY: Bayesian spam probability is 0 to 1% [score: 0.0000]
Comme les documents mentionnent, parse
est flexible. Vous pouvez utiliser à la place
my $mail = $sa->parse(join "" => <FILE>); # scalar of the entire message
ou
my $mail = $sa->parse(\*FILE); # a file glob with the entire contents
ou
my $mail;
{ local $/; $mail = $sa->parse(<FILE>) } # scalar of the entire message
ou même
open STDIN, "<", "mail.txt" or die "$0: open: $!";
my $mail = $sa->parse(undef); # undef means read STDIN
Vous souhaitez supprimer my @lines = <FILE>
pour ces quatre derniers exemples de fonctionner comme prévu.
Autres conseils
Ceci est la bonne façon de construire un message:
my $mail = Mail::SpamAssassin::Message->new({ "message" => $content });