我在雪豹上设置了一个本地开发环境,并设置了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脚本,有些非常简单,但同样的事情,标题始终显示在电子邮件正文中。
我认为这可能是一个后缀问题,但不确定,之前有人遇到过这类问题吗?
答案 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行终止符。