Creando un script de envío de correo con attachment binario en Vugen

HPUno de los tipos de script incluidos en Vugen es precisamente un script SMTP que permite enviar correos a través del servidor SMTP que indiquemos para crear un monitor que compruebe su funcionamiento o que forme parte de un monitor más complejo extremo a extremo.

El problema es que este script no aporta mucho más que unas pocas funciones con las que construir y enviar nuestro correo, y estas funciones no aportan ninguna funcionalidad más avanzada que si estuviésemos componiendo a mano nuestro correo con (por ejemplo) perl.

Nos encontramos por tanto con el mismo problema a la hora de intentar enviar un correo con archivos binarios adjuntos: podemos efectivamente indicar Content-Type y Content-Transfer-Encoding del archivo adjunto pero no tenemos forma de incluir dicho archivo en sí sin que sea leyéndolo como texto plano (y por tanto volviéndolo inservible).

Si alguien conoce alguna forma de hacer esto con la funcionalidad propia del script SMTP de Vugen que levante la mano, yo por mi parte opté por la siguiente alternativa.

En perl es sencillo solucionar este problema de los adjuntos, así que por qué no usar perl? Bueno, porque no tenemos scripts perl en Vugen, pero sí tenemos scripts VB y desde ellos podemos llamar a un script perl externo.

[code language=”perl”]
#!/usr/bin/perl

use Net::SMTP;
use strict;
use warnings;
use MIME::Base64 qw( encode_base64 );
#use MIME::Base64 qw( decode_base64 );

my $from = $ARGV[1];
my $to = $ARGV[2];
my $attachBinaryFile= $ARGV[0];;
my $boundary = ‘frontier’;

my $smtp = Net::SMTP->new($ARGV[3], Timeout => 60) || die(“Could not create SMTP object.”);
print “Sending mail\n”;
$smtp->mail($from);
$smtp->recipient($to, { SkipBad => 1 });
$smtp->data(); $smtp->datasend(“To: $to\n”);
$smtp->datasend(“From: $from\n”);
$smtp->datasend(“Subject: BPM SMTP Monitor\n”);
$smtp->datasend(“MIME-Version: 1.0\n”);
$smtp->datasend(“Content-type: multipart/mixed;\n\tboundary=\”$boundary\”\n”);
$smtp->datasend(“\n”); $smtp->datasend(“–$boundary\n”);
$smtp->datasend(“Content-type: text/plain\n”);
$smtp->datasend(“Content-Disposition: quoted-printable\n”);
$smtp->datasend(“\nBPM Monitor\n”);

$smtp->datasend(“–$boundary\n”);
$smtp->datasend(“Content-Type: application/octet-stream; name=\”$attachBinaryFile\”\n”);
$smtp->datasend(“Content-Transfer-Encoding: base64\n”);
$smtp->datasend(“Content-Disposition: attachment; filename=\”$attachBinaryFile\”\n”);
$smtp->datasend(“\n”);
my $buf; open(DAT, “$attachBinaryFile”) || die(“Could not open binary file!”);
binmode(DAT);
local $/=undef;
while (read(DAT, my $attachment, 4096)) {
$buf = &encode_base64( $attachment );
$smtp->datasend($buf);
}
close(DAT);
$smtp->datasend(“\n”);
$smtp->datasend(“–$boundary\n”);
$smtp->dataend();
$smtp->quit;
print “Mail sent\n”;
exit;
[/code]

Y en nuestro script VB de Vugen:

Shell "perl smtpattach.pl file.zip [email protected] [email protected] smtp.somewhere.com", 0

Añade las transacciones y código adicional que necesites, y listo.