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 😉
genial
Muy buen Tip, lo voy a probar.
Hola, muy útil
Si funciona…eres mi héroe jaja
Muy bueno, lindo y útil tu sitio web!. Me has aclarado muchas dudas. ¡Felicitaciones!!. Sigue así!! (;-) .
excelente
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–
el problemas viene cuando quiero adjuntar un archivo .. aun no me sale 🙁
Good! solo es de meterlo a un bucle y ya tienen un servidor de correo masivo
Excelente me sirvio de mucho. Gracias.
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…
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
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!
Gracias locoooo, me salvaste, genial lo tuyo
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–