Net::SMTP
El módulo Net::SMTP forma parte de la librería libnet, y está incluído en Debian en el paquete perl-modules.
Sirve para interactuar como cliente con un servidor SMTP, y es la mejor manera que he encontrado de reenviar mensajes de correo que he tenido que retocar de alguna forma. Cualquier otro módulo de gestión de mensajes y/ó buzones extrae partes del mensaje (como es lógico) y permite montarlo de nuevo, pero no tengo la seguridad de que conserven el mismo aspecto.
Está orientado a objetos y se usa de una manera muy simple:
- Se crea el objeto
Net::SMTP
y se le proporciona un nombre de servidor (opcional) y algunos parámetros como el puerto, el tiempo límite ó los mensajes de depuración (también opcionales). En ese momento la conexión está abierta y se deben usar los siguientes métodos en el mismo órden en el que los espera un servidor de correo (el protocolo viene descrito en el 821). - Se envía al servidor la información sobre quién envía (
MAIL FROM
) y quién recibe (RCPT TO
) con los métodos (Net::SMTP::mail
yNet::SMTP::to
). - Se procede a enviar el cuerpo del mensaje en formato 822 utilizando
el método
Net::SMTP::data
ó alguno de los encontrados en Net::Cmd comodatasend
para, si el servidor acepta los datos, seguir con ... - ... un cierre de sesión con el método
Net::SMTP::quit
.
Y eso es todo lo que se necesita a un nivel básico para enviar un mensaje de
correo directamente a un servidor SMTP
. Conviene recordar que las
direcciones del emisor y el receptor son los del envoltorio ó sobre del
mensaje, y que el mensaje en sí puede contener cabeceras extras que desvíen el
mensaje a otros receptores.
En uno de mis programas he tenido que crear un método de clase que me permite enviar a un receptor un correo completo, almacenado en un fichero ó en una lista.
1 ### CLASS METHOD ### 2 # Usage : Taquiones::Admin->send_raw_email( $email_text ); 3 # Purpose : Envía un mensaje de correo en bruto usando una conexión SMTP 4 # : con el servidor local 5 # Returns : 1 = Todo bien 6 # : 0 = Algo ha fallado 7 # Parameters : - Usuario receptor del correo (puede incluir el nombre de la 8 # : máquina. 9 # : - Texto con el mensaje a enviar (incluyendo cabeceras) en 10 # : formato RFC822. 11 # Throws : - Taquiones::X::Email 12 # Commments : El método hace uso de Net::SMTP y de las variables de 13 # : configuración `email_server` y 'email_from'. 14 # See also : n/a 15 16 sub send_raw_email { 17 my $class = shift; 18 my $to = shift; 19 my $text = shift; 20 21 # Abrimos conexión con el servidor de correo 22 my $smtp = Net::SMTP->new( 23 Host => $config{email_server}, 24 Debug => $config{debug}, 25 Timeout => 600, 26 ); 27 28 if (not $smtp) { 29 Taquiones::X::Email->throw(); 30 } 31 else { 32 # añadimos la parte local al receptor (si no tiene) 33 $to = sprintf("%s\@localhost", $to) if not $to =~ m{@}xms; 34 35 # Añadimos de quién a quién va el correo 36 $smtp->mail($config{email_from}); 37 $smtp->recipient($to); 38 39 # y la parte de datos del mismo 40 my @message_lines = _get_message_in_lines( $text ); 41 if (not $smtp->data( @message_lines )) { 42 Taquiones::X::Email->throw(message => 'mensaje NO aceptado', 43 text => $text); 44 } 45 else { 46 # fin de sesión 47 $smtp->quit(); 48 } 49 } 50 51 return 1; 52 }
Hace referencia a una función exterior que consigue el texto del mensaje en una lista, y que puede implementarse de muchas formas.