Функция почты PHP случайным образом добавляет пробел в текст сообщения

У меня есть очень простой скрипт PHP, что-то вроде:

while ($condition){
    echo "<a href="thanks.php?id=".$id."> THANKS </a>";
}

Конечно, у меня есть немного больше кода, но это не имеет значения. После того как я создал этот фрагмент кода, скрипт отправляет пользователю электронное письмо.

INBOX

Ссылки в каждой отдельной строке хороши, за исключением того, что LAST ONE показывает ссылку следующим образом:

    tha nks.php?id.....

Это добавляет пробел между кодом.

Это происходит только с Hotmail. Gmail, Yahoo и все остальное работает просто отлично.

4 ответа

Я знаю, что уже поздно, но у меня есть альтернативное решение:

Используйте эту строку для кодирования всего сообщения с использованием base64:

$message = chunk_split(base64_encode($message));

Затем добавьте этот заголовок:

$headers .= "Content-Transfer-Encoding: base64\r\n\r\n";

Это скажет почтовому клиенту, что ваше сообщение закодировано в base64.

Решение Каранкана, вероятно, работает, но основная причина - это то, о чем говорил Хобо. mail Функция вставляет разрыв строки через каждые 900 символов (я думаю). Так что, если вы создаете ваше сообщение $ с кучей $message .= "more text"; вы столкнетесь с этой ошибкой, как только длина этой строки превысит 900 символов. Это сбивает с толку, потому что пробелы кажутся прерывистыми, особенно если вы создаете сообщение HTML, потому что иногда разрывы строк появляются в совершенно благоприятных местах.

Простое решение состоит в том, чтобы добавить \r\n\ до конца строк.

Интересно, что эти формы работают:

$message .= "<tr><td>1</td><td>2</td>\r\n";
$message .= '<tr><td>1</td><td>2</td>'."\r\n";

Но это не так:

$message .= '<tr><td>1</td><td>2</td>\r\n';

\r\n должен быть заключен в двойные кавычки, в противном случае символы будут просто добавляться к тексту вместо создания возврата каретки / переноса строки.

Столкнулся с той же проблемой и попробовал большинство из этих решений, но у меня это не сработало. Кажется, когда строка кажется слишком длинной для почтовой функции, она добавляет пробел около 900 знаков. Таким образом, следующее решение добавления WordWrap работает для меня.

mail ($ to, $ subject, wordwrap ($ message), $ заголовки);

2019 рабочий ответ

Протокол SMTP требует CRLF после каждой строки, содержащей более 998 символов. Обычно каждая строка из 1000 должна содержать в самом конце символы CRLF.

Самое простое рабочее решение этой проблемы - отправить содержимое электронной почты, закодированное в base64, затем добавить заголовок, который сообщает почтовым клиентам, что содержимое было закодировано в базе 64, а затем отправить электронное письмо.

Беллоу - рабочий пример. Я тестировал почту, в которой было ~ 27000 символов, и она отлично работала. До этого обновления критические ссылки в моем HTML-содержимом нарушались.

<?php

// used for date() function
date_default_timezone_set('Europe/Bucharest');


$to = 'john.doe@company.com';
$from = 'john.doe@company.com';
$fromName = 'John Doe';

$subject = "Html email test at ".date('H:i:s');


// Set content-type header for sending HTML email
$headers = "MIME-Version: 1.0" . "\r\n";
$headers .= "Content-type:text/html;charset=UTF-8" . "\r\n";
$headers .= "Content-Transfer-Encoding: base64" . "\r\n";


// Additional headers
$headers .= 'From: '.$fromName.'<'.$from.'>' . "\r\n";
$headers .= 'Cc: welcome@example.com' . "\r\n";
$headers .= 'Bcc: welcome2@example.com' . "\r\n";


$extremely_long_html_email = "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">
<html xmlns=\"http://www.w3.org/1999/xhtml\">
<head>
    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"/>
    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\"/>
    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"/>
    <title>TEST</title>
    </head>
    <body>
        Very long HTML code. I stripped mine due to copyright issues.
    </body>
</html>";


// Send email
if(mail($to, $subject, base64_encode($extremely_long_html_email), $headers)){
    echo 'Email has sent successfully.';
}else{
    echo 'Email sending failed.';
}
?>

TL;DR; Добавить дополнительные заголовки$headers .= "Content-Transfer-Encoding: base64" . "\r\n"; и закодировать HTML-контент перед его отправкой с помощью base64_encode($html_email) функция.

Я видел символы вставки sendmail, когда строки слишком длинные. Это не тот случай (так как другие клиенты справляются с этим нормально), но мне интересно, есть ли у hotmail ограничение длины строки, которое вы используете.

Имеет ли какое-либо значение, если вы вставите новую строку в свой echoт.е.

while ($condition){

    echo "<a href=\"thanks.php?id=".$id."\"> THANKS </a>\n";

}

Если вы используете PHPMailer или Joomla CMS (которая использует PHPMailer), соответствующий код для использования utf-8 и base64 кодирует ваше сообщение (эквивалент решения karancan):

$mailer->CharSet = 'utf-8';
$mailer->Encoding = 'base64'

Учтите, что вам не следует chunk_split(base64_encode($emailBody));потому что PHPMailer автоматически делает это за вас, как только вы устанавливаете кодировку в base64, и вы не хотите, чтобы ваше тело письма было закодировано в base64 дважды:)

Другие вопросы по тегам