Archivo de la etiqueta: correo

La clase TIdMessageBuilderHtml y el envío de correos HTML desde Delphi

Hay muchas formas de enviar correos con Delphi.

Mi preferida desde hace tiempo es hacerlo vía SMTP con la clase TIdSMTP, que es flexible y poderosa.

Hoy, a raíz de que mi estimado amigo, Edgar Ramírez, publicara su artículo Enviar correo con imágenes incrustadas con Delphi he recordado que hace tiempo me gustaría iniciar una serie de artículos sobre el uso de INDY y la comunicación TCP/IP con Delphi.

A manera de respuesta a la publicación citada, quiero mostrar cómo realizar el envío de un correo similar —con una imagen incrustada— haciendo uso de la clase auxiliar TIdMessageBuilderHtml, que en mi opinión no solo facilita las cosas sino que nos deja una solución mucho más elegante y fácil de entender en el código.

La parte relevante del envío de correo es:

procedure TfrmCorreo.EnviaCorreoImagen(const FileName: string);
var
  Builder: TIdMessageBuilderHtml;
  Msg: TIdMessage;
  SMTP: TIdSMTP;
begin
  Builder := TIdMessageBuilderHtml.Create;
  try
    Builder.Html.Add('<HTML><HEAD><TITLE>Una imagen para ti</TITLE></HEAD><BODY>');
    Builder.Html.Add('<p><strong>Una imagen para ti</strong></p>');
    Builder.Html.Add('<div>');
    Builder.Html.Add('  <img border="0" src="cid:laimagen" >');
    Builder.Html.Add('</div>');
    Builder.PlainText.Add('Este correo contiene una imágen para ti. '
      + 'Debes usar un visor HTML para verla');
    Builder.HtmlFiles.Add(FileName, 'laimagen');
    Msg := Builder.NewMessage();
    try
      Msg.Recipients.EMailAddresses := eRecipients.Text;
      Msg.From.Name := eFromName.Text;
      Msg.From.Address := eFromEmail.Text;
      Msg.Subject := 'Una imagen para ti';
      SMTP := TIdSMTP.Create;
      try
        SMTP.Host := eSMTPHost.Text;
        SMTP.Username := eSMTPUser.Text;
        SMTP.Password := eSMTPPass.Text;
        SMTP.Connect;
        try
          SMTP.Send(Msg);
        finally
          SMTP.Disconnect;
        end;
      finally
        SMTP.Free;
      end;
    finally
      Msg.Free;
    end;
  finally
    Builder.Free;
  end;
end;

Como puede observarse, la instancia de TIdMessageBuilderHtml se encarga de los detalles sobre adjuntar los archivos. De lo que debemos asegurarnos es de proveer un cid diferente para cada imagen incluida en el HTML de nuestro correo, y que estos identificadores se correspondan con los archivos incluidos posteriormente en la llamada al método HtmlFiles.Add, que recibe como parámetros el nombre del archivo y el cid correspondiente.

Aclaración: En mi opinión cualquier método con más de 25 líneas de código es demasiado grande y debe considerarse su refactorización. Es el caso del código publicado, sin embargo he preferido mantener un solo método para no enredar al lector con tener que seguir mentalmente las llamadas entre ellos. Como se ve, el método se encarga de todo el envío del correo, lo cuál conceptualmente también puede ser mucho para un solo método. En algo para producción, esto probablemente sería dividido en 3 distintos métodos: armar el correo HTML, configurar el mensaje y finalmente la conexión/envío/desconexión.

Enviar correo desde la línea de comandos

Hay ocasiones en las que es necesario realizar el envío de correos de manera sencilla durante la ejecución de scripts que, por ejemplo, son lanzados automáticamente por el sistema operativo.

A pesar de que esta es una tarea bastante sencilla para el programador Delphi, podría resultar algo mas complicado para otras personas (por ejemplo, administradores de servidores), además, ¿para qué re-inventar la rueda?

En mi rol de administrador de servidores linux, encontré el script sendEmail, que me ayuda a simplificar esta tarea y reduce la misma a escribir parámetros, muy sencillos, para este “comando”.

El script funciona no solo para linux, sino también para windows, como se puede ver en la imagen.

sendEmail en linux

Envío de correo en linux desde la línea de comandos

sendEmail en Windows

Envío de correo desde la línea de comandos en windows

Los correos, ya en la bandeja, de manera instantánea:

Bandeja de entrada de GMail con los correos

Bandeja de entrada de GMail

No reproduciré aquí la ayuda, solo, para evitarte el trabajo de escribir, si preferís copiar y pegar, te dejo el comando ya parametrizado:

sendEmail -f tucuenta@tudominio.com -t destinatario@sudominio.com 
-u "Asunto" -m "Texto del mensaje" -s mail.tuservidor.com 
-xu usuario@dominio.com -xp contrasenia -a adjuntos.zip

Quizas te sea de utilidad.

Hasta la próxima.