Cómo enviar un email desde un script perl
En ocasiones es interesante poder enviar un email desde nuestra aplicación. Un ejemplo puede ser el caso de un proceso que se ejecuta periódicamente en un servidor (quizá mediante una entrada en cron), y que avisa mediante un email cuando se produce alguna incidencia durante su ejecución.
En Perl, la manera más sencilla de enviar un email es llamando a una aplicación externa de envío de correos por línea de comandos que esté disponible en el sistema, como pueden ser ‘mailx’, ‘mutt’ o el propio ‘sendmail’ en sistemas Linux:
Envío de email mediante a una llamada a sendmail
Para ello, podemos definir una función ‘send_email’ como sigue:
1
2
3
4
5
6
7
8
9
10
11
|
sub send_email {
my ($remitente, $destinatario, $asunto, $mensaje) = @_;
open(MAIL, "|/usr/lib/sendmail -oi -t");
print MAIL "From: $remitente\n";
print MAIL "To: $destinatario\n";
print MAIL "Subject: $asunto\n\n";
print MAIL "$mensaje\n";
close(MAIL);
}
|
De este modo, podemos enviar un email mediante la llamada:
1
2
3
4
5
6
|
send_email('soporte@openalfa.com',
'usuario@gmail.com',
'Mensaje de prueba',
'Estimado usuario, este es un mensaje de prueba');
|
En la rutina send_email, el segundo argumento de la llamada a open(MAIL …) comienza con el caracter “|” (pipe). Así se dispara la ejecución del comando sendmail, y se asocia su standard input a la variable “MAIL”. De este modo, las siguientes llamadas “print MAIL …” envían el texto al programa sendmail.
El texto que se envía a sendmail consta de una cabecera de tres líneas con el remitente, el destinatario y el asunto del mensaje, seguida del cuerpo del mensaje. La cabecera debe estar separada del cuerpo por una línea en blanco, y por eso la tercera línea que se envía (con el asunto del mensaje) finaliza en “nn”.
Envío de emails con ficheros adjuntos
El mecanismo de llamar a un comando del sistema mediante una canalización (pipe) se puede aplicar a cualquier otro comando que queramos ejecutar. En concreto, si tenemos necesidad de enviar mensajes más elaborados (por ejemplo, mensajes HTML, o mensajes que incluyen ficheros adjuntos) podemos llamar a otro cliente de correo en lugar de a sendmail. mutt es un ejemplo de cliente de correo disponible en sistemas linux que puede ser usado para añadir adjuntos a los mensajes que enviamos.
En funcion de las características de nuestro sistema, podemos también utilizar los comandos ‘mail’, ‘mailx’ o cualquier otro cliente de correo que ofrezca un interfaz de línea de comandos.
Otras posibilidades para enviar emails desde Perl
La biblioteca CPAN de módulos perl también dispone de numerosos módulos para el envío de correo, entre los que se encuentran Net::SMTP, Email::Sender, Email::MIME, MIME::Lite, etc.
Por ejemplo, podemos enviar un mensaje HTML utilizando MIME::Lite con el siguiente código:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
#!/usr/bin/perl -w
use strict;
use MIME::Lite;
# Destinatario
my $email = 'usuario@gmail.com';
my $mensaje = MIME::Lite->new (
Subject => "Prueba de mensaje HTML",
From => 'dev@openalfa.com',
To => $email,
Type => 'text/html',
Data => '<H1>Mensaje de prueba</H1><br>Este es un mensaje de prueba<br/>
Por cortesía de <a href="http://blog.openalfa.com/">Blog Openalfa</a><hr>'
);
$mensaje->send();
|