Soy novata en Perl, he hecho mis "pinitos" pero poco más.
Tengo un programita que necesito que me envíe un e-mail con el informe del resultado del proceso una vez acaba.
No pueden instalar sendmail (no me preguntéis por qué) ni nada que me sirva para enviar el e-mail y me han pedido que lo haga a través de sockets. Según me han dicho "es muy fácil y seguro que hay ejemplos en Internet"
Llevo toda la semana buscando por la red y siempre usan sendmail o MIME:lite en todo lo que he visto... he encontrado un solo ejemplo con socket pero no me funciona y como no llego a entender muy bien en qué consiste, ya dudo incluso de que se pueda hacer el envío de e-mail como me han pedido.
Pego a continuación el código que he encontrado y probado, he cambiado alguna cosita. No me da ningún error, simplemente hace print() del HELO, From, etc,.. pero no me devuelve ninguna respuesta (250 OK, etc,...)
Using perl Syntax Highlighting
my($mailTo) ='[email protected]';
my($mailServer) ='smtp.midominio.es';
my($mailFrom) ='[email protected]';
my($realName) = "Mi Nombre";
my($subject) = 'E-mail pruebas';
my($body) = "Pruebas linea uno.\nPruebas linea dos.\n";
$main::SIG{'INT'} = 'closeSocket';
my($proto) = getprotobyname("TCP") || 6;
my($port) = getservbyname("SMTP", "TCP") || 25;
my($serverAddr) = (gethostbyname($mailServer))[4];
socket(SMTP, AF_INET(), SOCK_STREAM(), $proto)
or die("socket: $!");
my $packFormat = 'Sna4x8'; # Windows 95, SunOs 4.1+
connect(SMTP, pack($packFormat, AF_INET(), $port, $serverAddr))
or die("connect: $!");
select(SMTP); $| = 1; select(STDOUT);
{
my $inpBuf = '';
recv(SMTP, $inpBuf, 200, 0);
recv(SMTP, $inpBuf, 200, 0);
}
sendSMTP(1, "HELO\n");
sendSMTP(1, "MAIL From: <$mailFrom>\n");
sendSMTP(1, "RCPT To: <$mailTo>\n");
sendSMTP(1, "DATA\n");
sendSMTP (1,"From: $realName\n");
sendSMTP (1,"Subject: $subject\n");
sendSMTP (1,$body);
sendSMTP(1, "\r\n.\r\n");
sendSMTP(1, "QUIT\n");
close(SMTP);
sub closeSocket { # close smtp socket on error
close(SMTP);
die("SMTP socket closed due to SIGINT\n");
}
sub sendSMTP {
my $debug = shift;
my $buffer = shift;
print STDERR ("> $buffer") if $debug;
send(SMTP, $buffer, 0);
recv(SMTP, $buffer, 200, 0);
print STDERR ("XXXX< $buffer") if $debug;
return( (split(/ /, $buffer))[0] );
}
my($mailServer) ='smtp.midominio.es';
my($mailFrom) ='[email protected]';
my($realName) = "Mi Nombre";
my($subject) = 'E-mail pruebas';
my($body) = "Pruebas linea uno.\nPruebas linea dos.\n";
$main::SIG{'INT'} = 'closeSocket';
my($proto) = getprotobyname("TCP") || 6;
my($port) = getservbyname("SMTP", "TCP") || 25;
my($serverAddr) = (gethostbyname($mailServer))[4];
socket(SMTP, AF_INET(), SOCK_STREAM(), $proto)
or die("socket: $!");
my $packFormat = 'Sna4x8'; # Windows 95, SunOs 4.1+
connect(SMTP, pack($packFormat, AF_INET(), $port, $serverAddr))
or die("connect: $!");
select(SMTP); $| = 1; select(STDOUT);
{
my $inpBuf = '';
recv(SMTP, $inpBuf, 200, 0);
recv(SMTP, $inpBuf, 200, 0);
}
sendSMTP(1, "HELO\n");
sendSMTP(1, "MAIL From: <$mailFrom>\n");
sendSMTP(1, "RCPT To: <$mailTo>\n");
sendSMTP(1, "DATA\n");
sendSMTP (1,"From: $realName\n");
sendSMTP (1,"Subject: $subject\n");
sendSMTP (1,$body);
sendSMTP(1, "\r\n.\r\n");
sendSMTP(1, "QUIT\n");
close(SMTP);
sub closeSocket { # close smtp socket on error
close(SMTP);
die("SMTP socket closed due to SIGINT\n");
}
sub sendSMTP {
my $debug = shift;
my $buffer = shift;
print STDERR ("> $buffer") if $debug;
send(SMTP, $buffer, 0);
recv(SMTP, $buffer, 200, 0);
print STDERR ("XXXX< $buffer") if $debug;
return( (split(/ /, $buffer))[0] );
}
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4
¿Me podéis confirmar si es posible hacer este envío de e-mail a través de un socket?
¿Cómo lo haríais vosotros?
¡Por favor, agradezco cualquier cosa que me pueda servir de ayuda!
¡Mil gracias!!
Un saludo.