【问题标题】:PHP mail() docs say that I should only use LF in the body, but RFC 5322 says otherwise.PHP mail() 文档说我应该只在正文中使用 LF,但 RFC 5322 另有说明。
【发布时间】:2011-10-12 23:06:25
【问题描述】:

PHP 手册 (http://php.net/manual/en/function.mail.php) 说:

每一行都应该用 LF (\n) 分隔。线条不应该 超过 70 个字符。

但实际的 RFC 5322 给出了完全不同的信息:

2.3。正文 消息的正文只是 US-ASCII 行 人物。身体上仅有的两个限制如下:
o CR 和 LF 必须仅作为 CRLF 一起出现;他们不得出现 独立于体内。 o 正文中的字符行 必须限制为 998 个字符, 并且应该限制为 78 个字符,不包括 CRLF。

所以 - RFC 说应该只使用 \r\n。 我不明白 - php mail() 是如何在后台工作的?

【问题讨论】:

  • PHP 的开源...您可以很容易地阅读源代码并查看 mail() 正在做什么。仅仅因为 mail() 文档说以一种方式提供东西,而底层 RFC 说其他东西并不意味着 PHP 不能在内部进行一些翻译。
  • 这个错误中的某些内容可能会让您感兴趣:bugs.php.net/bug.php?id=15841 (不确定这是一个准确的答案,但您应该找到一些关于 qmail、sendmail、windows 等的信息)
  • @Marc B:当然这很容易,为什么 PHP 开发人员很难通过大量的 c 代码库?我早餐吃这样的问题。

标签: phpmailer php rfc5322


【解决方案1】:

php mail() 是如何在后台工作的?

正如您对 cionfiguration 所期望的那样。默认情况下,它只是大多数系统上 sendmail 二进制文件的包装器和一个非常简单的 MUA,其中指定了 SMTP 主机。前者在其输入中使用 LF 作为行尾,而后者则需要 CRLF 作为其输出 - 由于行尾因操作系统而异,PHP 为邮件 (LF) 提供了统一的行尾

【讨论】:

  • 我认为这正是人们所不期望的。 Rf5321/5322 明确表示 - 使用 \r\n 作为标题和正文。然后它清楚地说明 - 不要使用单个 \n 或单个 \r。为什么 PHP 选择使用 \n 而不是立即使用 \r\n 以避免双重转换 - 我不知道。
【解决方案2】:

显然 PHP mail() 必须在后台将 \n 转换为 \r\n

这类似于Perl's practice 使用\n 表示“逻辑”换行符,然后根据操作系统在内部翻译它们。由于 PHP 部分受到 Perl 的启发,因此 PHP 中存在类似机制也就不足为奇了。

【讨论】:

    猜你喜欢
    • 2013-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-04
    • 2015-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多