Creative Commons License
Excepto donde se indique otra cosa, todo el contenido de este lugar está bajo una licencia de Creative Commons.
Taquiones > perl > cpan > Net::SMTP

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:

  1. 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).
  2. 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 y Net::SMTP::to).
  3. 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 como datasend para, si el servidor acepta los datos, seguir con ...
  4. ... 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.