PHP forme des messages problème - Pourquoi les fins de ligne d'en-tête CRLF break email HTML dans Outlook?

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

Question

J'utilise la fonction de mail() PHP natif d'envoyer des e-mails HTML et un problème formatage dans les utilisateurs client de messagerie le plus courant - Outlook 2007 ( en plus de quelques autres clients de messagerie ) - toutes les balises HTML sont exposées il ressemble à du charabia pour un développeur non-web

.

J'envoyer des messages électroniques HTML de la même manière que le manuel PHP des démos il. Exemple:

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

parce que les tests différents clients de messagerie est difficile, je l'ai signé avec http://litmusapp.com/ pour Je peux voir une capture d'écran des e-mails à 47 clients de messagerie différents. La plupart sont ok (par exemple gmail, thunderbird, Lotus Notes), mais toutes les versions d'Outlook ne sont pas ok.

Pour résoudre le problème que j'avais mise en forme procédez comme suit:

  1. Supprimer l'en-tête de courrier $headers = "MIME-Version: 1.0\r\n";.
  2. Assurez-vous que je finis mes en-têtes avec seulement "\n" au lieu de "\r\n".

Quelqu'un sait pourquoi j'obtenir de meilleurs résultats avec des e-mails HTML quand je ne sont pas conformes au manuel?

Info:

  • J'utilise postfix la version 2.3.3 sur RHEL 5.5.
  • PHP version 5.3.2
Était-ce utile?

La solution

Vous avez 2 solutions:

  1. Mise à jour Postfix à +2,9 qui a "sendmail_fix_line_endings" (enfin !!!) Voir: documentation Postfix
  2. Installer Sendmail (fin de travail!)

I ont une image VMware avec une pile LAMP. Pour envoyer des courriels, je me suis finalement décidé à:

  • install Sendmail
  • utiliser le serveur SMTP de mon fournisseur d'accès Internet (comme il est seulement une boîte de dev).

Pour la partie sendmail, vous pouvez suivre ceci: http://www.geoffke.be/nieuws / 13 /

IMPORTANT : Certains peuvent utiliser uniquement hébergeurs packages stables qui signifie que vous pouvez avoir ... un Postfix plus de 2,9 !!! Exemple: http://packages.debian.org/search?keywords=postfix

Autres conseils

Si vous utilisez Postfix <2.9, vous pouvez simplement mettre sendmail_path = "tr -d '\r'|sendmail -t -i" dans php.ini.

Je pense qu'il est ma version de Postfix - la version 2.3.3 est 5 ans et peut-être il est convertissait LF à CRLF mais en voyant comme je l'avais déjà CRLF, je pense que j'envoyais à CRCRLF les clients de messagerie.

Malheureusement, je ne suis pas dans la situation de mise à niveau Postfix. Donc, pour le moment j'ai converti le code à utiliser une variable configurable pour les fins de ligne de sorte qu'il est facile de changer à l'avenir:

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

Le courriel est été interprétée comme du texte / au lieu de HTML prévu. La raison en est que text / html est un sous-type multipart qui nécessite des déclarations limites.

Votre code manque un limite en-tête Déclaration:

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

Vérifiez ce wiki sur les messages MIME & multipart: http://en.wikipedia.org/wiki/MIME#Multipart_messages

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top