Функция почты 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 дважды:)