Enviar emails con formato HTML y texto plano en PHP

pere . martes 20 de septiembre de 2011. a las 08:16

enviar emails formato html texto plano php

A pesar de los tiempos que corren, muchas veces nos encontramos con gestores/servidores de correo que no interpretan bien los correos en formato HTML o directamente no lo interpretan, estos servidores suelen tratarse de algunos gestores de correos de nuestros hostings (webmail) o algunos especiales para utilizarlos con nuestros móviles o simplemente hotm*** 😛 .

Bueno esto tiene fácil solución (pensamos) se envía en texto plano y listo, pero a ver con que cara vas a tu diseñador/maquetador que se ha currado una plantilla para enviar tanto correos corporativos cómo de marketing y le dices que vas a pasar de su diseño… para evitar que nos coman vamos a intentar dejar a todo el mundo contento.

¿Y cómo lo conseguimos?

Solución a mano: mail en PHP
Pues enviamos los dos formatos, el del cuerpo con HTML y el del cuerpo con sólo el texto plano, EH! pero esperad no vamos a enviar dos e-mails!!, que decida el Servidor que correo mandar según a que persona.

Vamos a ver cómo lo haríamos con este pequeño ejemplo:

//creamos un identificador único
//para indicar que las partes son idénticas
$uniqueid= uniqid('np');

//indicamos las cabeceras del correo
$headers = "MIME-Version: 1.0\r\n";
$headers .= "From: Foo \r\n";
$headers .= "Subject: Test mail\r\n";
//lo importante es indicarle que el Content-Type
//es multipart/alternative para indicarle que existirá
//un contenido alternativo
$headers .= "Content-Type: multipart/alternative;boundary=" . $uniqueid. "\r\n";

$message = "";

$message .= "\r\n\r\n--" . $uniqueid. "\r\n";
$message .= "Content-type: text/plain;charset=utf-8\r\n\r\n";
$message .= "E-mail en Texto Plano sin formato.";

$message .= "\r\n\r\n--" . $uniqueid. "\r\n";
$message .= "Content-type: text/html;charset=utf-8\r\n\r\n";
$message .= "E-mail con <b>HTML</b>.";

$message .= "\r\n\r\n--" . $uniqueid. "--";

//con la función mail de PHP enviamos el mail.
mail('ejemplo@ejemplo.com', 'correo para todos', $message, $headers);

Cómo vemos todo va relacionado con que le indicamos a la cabecera del e-mail de que su Content-Type tiene contenido alternativo, indicándoselo con multipart/alternative, de este modo mandaremos un correo en ambos formatos y según si el correo al que es enviado soporta HTML verá la versión HTML y en el caso de que no lo admita vera el contenido alternativo y todos contentos.

En el ejemplo si os fijáis la codificación esta en utf-8 pero no es obligatorio para este funcionamiento.

$message .= "Content-type: text/html;charset=ISO-8859-1\r\n\r\n"

Todo lo que hemos explicado es para realizarlo a «mano» con la función mail de PHP pero si somos de esos que preferimos que nos lo den todo hecho en la mayoría de las librerías más utilizadas viene implementado.

Con PHPMailer
En el caso de PHPMailer tenemos la variable «altBody» que hace el papel de contenido alternativo que internamente si esta tiene valor monta lo que hemos hablado antes.

$mail = new PHPMailer();

$mail->Body = "Hola <b>HTML</b>";
$mail->AltBody = "Hola TEXTOPLANO";

Con Codeigniter y su librería email
Y si trabajamos con la librería Email de Codeigniter tenemos la función set_alt_message() que al igual que en PHPMailer ya se encarga de montar las cabeceras correspondientes.

$this->email->set_alt_message('Mensaje alternativo');

Espero que os sirva de ayuda este pequeño TIP 😉

Etiquetas: , ,

15 Comentarios
» Feed RSS de los Comentarios

  1. jose antonio dice:

    genial

  2. Victor dice:

    Muy buen Tip, lo voy a probar.

  3. Diana dice:

    Hola, muy útil

  4. Si funciona…eres mi héroe jaja

  5. Fer dice:

    Muy bueno, lindo y útil tu sitio web!. Me has aclarado muchas dudas. ¡Felicitaciones!!. Sigue así!! (;-) .

  6. kaido dice:

    excelente

  7. cHava Muoz dice:

    Hola, a mi no me funciono, no se por que, el mensaje llega así:

    –np51c20eb62dc6d
    Content-type: text/plain;charset=utf-8

    E-mail en Texto Plano sin formato.

    –np51c20eb62dc6d
    Content-type: text/html;charset=utf-8

    E-mail con HTML.

    –np51c20eb62dc6d–

  8. reicor moonstomp dice:

    el problemas viene cuando quiero adjuntar un archivo .. aun no me sale 🙁

  9. shalex dice:

    Good! solo es de meterlo a un bucle y ya tienen un servidor de correo masivo

  10. Milo dice:

    Excelente me sirvio de mucho. Gracias.

  11. Lo yo quiero hacer es lo mismos que hace esta pagina, capturar la cadena de textbox que contiene el correo del remitente para usar como correo remitente y tambien capturar la cadena que contiene el listbox y enviar como mensage, en codigo php.

    Si alguien puede ayudarme le agradecere infinitamente…

  12. Buenas, yo tengo un problema con el tema de newsletter me funciona correctamente pero cuando envio a otros correos que no son de gmail me llegan a la bandeja de SPAM.
    me podeis ayudar?
    gracias

  13. pere dice:

    Hola David! por lo que comentas puede deberse a varios motivos, «el from es un email que no tiene nada que ver con el dominio – con lo que puede que el correo interpreta suplantación y lo pone en Spam», «tu hosting este en alguna lista negra», «el envío masivo lo hagas con php a pelo y todos a la vez» o menos probable «por el contenido del mensaje».
    Un saludo!

  14. Pinto Darío dice:

    Gracias locoooo, me salvaste, genial lo tuyo

  15. JUlio dice:

    Esto es el resultado del codigo, que estoy haciendo mal?

    –np55663baee0e8d
    Content-type: text/plain;charset=utf-8

    E-mail en Texto Plano sin formato.

    –np55663baee0e8d
    Content-type: text/html;charset=utf-8

    E-mail con HTML.

    –np55663baee0e8d–

Enviar comentario