Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/255.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php mail()头是否必须以换行符终止?(增发邮件)_Php_Email_Line Breaks - Fatal编程技术网

Php mail()头是否必须以换行符终止?(增发邮件)

Php mail()头是否必须以换行符终止?(增发邮件),php,email,line-breaks,Php,Email,Line Breaks,我正在使用发送UTF8电子邮件的功能。 由于至少有一个收件人对我的函数发送的电子邮件有问题(不是UTF8,因此特殊字符已断开;一些邮件标题出现在正文中),我想知道是否必须在标题字符串的末尾另加一个换行符: function mail_utf8($to, $subject = "(No subject)", $message = "", $header = "") { $header_ = 'MIME-Version: 1.0'."\r\n".'Content-type: text/plai

我正在使用发送UTF8电子邮件的功能。 由于至少有一个收件人对我的函数发送的电子邮件有问题(不是UTF8,因此特殊字符已断开;一些邮件标题出现在正文中),我想知道是否必须在标题字符串的末尾另加一个换行符:

function mail_utf8($to, $subject = "(No subject)", $message = "", $header = "")
{
   $header_ = 'MIME-Version: 1.0'."\r\n".'Content-type: text/plain; charset=UTF-8'."\r\n";
   $header_ .= "From: my@mail.com"; //Should be optional...
   if (!empty($header)) $header_ .= "\r\n".$header;
   $out = mail($to, '=?UTF-8?B?'.base64_encode($subject).'?=', $message, $header_);

   return $out;
}
那么什么是正确的-
mail\u utf8(“x@y.z“,”“,”等等“)
邮件x@y.z“,”“,”等等“\r\n”)

编辑:这类问题的明显资源——www.php.net/mail——只在示例4中使用了这样的换行符,而在示例2中则不同

Edit2:以下是当前版本。更多信息请参见评论

function mail_utf8($to, $subject = "(No subject)", $message = "", $header = "")
{
$linebreak = PHP_EOL; //Seems to work everywhere, including IncrediMail
$linebreak = "\n"; //Debug
$header_ = 'MIME-Version: 1.0'.$linebreak.'Content-type: text/plain; charset=UTF-8'.$linebreak;
$header_ .= "From: my@mail.com".$linebreak;
if (!empty($header)) $header_ .= $header.$linebreak; //Last line break !?
$out = mail($to, '=?UTF-8?B?'.base64_encode($subject).'?=', $message, $header_);

return $out;
}

尝试用
\n
而不是
\r\n
终止每个标题行

如果未收到消息,请尝试仅使用LF(\n)。一些穷人 高质量的Unix邮件传输代理自动将LF替换为CRLF (如果使用CRLF,将导致CR加倍)。这应该是最后一次了 度假村,因为它不符合»


来源:

尝试用
\n
而不是
\r\n
终止每个标题行

如果未收到消息,请尝试仅使用LF(\n)。一些穷人 高质量的Unix邮件传输代理自动将LF替换为CRLF (如果使用CRLF,将导致CR加倍)。这应该是最后一次了 度假村,因为它不符合»


来源:

我认为你不能像在第5行那样在页眉顶部传递换行符,并且尽量避免使用大量引号,这看起来很混乱

一个重新分解的函数示例:

  function mail_utf8($to, $subject = "(No subject)", $message = "", $header = "") {
    $header_  = "MIME-Version: 1.0\r\nContent-type: text/plain; charset=UTF-8\r\n";
    $header_ .= "From: my@mail.com\r\n";
    if(!empty($header)) $header_ .= $header;
    $out = mail($to, '=?UTF-8?B?'.base64_encode($subject).'?=', $message, $header_);
    return $out;
  }

我认为你们不能像在第5行那个样,在页眉顶部通过一个换行符,并尽量避免大量的引号,这看起来很混乱

一个重新分解的函数示例:

  function mail_utf8($to, $subject = "(No subject)", $message = "", $header = "") {
    $header_  = "MIME-Version: 1.0\r\nContent-type: text/plain; charset=UTF-8\r\n";
    $header_ .= "From: my@mail.com\r\n";
    if(!empty($header)) $header_ .= $header;
    $out = mail($to, '=?UTF-8?B?'.base64_encode($subject).'?=', $message, $header_);
    return $out;
  }

