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

Mail - \r\n characters visible in recieved email

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

我收到了电子邮件,但“格式”很奇怪,\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 myemail@gmail.com%0D%0A
                                                                        Phone number: 012345678

2cn 电子邮件:

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

编辑 我刚刚注意到第 2 封电子邮件包含的出发日期与第 1 封不同。我不知道为什么会这样,所以我也会添加 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!');
?>

已经包含换行符。