Проблемы с пробелами в php-письмах

У меня возникла серьезная проблема с проблемой электронной почты.

вкратце:

  1. загрузка файла шаблона html fopen
  2. заменяя некоторые значения, помеченные как этот %password с реальными значениями str_replace
  3. отправляя почту через следующую функцию, где $content – это загруженный файл шаблона html:

публичная функция send ($ receiver, $ subject, $ content) {

  $header = "From:".sender. "\n"; $header .= "MIME-Version:1.0" . "\n"; $header .= "Content-type:text/html;charset=utf-8" . "\n"; $mailText = $content; mail($receiver, $subject, stripslashes(iconv('utf-8', 'iso-8859-1', $mailText)) , $header); } 

сервер debian с postfix.

Шаблон почты начинается с

 <html> <body style="background-color: #fff;"> <table border="0"... 

Дело в том, и я не могу воспроизвести его, что в некоторых случаях я могу найти несколько пробелов в почте, которые я туда не размещал. Наиболее проблематичными являются те, которые содержатся в строке пользователя и пароля.

Наверное, все кажется правильным! Кодировка в порядке, html принят, все письма могут быть доставлены …

генерация пароля:

 public static function create_password($length = 12) { $characters = array("a", "b", "c", "d", "e", "f", "g", "h", "k", "m", "n", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "_"); $password = ""; for($i=0; $i<$length; $i++) { $index = rand(1, count($characters)) -1; $password .= $characters[$index]; } $password = str_replace("__","_", $password); return $password; } 

Любые идеи, с чего начать мой поиск?

Это шаблон, str_replace, postifix, клиент, …?

Спасибо,

Я бы начал с сохранения HTML в отдельный файл и открыть его с помощью браузера.

Если вы видите пробелы, это HTML.

Если это выглядит хорошо, почта становится искалеченной.

коверкание

Это часто вызвано тем, что ваши строки слишком длинные, а почтовые серверы – фанки с линиями длиной более 80 столбцов (древние стандарты).

Чтобы предотвратить манекен, я бы предложил следующее:

  1. Добавить заголовок Content-Transfer-Encoding: base64 .

  2. Примените chunk_split(base64_encode(...)) по всему содержимому электронной почты.

Недавно у меня была такая же проблема, но для линии To: с несколькими адресами электронной почты. Вот технические подробности.

Согласно документам PHP для mail() : форматирование этой строки должно соответствовать « RFC 2822» . Это для параметров $to и $message .

В частности, раздел: 2.1.1. Линейные пределы

Существует два ограничения, которые этот стандарт устанавливает на количество
символов в строке. Каждая строка символов ДОЛЖНА быть не более
998 символов, и ДОЛЖНО быть не более 78 символов, исключая
CRLF.

Предел 998 символов обусловлен ограничениями во многих реализациях, которые отправляют, получают или сохраняют сообщения формата сообщений Интернета, которые просто не могут обрабатывать более 998 символов в строке. Получение реализаций будет полезно обрабатывать произвольно большое количество символов в строке для обеспечения надежности. Тем не менее, существует так много реализаций, которые (в соответствии с требованиями к транспорту [RFC2821]) не принимают сообщения, содержащие более 1000 символов, включая CR и LF на строку, для реализаций важно не создавать такие сообщения.

Более консервативная рекомендация 78 символов заключается в том, чтобы учесть множество реализаций пользовательских интерфейсов, которые отображают эти
сообщения, которые могут усекать или катастрофически обернуть отображение
более 78 символов в строке, несмотря на то, что такие
реализации несовместимы с намерением этого
спецификации (и RFC2821), если они действительно вызывают
информация будет потеряна). Опять же, несмотря на то, что это ограничение распространяется на сообщения, оно поддерживает решения, отображающие сообщения

для обработки произвольно большого количества символов в строке
(конечно, по крайней мере, до предела 998 символов) ради
робастности.

Существует множество способов преодолеть это, обнаруженное во всем Интернете.

  1. Из документов PHP: $message = wordwrap($message, 70, "\r\n");
  2. Из ответа Джека : chunk_split(base64_encode(...))
  3. Из опыта: foreach($emails as $email){ $to_email = $email."\n";}

Похоже, что вы можете превысить максимальную длину линии тела, когда это происходит, клиенты электронной почты делают странные вещи, такие как это. Не помещайте все содержимое вашего тела в одну строку, используйте \n для создания новых строк.

Как это

 <html> <body style="background-color: #fff;"> <table border="0"... 

Вместо

 <html> <body style="background-color: #fff;"> <table border="0"... 

это:

 stripslashes(iconv('utf-8', 'iso-8859-1', $mailText)); 

Будет ли продукт УВЕДОМЛЕНИЕМ, если какой-либо из ваших символов передан, не является латинским (кодируется в кодировке UTF8). Это означает, что они будут испорчены (остановка в первом нелатинском, если есть).