PHPMailer正在忽略\r\n

PHPMailer正在忽略\r\n,php,formatting,phpmailer,Php,Formatting,Phpmailer,我目前收到的电子邮件使用纯文本电子邮件从PHPMailer发送,有问题。我目前正在通过获取行并保存到变量$message中,从数据库返回电子邮件消息。数据库中的消息格式如下: This is some email information. \r\n This is some more email information. 收到的电子邮件显示了带有\r\n的消息,而不是返回新行 我的PHPMailer代码与以下代码类似: $subject = $row['subject']; $message

我目前收到的电子邮件使用纯文本电子邮件从PHPMailer发送,有问题。我目前正在通过获取行并保存到变量$message中,从数据库返回电子邮件消息。数据库中的消息格式如下:

This is some email information. \r\n This is some more email information.
收到的电子邮件显示了带有\r\n的消息,而不是返回新行

我的PHPMailer代码与以下代码类似:

$subject = $row['subject'];
$message = $row['message'];

// PHP Mailer
$mail = new PHPMailer();
$mail->From = "noreply@mywebsite.org";
$mail->FromName = "MyWebsite.org";
$mail->AddAddress('recipient@email.com');
$mail->ContentType = 'text/plain';
$mail->IsHTML(false);
$mail->Subject = $subject;
$mail->Body = $message;
$mail->AltBody = $message;
if(!$email->Send()){
    echo "Mailer Error: " . $mail->ErrorInfo;
} 

我的问题:如何使用PHPMailer \r\n正确格式化?这是PHPMailer设置还是我的代码有问题?

看起来您已将
\r\n
作为文本保存到数据库中-PHP不会解析该设置。实际上,您需要在数据库中的“消息”中保存一行新词

Ryan在另一个答案的评论中提到了这一点,但我对此感到很挣扎,觉得这应该是自己的答案

拆下车身已起作用。看起来像这样

$mail->AltBody = 'This is the body in plain text for non-HTML mail clients';

无论$mail->isHTML()设置为true还是false,似乎都是这样。我不知道为什么会这样。也许我和Ryan发送的客户只接受纯文本电子邮件,而AltBody不仅发送纯文本,而且实际上删除了换行符。如果您需要发送一条HTML消息,如果客户端无法接受标记,则该消息将不会显示标记,那么我怀疑您将不得不接受它,或者深入研究PHPMailer代码,这可能只是在最初准备消息时使用单引号而不是双引号的简单情况

使用单引号将导致\r\n作为字符串的一部分存储在数据库中,然后PHPMailer将在电子邮件中输出,\r\n而不是实际的换行符

使用双引号可以解决这个问题

例如,
$message='Line 1\r\n Line 2'(单引号)
将输出为

Line 1\r\nLine 2
Line 1
Line 2
$message=“第1行\r\n第2行”(双引号)
将输出为

Line 1\r\nLine 2
Line 1
Line 2
这对我来说很有用,即使使用AltBody发送HTML和纯文本版本的电子邮件。

$body=stripcslashes(isset$body)
$body = stripcslashes(isset($body) 
? 
preg_replace('#(\\\r|\\\r\\\n|\\\n)#', '<br/>', $body) 
: 
false);
$body = str_replace("<br/><br/>","<br/>",$body);
? preg#u replace(“#”(\\\r|\\\r\\\n\\\\n)\#“,“
,$body) : 假); $body=str_replace(“

,“
,$body”);
这对我有用

只需在字符串上生成nl2br()。。。但是从phpmailer。。。然后将字符串写入正文“”;而且不需要使用preg_replace或类似的东西

我会一步一步地解释

$string=nl2br($_POST[“message”])

之后,在php mailer的主体中编写如下内容

$mail->Body=“$string”


而且它。。这么简单……好吧,这是一个老问题,但提供的解决方案对我不起作用。不过,以下内容确实有效,因此我认为可能值得分享


$body=nl2br($body)

您可能确实将
\r\n
作为字符串写入了字段中的值,而应该使用字符10(相当于
\n
)&13(相当于`\r´)。因此,您应该纠正在数据库中插入thi的方式,对于现有记录,或者以这种方式更新它们,或者调整输出代码以使用它们引用的chracater替换转义字符串。$message=str_replace(数组('\r','\n'),数组(“\n',“\n”),$row['message'];应该help@AdamFischer已删除电子邮件中显示的\r\n。但是,在发生\r\n的位置不存在换行符。抱歉,$message=str_replace(数组('\r','\n')、数组(chr(10)、chr(13))、$row['message']);这应该对您有效。请尝试删除AltBody,因为它仅用于html电子邮件。删除AltBody似乎有效。我真的很感谢你在这方面的努力和帮助!不知何故,当AltBody未设置时,当正文为纯文本时,它尊重换行符,如果您设置它,则不会!奇怪…StackOverflow支持使用Markdown()将语法高亮显示应用于代码示例。真的吗?这解决了我的问题!我只需要用nl2br转换消息体。非常感谢。是的,但那不再是一封纯文本邮件了。那是HTML。是的,但那不再是纯文本电子邮件了。那是HTML。是的,但那不再是纯文本电子邮件了。这是HTML。使用单引号和双引号确实会对PHP的解释方式产生影响\r\n。谢谢,这解决了我的问题。