¿Cómo puedo obtener un correo completo :: :: SpamAssassin objeto MailMessage de texto?
-
25-09-2019 - |
Pregunta
Yo uso el siguiente código para generar un informe de spam utilizando 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();
El problema que tengo es que clasifique 'muestra-nonspam.txt' como 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
Y que -is- información en el archivo. Lo que me preocupa es que en la documentación, se afirma "Analizar devolverá un correo :: :: SpamAssassin objeto de mensaje con sólo las cabeceras analizadas.". ¿Eso significa que no devolverá un mensaje completo?
Solución
Te estás perdiendo un solo carácter:
my $mail = $sa->parse(\@lines);
A partir de los documentos (con énfasis añadido):
parse($message, $parse_now [, $suppl_attrib])
Parse devolverá un objeto
Mail::SpamAssassin::Message
con sólo los encabezados analizados. Al llamar a esta función, hay dos parámetros opcionales que se pueden pasar en:$message
Es bienundef
(que utilizaráSTDIN
), un escalar de todo el mensaje, una referencia de matriz del mensaje con de 1 línea por elemento de array , o un pegote archivo que contiene todo el contenido del mensaje; y$parse_now
, que especifica si se va a crear el árbol MIME en tiempo de análisis o temprano como sea necesario.
Con el cambio anterior, tengo la siguiente salida (HTML despojado):
pts rule name description ---- ---------------------- -------------------------------------------------- -2.6 BAYES_00 BODY: Bayesian spam probability is 0 to 1% [score: 0.0000]
A medida que los documentos mencionan, parse
es flexible. Se podría utilizar en su lugar
my $mail = $sa->parse(join "" => <FILE>); # scalar of the entire message
o
my $mail = $sa->parse(\*FILE); # a file glob with the entire contents
o
my $mail;
{ local $/; $mail = $sa->parse(<FILE>) } # scalar of the entire message
o incluso
open STDIN, "<", "mail.txt" or die "$0: open: $!";
my $mail = $sa->parse(undef); # undef means read STDIN
Se había quitar my @lines = <FILE>
para estos últimos cuatro ejemplos para funcionar como se espera.
Otros consejos
Esta es la forma correcta para construir un mensaje:
my $mail = Mail::SpamAssassin::Message->new({ "message" => $content });