Проблемы с пробелами в письмах 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);

}

сервер дебиан с постфиксом.

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

<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, постификс, клиент, ...?

Спасибо пока


person helle    schedule 15.06.2012    source источник
comment
Итак, вы намерены отправить несколько паролей в виде простого текста по сети? :D   -  person Mihai Todor    schedule 15.06.2012
comment
@mihai todor: оказалось, что это лучший способ понять это обычным пользователям. Они получают подсказку, чтобы изменить там пароль после первого входа в систему.   -  person helle    schedule 16.06.2012
comment
Хорошо, я понимаю, но это все еще довольно небезопасно...   -  person Mihai Todor    schedule 16.06.2012


Ответы (4)


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

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

Если все выглядит нормально, почта искажается.

калечить

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

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

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

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

person Ja͢ck    schedule 15.06.2012

Недавно у меня была такая же проблема, но для строки 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";}
person amaster    schedule 20.02.2014

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

Как это

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

Вместо

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

это:

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

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

person Community    schedule 15.06.2012