2

我正在使用 PHP 本机mail()函数发送 HTML 电子邮件,并且在用户最常见的电子邮件客户端 - Outlook 2007以及其他一些电子邮件客户端)中存在格式问题 - 所有的 html 标记都被暴露,所以看起来像乱码非网络开发者。

我发送 HTML 电子邮件的方式与PHP 手册演示的方式相同。例子:

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

因为测试各种电子邮件客户端很困难,所以我注册了http://litmusapp.com/,所以我可以看到 47 个不同电子邮件客户端的电子邮件截图。大多数都可以(例如 gmail、thunderbird、Lotus Notes),但所有不同版本的 Outlook 都不好。

要解决格式问题,我执行了以下操作:

  1. 删除$headers = "MIME-Version: 1.0\r\n";邮件标题。
  2. \n确保我只用“ ”而不是“ ”结束我的标题\r\n

有谁知道为什么我在不符合手册的情况下使用 HTML 电子邮件会获得更好的结果?

信息:

  • 我在 RHEL 5.5 上使用postfix版本 2.3.3。
  • PHP 版本 5.3.2
4

4 回答 4

4

如果你使用postfix<2.9,你可以直接放入sendmail_path = "tr -d '\r'|sendmail -t -i"php.ini。

于 2012-02-08T14:00:44.757 回答
2

您有 2 个解决方案:

  1. 将 Postfix 升级到具有“sendmail_fix_line_endings”的 +2.9(终于!!!)参见:Postfix 文档
  2. 安装 Sendmail(工作正常!)

我有一个带有 LAMP 堆栈的 VMware 映像。为了发送电子邮件,我最终决定:

  • 安装发送邮件
  • 使用我的 ISP 的 smtp(因为它只是一个开发盒)。

对于 sendmail 部分,您可以按照以下步骤操作:http ://www.geoffke.be/nieuws/13/

重要提示:一些网络托管商可能只使用稳定的软件包,这意味着您可以拥有... 2.9 之前的 Postfix!示例:http ://packages.debian.org/search?keywords=postfix

于 2011-10-31T23:30:30.607 回答
0

我怀疑这是我的 Postfix 版本 - 版本 2.3.3已有5 年历史,也许它正在将 LF 转换为 CRLF,但看到我已经有 CRLF,我想我正在将 CRCRLF 发送给邮件客户端。

不幸的是,我无法升级 Postfix。因此,目前我已将代码转换为使用可配置变量作为行尾,以便将来轻松更改:

$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);
于 2010-08-11T07:54:02.460 回答
-1

电子邮件被解释为 text/plain 而不是预期的 html。原因是text/html是一个多部分的子类型,因此需要边界声明。

您的代码缺少标题边界声明:

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

查看有关 MIME 和多部分消息的 wiki: http ://en.wikipedia.org/wiki/MIME#Multipart_messages

于 2010-08-10T14:22:43.963 回答