PHP problema de formato electrónico - ¿Por qué el correo electrónico HTML CRLF finales de línea de cabecera ruptura en Outlook?

StackOverflow https://stackoverflow.com/questions/3449431

Pregunta

Estoy usando la función PHP mail() nativa para enviar mensajes de correo electrónico HTML y tienen un problema de formato en el cliente de correo electrónico a los usuarios más común - Outlook 2007 (, además de algunos otros clientes de correo electrónico ) - todas las etiquetas hTML están expuestos por lo que parece un galimatías a un no-desarrollador web

.

Voy a enviar correo electrónico HTML de la misma manera que el PHP Manual demostraciones de TI. Ejemplo:

$message  = get_HTML_email_with_valid_formatting();
$headers  = "MIME-Version: 1.0\r\n";
$headers .= "Content-Type: text/html; charset=UTF-8\r\n";
$headers .= "From: example.com <info@example.com>\r\n";
$headers .= "Reply-To: donotreply@example.com\r\n";
mail('me@example.com', 'test', $message, $headers);

Debido a probar varios clientes de correo electrónico es difícil, he firmado con http://litmusapp.com/ por lo puedo ver una captura de pantalla de los mensajes de correo electrónico en 47 diferentes clientes de correo electrónico. La mayoría son bien (por ejemplo, Gmail, Thunderbird, Lotus Notes), pero todas las diferentes versiones de Outlook no están bien.

Para solucionar el problema de formato que tenía hacer lo siguiente:

  1. Eliminar la cabecera del correo $headers = "MIME-Version: 1.0\r\n";.
  2. Asegúrese de que termino mis cabezales de manera única "\n" en lugar de "\r\n".

¿Alguien sabe porqué estoy consiguiendo mejores resultados con mensajes de correo electrónico HTML cuando no estén conformes con el manual?

Información:

  • de sufijo versión 2.3.3 en RHEL 5.5.
  • PHP versión 5.3.2
¿Fue útil?

Solución

Usted tiene 2 soluciones:

  1. Actualizar a Postfix 2.9 que tiene "sendmail_fix_line_endings" (por fin !!!) Ver: documentación Postfix
  2. Instalar Sendmail (que trabaja muy bien!)

Tengo una imagen de VMware con una pila LAMP. Con el fin de enviar un correo electrónico, finalmente me decidí a:

  • instalar Sendmail
  • utilizar el SMTP de mi ISP (ya que es sólo una caja dev).

En la parte Sendmail, se puede seguir el siguiente: http://www.geoffke.be/nieuws / 13 /

IMPORTANTE : Algunos alojamientos web únicamente podrán utilizar paquetes estables que significa que puede tener un ... Postfix mayores de 2.9 !!! Ejemplo: http://packages.debian.org/search?keywords=postfix

Otros consejos

Si se utiliza postfix <2,9, se puede simplemente poner sendmail_path = "tr -d '\r'|sendmail -t -i" en php.ini.

Sospecho que es mi versión de Postfix - versión 2.3.3 está 5 años y tal vez es la conversión de LF a CRLF pero viendo que tuve CRLF ya, creo que estaba enviando a CRCRLF los clientes de correo.

Por desgracia, no estoy en la situación de actualizar Postfix. Así que por el momento me he convertido el código para utilizar una variable configurable para los finales de línea para que sea fácil de cambiar en el futuro:

$eol = "\n";
$message  = get_HTML_email_with_valid_formatting();
$headers  = "MIME-Version: 1.0".$eol;
$headers .= "Content-Type: text/html; charset=UTF-8".$eol;
$headers .= "From: example.com <info@example.com>".$eol;
$headers .= "Reply-To: donotreply@example.com".$eol;
mail('me@example.com', 'test', $message, $headers);

El correo electrónico se ha interpretado como text / plain en lugar de HTML previsto. La razón de esto es que text / html es un subtipo de varias partes por lo que requiere declaraciones de contorno.

Su código le falta un cabecera límite declaración:

$message  = get_HTML_email_with_valid_formatting();
$headers  = "MIME-Version: 1.0\r\n";
$headers .= "--$boundary\r\n"."Content-Type: text/html; charset=ISO-8859-1\r\n";
$headers .= "From: example.com <info@example.com>\r\n";
$headers .= "Reply-To: donotreply@example.com\r\n";
mail('me@example.com', 'test', $message, $headers);

Marque esta wiki sobre MIME multiparte y mensajes: http://en.wikipedia.org/wiki/MIME#Multipart_messages

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top