Wie kann ich eine vollständige E-Mail erhalten :: Spamassassin :: Mailmessage-Objekt aus Text?

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

  •  25-09-2019
  •  | 
  •  

Frage

Ich verwende den folgenden Code einen Spam-Bericht mit Spamassassin zu generieren:

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();

Das Problem, das ich habe ist, dass es stuft 'Probe-nonspam.txt' als 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 

Und das Informationen -is- in der Datei. Was mir Sorgen macht, ist, dass in der Dokumentation, es heißt „Parse eine E-Mail zurück :: Spamassassin :: Message-Objekt nur mit den analysierten Header.“. Heißt das, es wird keine vollständige Meldung zurück?

War es hilfreich?

Lösung

Sie sind ein einzelnes Zeichen fehlen:

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

Von der Dokumentation (mit Betonung hinzugefügt):

  

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

     

Parse eine Mail::SpamAssassin::Message Objekt zurück mit nur den Header analysiert. Beim Aufruf dieser Funktion gibt es zwei optionale Parameter, die übergeben werden können: $message entweder undef ist (was STDIN verwenden), ein Skalar der gesamten Nachricht, ein Array-Referenz der Nachricht mit 1 Zeile pro Array-Element oder eine Datei glob, die den gesamten Inhalt der Nachricht hält; und $parse_now, der angibt, ob der MIME-Baum zur Analysezeit erstellen oder später nach Bedarf.

Mit der Änderung oben, erhalte ich die folgende Ausgabe (HTML gestrippt):

 pts rule name              description
---- ---------------------- --------------------------------------------------
-2.6 BAYES_00               BODY: Bayesian spam probability is 0 to 1%
                            [score: 0.0000]

Wie die docs erwähnen, ist parse flexibel. Sie könnten stattdessen

my $mail = $sa->parse(join "" => <FILE>);  # scalar of the entire message

oder

my $mail = $sa->parse(\*FILE);             # a file glob with the entire contents

oder

my $mail;
{ local $/; $mail = $sa->parse(<FILE>) }   # scalar of the entire message

oder auch

open STDIN, "<", "mail.txt" or die "$0: open: $!";
my $mail = $sa->parse(undef);              # undef means read STDIN

Sie würden my @lines = <FILE> für diese letzten vier Beispiele Funktion entfernen, wie erwartet.

Andere Tipps

Das ist der richtige Weg, um eine Nachricht zu erstellen:

my $mail = Mail::SpamAssassin::Message->new({ "message" => $content });
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top