您在代码中两个都没有使用。“一些邮件标题出现在正文中”部分让我觉得您的标题中可能有空行,类似于
“内容类型:text/plain;charset=UTF-8\r\n\r\n其他标题:value”
。我会将
\r\n
附加到
From:
行,并确保
$headers
参数不以
\r\n
@binaryLV:开头,正如我在下面所写的,incremidMail(电子邮件客户端-而不是邮件服务器)似乎在“MIME版本:1.0”之后生成第一个双行分隔符,这将解释为什么“内容类型:…”是第一条正文行(同样,仅限增量邮件)。但是使用“\n”而不是“\r\n”,我不再符合标准了,对吗?(1)我仍然建议将那个
“\r\n”
$header.=“\r\n”$header语句到
$header.=“From:my@mail.com";,这可能会在从以下位置删除设置时节省一些麻烦:
。(2) 至于不符合标准,以某种方式获取接收到的消息的原始源是值得的。您的MTA可能确实将
\r\n
替换为
\r\n
(如其他人所述),但某些客户端可能能够处理此类情况。如果您可以获得收到的消息的原始来源,那么在PHP中使用
\r\n
时,您可以检查是否有
\r\n
\r\n
。@binaryLV:我已经查看了使用十六进制编辑器的Thunderbird下载的最后一封电子邮件。无论我是否将$linebreak(参见第一篇文章中的Edit2)设置为“\r\n”或“\n”-标题中都有一个CRLF(13,10)作为分隔符-这是应该的。在增量邮件中,只有“\n”(或PHP\u EOL)是这种情况。使用“\r\n”时,没有您提到的CRLF(13、13、10)!但是最后一个标题行是“Content Type:”,后面是一个空行(CRLFCRLF=13,10,13,10),然后是“Content Type:text/plain…”(这是我的标题,请注意小写的T)。那么TB是修复它还是IM破坏它呢?好吧,你在代码中都没有使用。“一些邮件标题出现在正文中”的部分让我觉得你的标题中可能有空行,比如
“内容类型:text/plain;charset=UTF-8\r\n\r\n另一个标题:value”
。我会将
\r\n
附加到
From:
行,并确保
$headers
参数不以
\r\n
@binaryLV:开头,正如我在下面所写的,incremidMail(电子邮件客户端-而不是邮件服务器)似乎在“MIME版本:1.0”之后生成第一个双行分隔符,这将解释为什么“内容类型:…”是第一条正文行(同样,仅限增量邮件)。但是使用“\n”而不是“\r\n”,我不再符合标准了,对吗?(1)我仍然建议将那个
“\r\n”
$header.=“\r\n”$header语句到
$header.=“From:my@mail.com";,这可能会在从以下位置删除设置时节省一些麻烦:
。(2) 至于不符合标准,以某种方式获取接收到的消息的原始源是值得的。您的MTA可能确实将
\r\n
替换为
\r\n
(如其他人所述),但某些客户端可能能够处理此类情况。如果您可以获得收到的消息的原始来源,那么在PHP中使用
\r\n
时,您可以检查是否有
\r\n
\r\n
。@binaryLV:我已经查看了使用十六进制编辑器的Thunderbird下载的最后一封电子邮件。无论我是否将$linebreak(参见第一篇文章中的Edit2)设置为“\r\n”或“\n”-标题中都有一个CRLF(13,10)作为分隔符-这是应该的。在增量邮件中,只有“\n”(或PHP\u EOL)是这种情况。使用“\r\n”时,没有您提到的CRLF(13、13、10)!但是最后一个标题行是“Content Type:”,后面是一个空行(CRLFCRLF=13,10,13,10),然后是“Content Type:text/plain…”(这是我的标题,请注意小写的T)。那么TB是修复它还是IM破坏它呢?我会将
\r\n
添加到
From:
行中。我不会在最终标题的顶部使用换行符。我的代码和你的代码的区别在于