电子邮件正文中的换行符(\r\n)无法正常工作

80

我正在使用 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);
当我收到这封邮件时,它看起来像这样:

When I receive this email it looks like this:

CCCC CCCC CCCC CCC CCC CCC CCCC

我期望的是这样的:

CCCC
CCCC CCCC CCC 
CCC 
CCC 
CCCC


没有设置Content-Type HTTP头也能正常工作。我怎样才能在设置了 "Content-Type" 声明的情况下仍然制造新行?


8
请将文本从英语翻译成中文。仅返回翻译后的文本:text/html !== plain text - 如果您想在text/html中换行,可以使用<br /> - Mark Baker
我使用了text/plain而不是text/html,一切都按预期工作。谢谢! - Verbatus
可能是Newline showing up on screen but not in email的重复问题。 - KatieK
我的问题是Outlook决定“删除此消息中的额外换行符”。 - Thomas
13个回答

147
你需要使用<br>,因为你的Content-Typetext/html
如果没有Content-Type头部,它也可以工作,但是你的电子邮件将被解释为纯文本。如果你真的想使用\n,你应该使用Content-Type: text/plain,但这样你会失去任何标记。
还有,请查看这个类似的问题

5
<pre>标签也能起作用吗?为了创建电子邮件的文本和HTML版本,是否只需使用<pre></pre>标签来包裹文本比用 \ n 替换 <br/> 更好/更不容易出错? - Anthony Chuinard
1
@AnthonyChuinard <pre></pre> 对我有用! - Gayle
<pre></pre>将允许您的文本/HTML正文包含一些预格式化文本,同时保留其余内容的HTML标签。 <pre> CCCC \ r \ n CCCC CCCC \ r CCC \ n CCC \ r \ n CCC \ n \ r CCCC </pre> - negrotico19

43
如果您在发送HTML电子邮件,则使用如下所述的<BR>(或<BR />,或</BR>)标签。如果您要发送纯文本电子邮件,则使用%0D%0A。其中,\r表示回车(Ctrl+M),\n表示换行(Ctrl+A)。如果您的电子邮件中存在电子邮件链接,例如:EG。
<A HREF="mailto?To=...&Body=Line 1%250D%250ALine 2">Send email</A>

然后使用%250D%250A

%25 = %


10

你需要使用<br>代替\r\n。你可以使用内置函数调用nl2br来实现。 因此你的代码应该像这样:

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

5

仅仅使用<BR>并不总是足够的。如果您不告诉Outlook它是一个自闭合的HTML标签,Outlook 2007将忽略它。

 <BR />

1
这在今天的2019年12月30日仍然非常正确!感谢您的发布。我已经挠了几分钟的头,然后找到了这个!!对于一些已经遵循所有建议的人来说,这就是解决方案!可惜<BR>格式并不普遍遵循! - Nandostyle

5
如果您使用content-type: text/html,则需要添加一个<br>,因为您的消息将被视为 html文件
但是,如果您将content-type更改为text/plain而不是text/html,则可以使用\r\n字符。

4

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

例如:

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

这里是jsfiddle


1

对于邮件函数中的纯文本邮件,一定要使用PHP_EOL常量,您还可以将其与<br/>结合使用以进行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";

1
这对我有用。
$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']);

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

在所有的HTML标签工作完成后,插入以下代码。
<br> <p> in $mail->Body='Hello<br> how are you ?<b>';

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" 总是错的或不需要的,但在我的情况下它们是。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接