Comment puis-je obtenir un plein Mail :: SpamAssassin :: objet MailMessage du texte?

StackOverflow https://stackoverflow.com/questions/2199442

  •  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?

Était-ce utile?

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 soit undef (qui utilisera STDIN), 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 });
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top