【问题标题】:Postfix screwing up email headers!后缀搞砸了电子邮件标题!
【发布时间】:2011-01-15 01:20:21
【问题描述】:

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

经过一番挫折后,我最终让 postfix 正常工作,但现在当我的电子邮件发送标题信息时,它的标题信息被搞砸了!

我正在使用以下 php 代码:

$email = "我@我的域名"; $subject = "电子邮件测试员"; $body = "简单测试"; $header = "来自:我@mydomain \r\n"; $header .= "MIME-VERSION: 1.0\r\n"; $header .= '内容类型:文本/html;字符集=iso-8859-1' 。 "\r\n"; $phpversion = phpversion(); $header .= "X-Mailer: PHP v$phpversion\r\n"; 邮件($email,$subject,$body,$header); echo "消息已发送!";

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

我尝试了各种 php 脚本,有些非常简单,但都是一样的,标题总是显示在电子邮件正文中。

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

【问题讨论】:

  • 我试过
    \n
    行尾无济于事:(

标签: php apache email postfix-mta


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    另外,message 应该只包含 LN,即 \n。这与 PHP 文档一致。 每一行都应该用 LF (\n) 分隔。行不应超过 70 个字符。

    确保您在脚本中满足这两个条件 - 我已经尝试过实现它,最后让它与 Postfix 的默认配置一起工作。

    【讨论】:

    • 我不会使用 PHP_EOL,因为 RFC 821 明确要求行尾为 CRLF。一些邮件服务器会拒绝带有非标准行尾的邮件,例如仅限 LN(iirc qmail 会这样做)。
    • 这里我们讨论的不是 RFC,而是 PHP 和 Postfix。 PHP 明确定义,在发送到 mail() 函数的正文消息中只能使用 LN。我不知道 PHP 对此做了什么 - 可能是以正确的格式将发送到 Postfix 的最终消息转换。
    • 对于邮件正文是,但不是对于标题。摘自 PHP 文档:“多个额外的标头应使用 CRLF (\r\n) 分隔。”
    • 这正是 PHP 文档和 Postfix 中的嘶嘶声,这就是这个线程的原因。对于附加标题,使用 PHP_EOL 而不是 \r\n 要好得多。在我看来,它只影响 PHP 和 Postfix。如果有 sendmail 或其他 MTA,它可以像文档中描述的那样工作;)
    • 成功了,谢谢老兄,我刚刚看到我从来没有回复过这个,因为当我需要它的时候答案没有出现,但我刚刚测试过它并且它有效,非常感谢!
    【解决方案3】:

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

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

    从 unix 上的 sendmail 接收邮件时,Postfix 期望 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 行终止符。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-13
      • 1970-01-01
      相关资源
      最近更新 更多