Функция почты PHP случайным образом добавляет пробел в текст сообщения - PullRequest
12 голосов
/ 03 апреля 2012

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

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

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

INBOX

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

    tha nks.php?id.....

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

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

Ответы [ 4 ]

15 голосов
/ 08 февраля 2013

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

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

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

Затем добавьте это вашеheader:

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

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

12 голосов
/ 27 февраля 2014

Решение Каранкана, вероятно, работает, но основная причина - это то, что говорил Хобо. Функция 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 должен быть заключен в двойные кавычки, в противном случае символы будут просто добавляться в текст вместо создания возврата каретки / переноса строки.

11 голосов
/ 19 марта 2015

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

mail ($ to, $ subject, wordwrap ($ message), $ headers);

0 голосов
/ 03 апреля 2012

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

while ($condition){

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

}
...