PHP mail formatting issue - Why do CRLF header line endings break HTML email in Outlook?

江枫思渺然 提交于 2019-11-29 08:41:51

You have 2 solutions:

  1. Upgrade Postfix to +2.9 which has "sendmail_fix_line_endings" (finally!!!) See: Postfix documentation
  2. Install Sendmail (working fine!)

I have a VMware image with a LAMP stack. In order to send email, I finally decided to:

  • install Sendmail
  • use the smtp of my ISP (as it is only a dev box).

For the sendmail part, you can follow this: http://www.geoffke.be/nieuws/13/

IMPORTANT: Some webhosters may use only stable packages which means you can have... a Postfix older than 2.9!!! Exemple: http://packages.debian.org/search?keywords=postfix

If You use postfix<2.9, You can just put sendmail_path = "tr -d '\r'|sendmail -t -i" into php.ini.

I suspect it is my version of Postfix - version 2.3.3 is 5 years old and perhaps it is converting LF to CRLF but seeing as I had CRLF already, I think I was sending CRCRLF to the mail clients.

Unfortunately, I'm not in the situation to upgrade Postfix. So for the moment I have converted the code to use a configurable variable for the line endings so that it is easy to change in the future:

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

The email is been interpreted as text/plain instead of intended html. The reason for this is that text/html is a multipart subtype thus requiring boundary declarations.

Your code is missing a the header boundary declaration:

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

Check this wiki about MIME & Multipart Messages: http://en.wikipedia.org/wiki/MIME#Multipart_messages

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!