【问题标题】:New lines (\r\n) are not working in email body新行 (\r\n) 在电子邮件正文中不起作用
【发布时间】:2013-04-10 09:48:19
【问题描述】:

我正在使用 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);

当我收到这封电子邮件时,它看起来像这样:

CCCC CCCC CCCC CCC CCC CCC CCCC

我希望是这样的:

CCCC
CCCC CCCC CCC 
CCC 
CCC 
CCCC


如果没有 Content-Type HTTP 标头,它可以正常工作。我怎样才能在换行的同时仍然使用我的“Content-Type”声明?

【问题讨论】:

  • text/html !== 纯文本 - 如果您想在 text/html 中换行,请使用 &lt;br /&gt;
  • 我使用 text/plain 代替 text/html 并且一切都按预期工作。谢谢!
  • 我的问题是 Outlook 决定“删除此消息中的额外换行符”

标签: php email newline content-type


【解决方案1】:
$mail = new PHPMailer;
$mail->isSMTP(); 
$mail->isHTML(true);

工作后插入此代码 所有的html标签都喜欢

<br> <p> in $mail->Body='Hello<br> how are you ?<b>';

【讨论】:

    【解决方案2】:

    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”总是错误/不需要的,但在我的情况下它们在哪里。

    【讨论】:

      【解决方案3】:

      如果您要发送 HTML 电子邮件,请按照说明使用
      (或
      ,或 ) .
      如果您要发送纯文本电子邮件,请使用 %0D%0A
      \r = %0D(Ctrl+M = 回车)
      \n = %0A(Ctrl+A = 换行)

      如果您的电子邮件中有电子邮件链接,
      例如

      <A HREF="mailto?To=...&Body=Line 1%250D%250ALine 2">Send email</A>
      

      然后使用%250D%250A

      %25 = %

      【讨论】:

        【解决方案4】:

        对于邮件函数中的文本/纯文本邮件,肯定使用 PHP_EOL 常量,对于 text/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";
        

        【讨论】:

          【解决方案5】:

          您需要使用&lt;br&gt;,因为您的Content-Typetext/html

          它可以在没有Content-Type 标头的情况下工作,因为这样您的电子邮件将被解释为纯文本。如果你真的想使用\n,你应该使用Content-Type: text/plain,但是你会丢失任何标记。

          也可以查看类似的问题here

          【讨论】:

          • &lt;pre&gt; 标签也可以工作吗?同时创建电子邮件的文本和 HTML 版本,与将 \n 替换为 &lt;br /&gt; 相比,仅仅使用 &lt;pre&gt;&lt;/pre&gt; 标记包裹文本会不会更好/更简单?
          • @AnthonyChuinard
             为我工作!
          【解决方案6】:

          "\n\r" 产生 2 个新行,而 "\n","\r" 和 "\r\n" 如果在标题中使用 content-type: text/plain,则产生单行。

          注意:如果您执行以下 php 代码:

              $message='ab<br>cd<br>e<br>f';
          print $message.'<br><br>';
              $message=str_replace('<br>',"\r\n",$message);
          print $message;
          

          您会在 Windows 浏览器中看到以下内容:

          ab
          cd
          e
          f
          
          ab cd e f
          

          使用content-type: text/plain,您会在电子邮件输出中获得以下内容;

          ab
          cd
          e
          f
          

          【讨论】:

            【解决方案7】:

            另外一个用“”,“\r\n”和“\r\n”是有区别的。

            【讨论】:

              【解决方案8】:
              ' '   
              

              在我的情况下缺少空格,当添加空格 ' \r\n' 开始工作时

              【讨论】:

                【解决方案9】:

                您可以使用 %0A 字符代码在文本/纯内容类型中添加换行符。

                例如:

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

                这里是jsfiddle

                【讨论】:

                  【解决方案10】:

                  这对我有用。

                  $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']);
                  

                  【讨论】:

                    【解决方案11】:

                    使用 &lt;BR&gt; 总是不够的。如果您不告诉 Outlook 它是一个自动关闭的 html 标记,则 MS Outlook 2007 将忽略这一点

                     <BR />
                    

                    【讨论】:

                    • 今天 2019 年 12 月 30 日仍然如此!感谢您的发帖。我挠了几分钟,然后发现了这个!对于一些已经遵循所有建议的人来说,这就是解决方案!遗憾的是
                      格式没有被普遍遵循!
                    【解决方案12】:

                    如果您使用content-type: text/html,则需要输入&lt;br&gt;,因为您的消息会像html 文件一样受到威胁。

                    但如果您将content-type 更改为text/plain 而不是text/html,您将能够使用\r\n 字符。

                    【讨论】:

                      【解决方案13】:

                      您需要使用 &lt;br&gt; 而不是 \r\n 。为此,您可以使用内置函数调用nl2br 所以你的代码应该是这样的

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

                      【讨论】:

                        猜你喜欢
                        • 2018-06-23
                        • 2015-04-05
                        • 2014-05-25
                        • 1970-01-01
                        • 2015-04-01
                        • 2020-11-04
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        相关资源
                        最近更新 更多