【问题标题】:How to have \n convert to newline for emailing PHP? [closed]如何将 \n 转换为换行符以通过电子邮件发送 PHP? [关闭]
【发布时间】:2015-01-31 14:55:13
【问题描述】:

我的代码如下

$ID = mysqli_real_escape_string($cnx, trim($data->id));
$MSG = mysqli_real_escape_string($cnx, trim($data->message));

$query = "REPLACE INTO mytbl ".
           "(id, msg, dateentry, status, rate) ".
           "VALUES ('$ID', '$MSG', NOW(), 'ok', '$RATE')";

$result =mysqli_query($cnx, $query) or die ("Can't execute query!");

$to = 'my@gmail.com';
$subject = 'my report';
$message = 'Message From User on:  '. $MSG  . "\r\n";
$headers = 'From: anonymous@mymail.com' . "\r\n" .
           'Reply-To: anonymous@mymail.com' . "\r\n" .
           'X-Mailer: PHP/' . phpversion();

mail($to, $subject, $message, $headers);

在我的消息 ($MSG) 中,它包含换行符,由 \n 表示。因此,当发送电子邮件时,\n 保持不变,而不是换行,它保持为 \n。我希望它是一个新行,而不是在电子邮件中显示 \n。

我已经阅读了关于How to replace \r & \n with <br/>? 的信息,并认为也许我可以使用双引号而不是单引号,并使用 nl2br,但没有成功。也许我的值来自其他地方(即 $data->message),所以我不知道如何使它成为单引号或双引号字符串。有什么需要解释的吗?

谢谢!

(注意 $MSG 既用于 DB 插入也用于发送电子邮件)

【问题讨论】:

  • 所以你是说$MSG 包含文字'\n' 转义而不是换行符?在尝试解决方法之前,请先了解这是如何发生的。 (如 stripcslashes)
  • “也许我可以使用双引号而不是单引号” - 是的,因为'\n' 会在字面上显示为\n,而使用"\n" 会给你一个换行符。
  • 你要找出$MSG是从哪里来的,找到问题的根源。
  • 谢谢大家。根据我上面的编辑,我更详细地检查了 $MSG 的行来自 mysqli_real_escape_string(...)。如果我删除 mysqli_real_escape_string,然后我得到我的新行。但是为了安全起见,我相信我需要使用 mysqli_real_escape_string ......那么我怎么能这样做,但得到我的新行?
  • 您需要向我们展示更多代码,即与查询相关的代码。如果查询“不是”来自用户输入,则不需要转义数据。如果您需要从不会作为数据库中的插入/更新的表单过滤用户输入,只需使用 PHP 的过滤器,而不是 MySQL 的过滤器。您还可以为外发邮件设置一个新变量。

标签: php email newline


【解决方案1】:

不知道 $MSG 是如何构造的,你可以试试这样:

$MSG = str_replace("\\n","\n",$MSG);

在将 $MSG 添加到您的 $message 之前。

当您希望 \n 表示换行符而不是 \\n 时,应使用双引号。

【讨论】:

  • 谢谢 Pelmetennui。它对我不起作用:(。删除 mysqli_real_escape_string 对我有用。
  • 啊,这一直困扰着我很长时间,直到我意识到 mysqli_real_escape_string 正在将所有新行“\n”更改为转义版本“\\n”。 str_replace 建议终于对我有用了!
【解决方案2】:

根据mail() 文档,正文消息必须包含包含回车的换行符。

由于您的电子邮件似乎不是多部分的(带有 HTML 正文),也就是说,至少您没有指定它是多部分的,因此您应该能够实现所需的内容

preg_replace("/(?<=[^\r]|^)\n/", "\r\n", $MSG);

它将用\r\n 替换单独站立的\n

但是,我建议不要使用mysqli_real_escape_string,因为您没有使用它来构建 SQL 语句。

【讨论】:

    【解决方案3】:

    删除 mysqli_real_escape_string 对我有用。 – 埃利耶

    ^ 正如我最初的 cmets 之后所说的那样。 ^

    摘自我的评论以结束问题:

    使用mysqli_real_escape_string() 很可能是原因。

    它是转义字符,最有可能是换行符。

    我不明白你为什么要使用它。您正在发送邮件,而不是查询数据库。去掉它。

    mysqli_real_escape_string()与发送mail()无关。

    如果查询“不是”来自用户输入,则无需转义数据。

    如果您需要从不会在 DB 中作为 INSERT/UPDATE 的表单过滤用户输入,请使用 PHP 的过滤器 http://php.net/manual/en/filter.filters.php,而不是 MySQL 的过滤器。

    您还可以为外发邮件设置一个新变量并使用 PHP 的过滤器;这就是他们的目的。

    【讨论】:

      猜你喜欢
      • 2013-03-09
      • 2011-11-11
      • 1970-01-01
      • 1970-01-01
      • 2021-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多