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.

12 Respuestas a “La clase TIdMessageBuilderHtml y el envío de correos HTML desde Delphi

  1. Que interesante clase amigo, no la conocía y parece ser potente. (y)

  2. No conocía esta clase. ¿A partir de qué versión de Indy viene incluida? por cierto, gracias por la mensión🙂

    • Edgar, no sabría decir con exactitud en que versión de INDY hizo su aparición, pero fue de las últimas de la versión 9 o quizás en la primera de la versión 10. En SVN puedo ver que hace su debut en su ubicación actual el 18 de diciembre de 2007 (rev. 2852), llegando desde el branch FreePascal port, pero dado que dicho branch ya no existe habría que hacer toda una regresión en el tiempo para saber algo más de su historia.

  3. Buen articulo yo voy a probar la funcion porque nunca he podido hacer eso de enviar correo con delphi

    • Carlos, espero que no te cueste lograrlo esta vez. Antes de intentar el envío HTML, te sugiero hacer un envío más simple, solo con el componente SMTP y de preferencia con un servidor que no requiera SSL. Poco a poco, vas metiéndole más complejidad a la vez que vas aprendiendo los conceptos que están detrás de estas tecnologías.

  4. Lo he probado y me ha funcionado “correctamente”, con un mensaje de error: el código de la linea 34 ya no debería ir, pero todo lo demás funciona. Saludos.

  5. buen dia acabo de instalar la version 10 de los indys y no cuentro la clase TIdMessageBuilderHtml es lo unico que me falta para echarlo andar

  6. Que buen ejemplo pero de que unidad de delphi son los componentes que usas para enviar el correo TIdMessageBuilderHtml; y TIdSMTP y TidMessage

    • Carlos, las unidades que debes agregar a tu clausula uses son:

      IdMessageBuilder, IdMessage, IdSMTP

      Además de otras requeridas por INDY y que ahora mismo no tengo en mente, pero que puedes hacer que el IDE agregue por ti si botas en un formulario un par de componentes TidMessage y TidSMTP, y luego grabas la unidad.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s