PHPMailer忽略\ r \n

Rya*_*yan 6 php formatting phpmailer

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

This is some email information. \r\n This is some more email information.
Run Code Online (Sandbox Code Playgroud)

收到的电子邮件显示的是带有\ 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;
} 
Run Code Online (Sandbox Code Playgroud)

我的问题:如何使用PHPMailer正确格式化\ r \n?这是PHPMailer设置还是我在代码中做错了什么?

wic*_*jar 7

这可能只是在最初准备消息时使用单引号而不是双引号的简单情况.

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

使用双引号将解决问题.

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

Line 1\r\nLine 2
Run Code Online (Sandbox Code Playgroud)

while $message = "Line 1\r\nLine 2";(双引号)将输出为

Line 1
Line 2
Run Code Online (Sandbox Code Playgroud)

即使使用AltBody发送电子邮件的HTML和纯文本版本,这对我也有用.


小智 6

只需在字符串上制作 nl2br() ......但是在 phpmailer 之外......然后将字符串写入正文“”; 并且不需要使用 preg_replace 或类似的东西。

我会一步一步解释

$string = nl2br($_POST["message"]);

之后在php mailer的正文中这样写

$mail->Body = "$string";

并且它.. 如此简单......好吧


小智 5

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

  • 删除 AltBody 似乎有效。我真的很感激在这方面的努力和帮助。 (5认同)
  • 尝试删除 AltBody,因为它仅用于 html 电子邮件 (2认同)

Goo*_*ose 5

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

删除AltBody已经奏效.看起来像这样.

$mail->AltBody = 'This is the body in plain text for non-HTML mail clients';
Run Code Online (Sandbox Code Playgroud)

这似乎是$ mail-> isHTML()设置为true或false的情况.我不确定为什么会出现这种情况.也许客户我和Ryan发送只接受纯文本电子邮件,AltBody不仅发送纯文本,而且实际上删除了换行符.如果您需要发送一条HTML消息,如果客户端无法接受标签,则不会显示标签,那么我怀疑您要么必须使用它,要么深入了解PHPMailer代码