PHP posta problema di formattazione - Perché CRLF fine riga di intestazione pausa e-mail HTML in Outlook?

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

Domanda

Sto utilizzando la funzione PHP mail() nativo di inviare e-mail HTML e avere un problema nella formattazione utenti client di posta elettronica più comuni - Outlook 2007 (, oltre ad alcuni altri client di posta elettronica ) - tutti i tag HTML sono esposti così sembra incomprensibile a un non-web-developer

.

Sto inviando email HTML allo stesso modo che il PHP manuale demo IT. Esempio:

$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);

A causa testare vari client di posta elettronica è difficile, ho firmato con http://litmusapp.com/ così posso vedere uno screenshot delle email in 47 diversi client di posta elettronica. La maggior parte sono ok (per esempio Gmail, Thunderbird, Lotus Notes), ma tutte le diverse versioni di Outlook non sono ok.

Per risolvere il problema che ho avuto la formattazione fare quanto segue:

  1. Rimuovere l'intestazione $headers = "MIME-Version: 1.0\r\n"; posta.
  2. Assicurarsi io alla fine le mie intestazioni solo "\n" invece di "\r\n".

Qualcuno sa perché sto ottenendo risultati migliori con le email HTML quando non sono conformi al manuale?

Info:

  • postfix versione 2.3.3 su RHEL 5.5.
  • PHP versione 5.3.2
È stato utile?

Soluzione

:

Hai 2 soluzioni:

  1. Aggiornamento Postfix a 2,9 che ha "sendmail_fix_line_endings" (finalmente !!!) Vedi: documentazione Postfix
  2. Installa Sendmail (lavorando bene!)

Ho un'immagine VMware con uno stack LAMP. Per poter inviare e-mail, alla fine ho deciso di:

  • installare Sendmail
  • utilizzare lo smtp del mio ISP (in quanto è solo una scatola dev).

Per la parte sendmail, si possono seguire questa: http://www.geoffke.be/nieuws / 13 /

Importante : Alcuni webhosters possono utilizzare solo i pacchetti stabili che significa che puoi avere ... un Postfix di età superiore a 2.9 !!! Esempio: http://packages.debian.org/search?keywords=postfix

Altri suggerimenti

Se si utilizza postfix <2,9, si può semplicemente mettere sendmail_path = "tr -d '\r'|sendmail -t -i" in php.ini.

Ho il sospetto che è la mia versione di Postfix - la versione 2.3.3 è 5 anni e forse è la conversione LF in CRLF, ma visto che avevo già CRLF, penso di essere stato l'invio di CRCRLF a i client di posta elettronica.

Purtroppo, io non sono nella situazione di aggiornare Postfix. Quindi per il momento Ho convertito il codice per utilizzare una variabile configurabile per la fine riga in modo che sia facile da cambiare in 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);

L'email è stato interpretato come text / plain invece di html previsto. La ragione di questo è che text / html è un sottotipo multipart richiedendo così le dichiarazioni di contorno.

Il tuo codice manca un intestazione confine dichiarazione:

$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);

Controlla questa wiki su MIME & Multipart Messaggi: http://en.wikipedia.org/wiki/MIME#Multipart_messages

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top