【问题标题】:php mail() headers prevent email from sendingphp mail() 标头阻止电子邮件发送
【发布时间】:2016-04-06 23:26:54
【问题描述】:

我不会说谎的。我真的不明白我在这个邮件功能的标题中使用的一些代码。我一直在尝试自己修复它,其中一些代码是从其他论坛帖子等复制而来的。

$email$subject$msg 变量都很好,当我之前只用这 3 个变量测试它们时,电子邮件正在发送。然后我为“发件人”部分添加了一个标题,并且发件人姓名已修复(但电子邮件进入了我的垃圾文件夹 - 烦人)。

现在我正在尝试将一些 html 标记添加到 $msg 并按照其他论坛帖子使用我的 $header 变量的最后两行,但这只是阻止了电子邮件的发送。请告诉我如何解决这个问题。

$headers = "From: website <donotreply@website.com>" . PHP_EOL .
"BCC: customer1@hotmail.com" . PHP_EOL . 
"MIME-Version: 1.0 \r\n" . PHP_EOL . 
"Content-Type: text/html; charset=UTF-8' \r\n";

$email = "SomeEmail@hotmail.com";
$subject = "Weekly Newsletter";
mail($email, $subject, $msg, $headers);

感谢我评论部分提醒我发布错误的人。它说:

警告:mail():在 /path/publishnewsletter.php 第 45 行的 additional_header 中发现多个或格式错误的换行符

【问题讨论】:

  • 您遇到错误了吗?
  • 请检查 Apache error.log 和邮件日志并发布错误?
  • 我知道我忘了在问题中添加一些内容。谢谢 - 警告:mail():在 /path/publishnewsletter.php 第 45 行的 Additional_header 中发现多个或格式错误的换行符
  • PHP_EOL ... 不要使用那个

标签: php email smtp html-email email-headers


【解决方案1】:

"MIME-Version: 1.0 \r\n" . PHP_EOL . 换行过多。根本不要使用PHP_EOL;使用\r\n,并且只能使用一次。

charset 之后还有一个额外的单引号。

$headers =
    "From: website <donotreply@website.com>\r\n" .
    "BCC: customer1@hotmail.com\r\n" . 
    "MIME-Version: 1.0\r\n" . 
    "Content-Type: text/html; charset=UTF-8";

【讨论】:

    【解决方案2】:

    看看这个可能有帮助

    • 清理您的标题。 additional_headers 参数中没有多个换行符。这些算作“多个或格式错误的换行符”:\r\r, \r\0, \r\n\r\n, \n\n, \n\0
    • 仅将additional_headers 用于标头。电子邮件消息(是否包含多部分,带有不带附件的 ir 等)属于 message 参数,而不是标题。
    • 并且不要使用PHP_EOL

    PHP 安全漏洞报告:https://bugs.php.net/bug.php?id=68776
    C 代码差异如何修复:http://git.php.net/?p=php-src.git;a=blobdiff;f=ext/standard/mail.c;h=448013a472a3466245e64b1cb37a9d1b0f7c007e;hp=1ebc8fecb7ef4c266a341cdc701f0686d6482242;hb=9d168b863e007c4e15ebe4d2eecabdf8b0582e30;hpb=eee8b6c33fc968ef8c496db8fb54e8c9d9d5a8f9

    【讨论】:

    • 这是正确的答案,但也:一个\n就足够了。不需要任何 \r 。 FWIW,如果您在 PHP 中的新行上只有下一行文本,则 mail 命令也会生成一个换行符,从字面上输入您的标题,并在行之间返回并且根本没有任何 \n 换行符。它使它更具可读性。
    • “仅将附加标题用于标题。电子邮件消息(是否包含多部分,带 ir 不带附件等)属于消息参数,而不是标题。”问题中是否有迹象表明......?
    • 对不起,如果我发布了一些错误的东西@RyanO'Hara
    • @joshstrike: php.net/mail: “多个额外的标题应该用 CRLF (\r\n) 分隔。 … 如果未收到消息,请尝试仅使用 LF (\n)。 … 这应该是最后的手段,因为它不符合 » RFC 2822。”
    猜你喜欢
    • 1970-01-01
    • 2013-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-03
    • 2011-04-22
    相关资源
    最近更新 更多