Postfix搞砸了电子邮件标题!

时间:2010-02-09 23:32:23

标签: php apache email postfix-mta

我在雪豹上设置了一个本地开发环境,并设置了postfix以通过我的isp邮件服务器发送电子邮件。

我终于在很多挫折之后得到了postfix工作,但是现在当我的电子邮件发送时,标题信息已经结束了!

我正在使用以下php代码:

$email = "me@mydomain";
$subject = "Email tester";
$body = "Simple test";
$header = "From: me@mydomain \r\n";
$header .= "MIME-VERSION: 1.0\r\n";
$header .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";
$phpversion = phpversion();
$header .= "X-Mailer: PHP v$phpversion\r\n";
mail($email,$subject,$body,$header);

echo "message sent!";

To:和Subject:标题在标题中显示,但其余部分显示在电子邮件正文中。这使得电子邮件看起来像电子邮件客户端中的from字段是空的。

我尝试了各种各样的PHP脚本,有些非常简单,但同样的事情,标题始终显示在电子邮件正文中。

我认为这可能是一个后缀问题,但不确定,之前有人遇到过这类问题吗?

3 个答案:

答案 0 :(得分:3)

这几乎100%不是Postfix问题,而是由您的代码引起的问题。一旦在标题后看到空白CRLF,身体就会开始。

您应该转储您的电子邮件正文,看看您是否不小心引入了额外的CRLF。

答案 1 :(得分:3)

在* additional_headers *中使用PHP_EOL而不是\ r \ n,在您的示例中使用$ header。 PHP_EOL将相应地替换换行符到您正在运行的操作系统。

此外,消息应仅包含LN,即\ n。这相当于PHP文档。 每行应使用LF(\ n)分隔。行不应超过70个字符。

确保您在脚本中同时满足这两个标准 - 我已尝试实现它并最终使用Postfix的默认配置。

答案 2 :(得分:0)

进一步研究这个问题(基本上是因为我不想仅仅因为这个而改进了很多脚本),我发现PHP和Postfix开发人员之间存在很强的冲突,直到现在。你可以在这里阅读广泛的信息:

http://www.mail-archive.com/postfix-users@postfix.org/msg03226.html

Postfix希望在unix和sendmail上从sendmail收取邮件时,EOL为LF 发送时用CRLF替换它。 当它获得CRLF时,它仍然取代了 LF和我们得到CRCRLF

它解释了已损坏的标题。要解决此问题,您必须确切了解Postfix和PHP /邮件系统的工作原理。如果您遇到上述问题,只需使用“\ n”而不是“\ r \ n”。如果您编写一个可以在Windows / Unix上运行的复杂系统,只需引入一个额外的参数,例如$ eeol =“\ r \ n”;它将被放置而不是直接的“\ r \ n”标签,并且可以为任何系统轻松配置。

我想这是Postfix作者推荐的方法:

如果PHP应用程序编程人员以一致的方式格式化电子邮件,那将是非常好的。例如,他们可以使用包含END-OF-LINE终结符的变量,而不是在整个地方硬编码LF或CRLF行终止符。