2010-02-04 4 views
1

J'utilise le code suivant pour générer un rapport de spam en utilisant SpamAssassin:Comment puis-je obtenir un objet Mail :: SpamAssassin :: MailMessage complet à partir du texte?

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, c'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 cette information -is- dans le fichier. Ce qui m'inquiète, c'est que dans la documentation, il est écrit "Parse retournera un objet Mail :: SpamAssassin :: Message avec juste les en-têtes analysés". Est-ce que cela signifie qu'il ne retournera pas un message complet?

Répondre

1

vous manque un seul caractère:

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

De la documentation (avec un accent ajouté):

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

parse retourner un objet Mail::SpamAssassin::Message avec seulement les en-têtes analysés . Lors de l'appel de cette fonction, deux paramètres facultatifs peuvent être transmis: $message est soit undef (qui utilisera STDIN), un scalaire du message entier, une référence de tableau du message avec 1 ligne par élément de tableau, ou un fichier glob qui contient tout le contenu du message; et $parse_now, qui spécifie s'il faut ou non créer l'arbre 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 pour fonctionner comme prévu .

+0

La ligne mise en surbrillance est sur le point d'entrée * *, la ligne I surligné était sur le point * sortie *. La façon de le faire est légèrement différente. –

+0

@Matthias Peut-être que j'aurais dû le souligner dans ma réponse, mais j'ai été capable de reproduire le problème que vous voyiez et de le corriger (* *, avec un bon rapport qui ne se plaignait pas de champs d'en-tête manquants) * référence à * @lines plutôt @lines. –

+0

Je pense que nos deux réponses sont possibles, mais vous avez répondu à ma question directe, donc je l'accepte. Je vous remercie! –

0

Ceci est la bonne façon de construire un message:

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