邮件 - \r\n 收到的电子邮件中可见的字符

问题描述

我正在向自己发送一封测试电子邮件,其中包含插入到表单中的值。

我收到了电子邮件,但“格式”很奇怪,\r\n 是可见的。我也尝试了 %0D%0A</br>(虽然没有指定它是 HTML)并且它也是可见的。我也试过PHP_EOL

此外,我还在第一封电子邮件之后立即收到了第二封电子邮件,但它只包含前一份表格的一小部分。

第一封电子邮件

Date of arrival: 19-02-2021%0D%0A
                                                                        Date of departure: 27-02-2021%0D%0A
                                                                        Room selected:  Room 01 %0D%0A
                                                                        Name: dread%0D%0A
                                                                        Surname: Zxy%0D%0A
                                                                        Email [email protected]%0D%0A
                                                                        Phone number: 012345678

2cnd 电子邮件

Date of arrival: 19-02-2021%0D%0A
                                                                        Date of departure: 26-02-2021%0D%0A

编辑我刚刚注意到第二封电子邮件与第一封电子邮件的出发日期不同。我不知道为什么会这样,所以我也会添加 jQuery 代码

如果有人知道如何解决这个问题,我将不胜感激。

代码

<?PHP
    if(isset($_POST['submit'])) {
        $arrivalDate = $_POST['arrivalDate'];
        $departureDate = $_POST['departureDate'];
        $room = $_POST['room'];
        $user_name = $_POST['user_name'];
        $surname = $_POST['surname'];
        $email = $_POST['email'];
        $tel = $_POST['tel'];
                    
        $to = $_POST['email'];
        $subject = 'Reservation';
        $body = 'Date of arrival: '.$arrivalDate.'\r\n
                Date of departure: '.$departureDate.'\r\n
                Room selected: '.$room.'\r\n
                Name: '.$user_name.'\r\n
                Surname: '.$surname.'\r\n
                Email '.$email.'\r\n
                Phone number: '.$tel;
                            
        wp_mail( $to,$subject,$body );
        echo "Sent!";
    }
?>
jQuery(document).ready(function($) {
    $("#arrivalDate").datepicker({
        minDate: 'datetoday',dateFormat: 'dd-mm-yy',onSelect: function (date) {
            $("#departureDate").datepicker('option','minDate',date);
        }
    });
    $("#departureDate").datepicker({
        dateFormat: 'dd-mm-yy'
    });
});

解决方法

在 PHP 中,单引号和双引号之间存在很大差异:

<?php echo('\r\n'); ?>

这会产生 \r\n,字面上,作为文本,而这个:

<?php echo("\r\n"); ?>

实际上可以根据需要发出 CRLF。

单引号字符串不被内插,并且不支持像\r这样的控制字符。双引号字符串可以。

话虽如此,还有一种更好的表达方式:

<?php
$body = implode("\r\n",[
  "Date of arrival: $arrivalDate","Date of departure: $departureDate","Room selected: $room","Name: $user_name","Surname: $surname","Email $email","Phone number: $tel"
]);                        

让字符串插值为您完成工作,然后使用 implode() 将它们连接在一起。

在您的代码中,您不仅输入了 \r\n,而且字符串跨越多行,您还至少包含一个 LF,另一个无关紧要的 \n

这意味着:

<?php

echo('I love
newlines!');
?>

已经包含换行符。