\ r \ n在有换行符时显示在我的电子邮件中

时间:2015-12-31 15:02:51

标签: php email

我不确定我在这里做错了什么。在电子邮件中,\ r \ n每次出现换行时都会显示。我需要在此代码中修改以修复它。

    public function sendSupportEmail($email, $name, $comments)
{
    //Wait until Google Apps are configured to accept from this domain
    //$to = "test@mail.com";
    $to = "test@mail.com.com";
    $subject = "Support: Support Inquiry";


    //Headers
    // To send HTML mail, you can set the Content-type header.
    $autoHeaders  = "MIME-Version: 1.0\r\n";
    $autoHeaders .= "Content-type: text/html; charset=iso-88591\r\n";
    $autoHeaders .= "From: Web Bot";
    $autoHeaders .= "<webbot@mail.com>\r\n";
    $autoHeaders .= "Reply-To: webbot@mail.com\r\n";
    $autoHeaders .= "Return-Path: webbot@mail.com\r\n";
    $autoHeaders .= "X-Mailer: PHP 5.x\r\n";


    //Print the local date
    $date = new DateTime('now', new DateTimeZone('America/Denver'));
    $datePrint =  $date->format('F j, Y, g:i a');

    //Create Text Based Message Below
    $message = "<h3>Support Inquiry sent on {$datePrint}</h3>";
    $message .= "<b>Name:</b><br>{$name}<br><br>";
    $message .= "<b>Email:</b><br><a href='mailto:{$email}'>{$name}</a><br><br>";
    $message .= "<b>Comments:</b><p>{$comments}</p>";

    //Send them the E-Mail
    return mail($to, $subject, $message, $autoHeaders);
}

2 个答案:

答案 0 :(得分:0)

对于标题($autoHeaders),\r\n是分隔各个字段的正确方法。但是$comments本身需要使用HTML <br> - 标记来表示换行符,因为您要发送HTML电子邮件(请参阅Content-Type)。

您可以使用nl2br功能:

$message = "<h3>Support Inquiry sent on {$datePrint}</h3>";
$message .= "<b>Name:</b><br>{$name}<br><br>";
$message .= "<b>Email:</b><br><a href='mailto:{$email}'>{$name}</a><br><br>";
$message .= "<b>Comments:</b><p>{" . nl2br($comments) . "}</p>";
return mail($to, $subject, $message, $autoHeaders);

此外,您可以在$comments nl2br之前&euro;上使用htmlentities()将其他字符转换为HTML实体(例如$message = "<h3>Support Inquiry sent on {$datePrint}</h3>"; $message .= "<b>Name:</b><br>{$name}<br><br>"; $message .= "<b>Email:</b><br><a href='mailto:{$email}'>{$name}</a><br><br>"; $message .= "<b>Comments:</b><p>{" . nl2br(htmlentities($comments)) . "}</p>"; return mail($to, $subject, $message, $autoHeaders); for€f.e。):

App
-Nav
--AppBar
--LeftNav
-Content
--Tests
---Tabs
----Table

请参阅Ideone sample

答案 1 :(得分:0)

无论您是否呈现HTML或基于文本的电子邮件,

\n\r代码都将在电子邮件客户端中不可见。例如,请查看本网站的源代码和Google的源代码。从技术上讲,新技术上的任何内容最后都有\n\r

\n\r对文本渲染器“Line-Feed,Carriage Return”说,它回到终端,并且基本上说“光标向下,将光标返回到行首”,就像在打字机上一样。

在直接文本文档中,这表现得与您期望的一样。但是,由于HTML是一种标记语言,因此有一些语言代码会执行此操作,并且内部换行无效。

我说上面的所有内容都指出了一个特定的事情:如果你的HTML文档中有ACTUAL换行和回车,你就不会看到它们,因为它们不是实际的文本'\ n \ r' ,\n\r是控制字符的文字表示。

所以,所有这些都说,为什么你会看到这些?如果文档中实际有文本'\ n \ r',而不是控制字符。这可能发生在几个方面,最明显的是,误解了"'之间的差异。 "解释其中的文本,扩展控制字符,变量引用等,而'则不会:

$foo = 'bar';

echo "$foo"; // 'bar'
echo '$foo'; // '$foo'
echo "\n";   // actual line-feed
echo '\n';   // the text '\n'

请参阅here for an example

我猜我$comments的实际内容包含实际文本'\ n \ r'而不包含换行符+回车符控件字符。用户实际输入的字符是'\ n \ r',或者您正在将它们插入某处。查看代码,确保在尝试使用控制字符的任何地方使用双引号。

虽然我建议清理代码以确保您没有自己插入文本“\ n \ r”,但如果实际上是USER插入这些字符,您可以使用this method清除它们。