新行(\ r \ n)在电子邮件正文中不起作用

时间:2013-04-17 14:51:43

标签: php email newline content-type

我正在使用PHP mail()函数:

    $to      = 'AAAA <postmaster@xxx.xx>';
    $subject = 'BBBB';
    $message = "CCCC\r\nCCCC CCCC \r CCC \n CCC \r\n CCC \n\r CCCC";
    $headers = 'From: DDD<postmaster@xxx.xx>' . "\r\n";
    $headers .= "Content-Type: text/html; charset=\"UTF-8\"; format=flowed \r\n";
    $headers .= "Mime-Version: 1.0 \r\n"; 
    $headers .= "Content-Transfer-Encoding: quoted-printable \r\n";
    mail($to, $subject, $message, $headers);

当我收到此电子邮件时,它看起来像这样:

CCCC CCCC CCCC CCC CCC CCC CCCC

我希望这样的事情:

CCCC
CCCC CCCC CCC 
CCC 
CCC 
CCCC


没有Content-Type HTTP标头,它工作正常。如何制作新行并仍然使用我的“内容类型”声明?

13 个答案:

答案 0 :(得分:80)

您需要使用<br>,因为Content-Typetext/html

它没有Content-Type标题,因为那时您的电子邮件将被解释为纯文本。如果你真的想使用\n,你应该使用Content-Type: text/plain但是你会丢失任何标记。

另请查看类似问题here

答案 1 :(得分:19)

如果您要发送HTML电子邮件,请按照说明使用&lt; BR&gt; (或&lt; BR /&gt; )。
如果您要发送纯文本电子邮件,请使用%0D%0A
\ r = %0D (Ctrl + M =回车)
\ n = %0A (Ctrl + A =换行符)

如果您的电子邮件中有电子邮件链接,则 EG

<A HREF="mailto?To=...&Body=Line 1%250D%250ALine 2">Send email</A>

然后使用%250D%250A

%25 =%

答案 2 :(得分:6)

您需要使用<br>代替\r\n。为此,您可以使用内置函数调用nl2br 所以你的代码应该是这样的

 $message = nl2br("CCCC\r\nCCCC CCCC \r CCC \n CCC \r\n CCC \n\r CCCC");

答案 3 :(得分:4)

如果您使用content-type: text/html,则需要设置<br>,因为您的邮件会像 html文件一样受到威胁。

但如果您将content-type更改为text/plain而不是text/html,则可以使用\r\n个字符。

答案 4 :(得分:1)

使用 <BR> 是不够的。如果你不通过使用

告诉outlook它是一个自我关闭的html标记,MS Outlook 2007将忽略这一点
 <BR />

答案 5 :(得分:1)

您可以使用%0A 字符代码在text / plain内容类型中添加换行符。

例如:

<a href="mailto:someone@example.com?subject=Hello%20again&body=HI%20%0AThis%20is%20a%20new%20line"/>

以下是jsfiddle

答案 6 :(得分:0)

这对我有用。

$message  = nl2br("
===============================\r\n
www.domain.com \r\n
===============================\r\n
From: ".$from."\r\n
To: ".$to."\r\n
Subject: ".$subject."\r\n
Message: ".$_POST['form-message']);

答案 7 :(得分:0)

' '   
当我添加' \r\n'的空格开始工作

时,

我的情况下缺少空格

答案 8 :(得分:0)

另一件事使用&#34;&#34;,&#34; \ r \ n&#34;之间存在差异。和&#39; \ r \ n&#39;。

答案 9 :(得分:0)

如果在标题中使用content-type: text/plain,则\ n \ r产生2行,而\ n,\ r和n产生单行。

当心:如果您执行以下php代码:

    $message='ab<br>cd<br>e<br>f';
print $message.'<br><br>';
    $message=str_replace('<br>',"\r\n",$message);
print $message;

您在Windows浏览器中会看到以下内容:

ab
cd
e
f

ab cd e f

并通过content-type: text/plain在电子邮件输出中获得以下内容;

ab
cd
e
f

答案 10 :(得分:0)

对于邮件功能中的文本/纯文本邮件,绝对使用PHP_EOL常量,对于文本/ html文本,您也可以将其与
结合使用:

$messagePLAINTEXT="This is my message."
. PHP_EOL .
"This is a new line in plain text";

$messageHTML="This is my message."
. PHP_EOL . "<br/>" .
"This is a new line in html text, check line break in code view";

$messageHTML="This is my message."
. "<br/>" .
"This is a new line in html text, no line break in code view";

答案 11 :(得分:0)

OP的问题与HTML编码有关。但是,如果您使用的是纯文本,请使用“ \ n”而不是“ \ r \ n”。

我的个人用例:使用mailx邮件程序,只需将“ \ r \ n”替换为“ \ n”即可解决我的问题,这与错误的自动Content-Type设置有关。

错误的标题:

User-Agent: Heirloom mailx 12.4 7/29/08
MIME-Version: 1.0
Content-Type: application/octet-stream
Content-Transfer-Encoding: base64

正确的标题:

User-Agent: Heirloom mailx 12.4 7/29/08
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit

我并不是说“ application / octet-stream”和“ base64”总是错误/不需要的,但是在我看来,它们在哪里。

答案 12 :(得分:0)

$mail = new PHPMailer;
$mail->isSMTP(); 
$mail->isHTML(true);

工作后插入此代码 所有 html 标签如

<br> <p> in $mail->Body='Hello<br> how are you ?<b>';