|
|
|
| Подскажите, откуда берутся нижеприведённые строки в начале и в конце письма, отправляемого с помощью php.
В начале письма добавляется текст:
This is a multi-part message in MIME format. --Message-Boundary-1228214745 Content-Type: text/html Content-Transfer-Encoding: 7bit
|
В конце письма:
--Message-Boundary-1228214745--
|
Как избавиться от этих вставок ?
Раньше такого не наблюдал...
з.ы. При отправке письма кодирую заголовок. Раньше тоже кодировал, но такого не было... | |
|
|
|
|
|
|
|
для: Cyrax
(02.12.2008 в 13:59)
| | Хотя, если смотреть письмо через сайт сервера, то ничего лишнего нет (но при этом письмо отображается не в html, а в текстовом виде).
Если смотреть через Thunderbird, то Html нормально отображается, но при этом в начале и в конце письма какая-то левотня выскакивает... | |
|
|
|
|
|
|
|
для: Cyrax
(02.12.2008 в 18:42)
| | И так сообщение выглядит только в Thunderbird, а в остальных почтовых клиентах или сервисах нормально? | |
|
|
|
|
|
|
|
для: sim5
(02.12.2008 в 18:51)
| | Вот - заметил. Везде, где письмо отображается как текст - всё нормально. А там, где письмо отображается как html - в начале и в коце вышеуказанная левотня...
Письмо в формате html, без прикреплений. | |
|
|
|
|
|
|
|
для: Cyrax
(02.12.2008 в 19:14)
| | Вы не правильно формируете почтовое сообщение, ошибка либо в формировании заголовка, либо где-то могут быть лишние символы разделителей строк. | |
|
|
|
|
|
|
|
для: sim5
(02.12.2008 в 19:29)
| | Вы имеете ввиду <br> ? | |
|
|
|
|
|
|
|
для: Cyrax
(02.12.2008 в 19:33)
| | Нет, я имею ввиду \r или \r\n. | |
|
|
|
|
|
|
|
для: sim5
(02.12.2008 в 19:45)
| | Таких символов у меня там вообще нет... | |
|
|
|
|
|
|
|
для: Cyrax
(02.12.2008 в 21:56)
| | На что Вы, собственно , расчитываете? Что кто-то вслепую догадается, где Вы напороли при формировании тела письма?
Чем загадками говорить, привели бы скрипт.
Если уж так неохота читать стандарты и смотреть действующие инструменты... | |
|
|
|
|
|
|
|
для: Trianon
(02.12.2008 в 22:05)
| | Я проверил отправку письма того же содержания (полностью, включая заголовки), которое раньше не приводило к таким проблемам - сейчас даже такое письмо снабжается артефактами.
Выходит, что дело не в содержании письма... | |
|
|
|
|
|
|
|
для: Cyrax
(02.12.2008 в 23:00)
| | Почтовый сервер ваш или хостинга? | |
|
|
|
|
|
|
|
для: AcidTrash
(02.12.2008 в 23:10)
| | Почтовый сервер мой. Тестирую сайт локально, письма отправляю через smtp.mail.ru sendmail'ом.
Возможно, при отправке писем через сервер хостера проблем не будет... | |
|
|
|
|
|
|
|
для: Cyrax
(02.12.2008 в 21:56)
| | Если тело вашего почтового сообщения содержит несколько частей, например, это текстовая и html-версии письма, то, например, если первая часть, это текст, и в конце этого текста будет перевод строки, то в зависимости от порядка формирования тела сообщения, это может привести к ошибке похожей на вашу - будет читаться текстовая версия (может быть не опознана кодировка), а из html вы увидите только заголовок, больше ничего. Если просмотреть исходник такого сообщения (полученного), то вы не увидите в нем html-части.
В этой теме я прикреплял "сборник" вопросов о почте, в котором есть подборка тестовых почтовых отправлений. Скопируйте их из исходника, дайте им расширение .eml, и отсылайте через Outlook на свои ящики. Просматривая их на всевозможных почтовых сервисах, или различных почтовых клиентах, вы можете удостовериться, что они будут приняты правильно. А теперь, обратите внимание, что эти тестовые соообщения, отправляя одно и тоже, формируются по разному, но с учетом рекомендаций, и без ошибок. Сравните рузультат ваших отправлений с этими тестовыми, думаю, что вы найдете причину.
Sendmail не проверяет синтасиса ваших отправлений и не парсит их на наличие ошибок. Даже не грамотно составленное сообщение он отправит, исключение составляют переводы строк в заголовке, например, в адресе, в этом случае sendmail не отправит сообщение. | |
|
|
|
|
|
|
|
для: sim5
(03.12.2008 в 06:20)
| | Вот тестовый пример.
При отправке с помощью php почтового сообщения следующего содержания (заголовок закодирован):
From: cyrax-temp@mail.ru
To: cyrax-temp@mail.ru
Subject: =?windows-1251?B?x+Dq4OcgTm8gSy0yODE0IO3gIHd3dy5rcmVvY nl0ZS5jb20=?=
Reply-to: cyrax-temp@nm.ru
Content-type: text/html; charset=windows-1251
<html>
<head>
</head>
<body>
123
</body>
</html>>
|
Получаю письмо (заголовок получаю нормальный) следующего содержания:
This is a multi-part message in MIME format. --Message-Boundary-1228302208 Content-Type: text/html Content-Transfer-Encoding: 7bit 123 --Message-Boundary-1228302208-- .
|
либо
This is a multi-part message in MIME format. --Message-Boundary-1228303046 Content-Type: text/html Content-Transfer-Encoding: 7bit
123
--Message-Boundary-1228303046--
|
(первое - в Mozilla Thunderbird, второе - через web-клиент sweb.ru)
Найдите ошибку )) | |
|
|
|
|
|
|
|
для: Cyrax
(03.12.2008 в 14:25)
| | Что, вот так вот непосредственно и оформляется заголовок?:
From: cyrax-temp@mail.ru
To: cyrax-temp@mail.ru
Subject: =?windows-1251?B?x+Dq4OcgTm8gSy0yODE0IO3gIHd3dy5rcmVvY nl0ZS5jb20=?=
Reply-to: cyrax-temp@nm.ru
Content-type: text/html; charset=windows-1251
|
Если да, то чего же вы хотите? Вот конкретно, почти со всем, что можно... | |
|
|
|
|
|
|
|
для: sim5
(03.12.2008 в 14:48)
| | Что значит, непосредственно ?
Загоняю в переменную $mail текст:
From: cyrax-temp@mail.ru
To: cyrax-temp@mail.ru
Subject: =?windows-1251?B?x+Dq4OcgTm8gSy0yODE0IO3gIHd3dy5rcmVvY nl0ZS5jb20=?=
Reply-to: cyrax-temp@nm.ru
Content-type: text/html; charset=windows-1251
<html>
<head>
</head>
<body>
123
</body>
</html>
|
Затем выполняю код:
$mail = mailenc($mail);
mailx($mail);
|
где
<?php ## Кодирование заголовков письма.
// Корректно кодирует все заголовки в письме $mail с использованием
// метода base64. Кодировка письма определяется автоматически на основе
// заголовка Content-type. Возвращает полученное письмо.
function mailenc($mail) {
// Разделяем тело сообщения и заголовки.
list ($head, $body) = preg_split("/\r?\n\r?\n/s", $mail, 2);
// Определяем кодировку письма по заголовку Content-type.
$encoding = '';
$re = '/^Content-type:\s*\S+\s*;\s*charset\s*=\s*(\S+)/mi';
if (preg_match($re, $head, $p)) $encoding = $p[1];
// Проходимся по всем строкам-заголовкам.
$newhead = "";
foreach (preg_split('/\r?\n/s', $head) as $line) {
// Кодируем очередной заголовок.
$line = mailenc_header($line, $encoding);
$newhead .= "$line\r\n";
}
// Формируем окончательный результат.
return "$newhead\r\n$body";
}
// Кодирует в строке максимально возможную последовательность
// символов, начинающуюся с недопустимого символа и НЕ
// включающую E-mail (адреса E-mail обрамляют символами < и >).
// Если в строке нет ни одного недопустимого символа, преобразование
// не производится.
function mailenc_header($header, $encoding) {
// Кодировка не задана - делать нечего.
if (!$encoding) return $header;
// Сохраняем кодировку в глобальной переменной. Без использования
// ООП это - единственный способ передать дополнительный параметр
// callback-функции.
$GLOBALS['mail_enc_header_encoding'] = $encoding;
return preg_replace_callback(
'/([\x7F-\xFF][^<>\r\n]*)/s',
'mailenc_header_callback',
$header
);
}
// Служебная функция для использования в preg_replace_callback().
function mailenc_header_callback($p) {
$encoding = $GLOBALS['mail_enc_header_encoding'];
// Пробелы в конце оставляем незакодированными.
preg_match('/^(.*?)(\s*)$/s', $p[1], $sp);
return "=?$encoding?B?".base64_encode($sp[1])."?=".$sp[2];
}
?>
|
и
<?php ## Более удобная отправка почты.
// Функция отправляет письмо, полностью заданное в параметре $mail.
// Корректно обрабатываются заголовки To и Subject.
function mailx($mail) {
// Разделяем тело сообщения и заголовки.
list ($head, $body) = preg_split("/\r?\n\r?\n/s", $mail, 2);
// Выделяем заголовок To.
$to = "";
if (preg_match('/^To:\s*([^\r\n]*)[\r\n]*/m', $head, $p)) {
$to = @$p[1]; // сохраняем
$head = str_replace($p[0], "", $head); // удаляем из исходной строки
}
// Выделяем Subject.
$subject = "";
if (preg_match('/^Subject:\s*([^\r\n]*)[\r\n]*/m', $head, $p)) {
$subject = @$p[1];
$head = str_replace($p[0], "", $head);
}
// Отправляем почту
return mail($to, $subject, $body, trim($head));
}
?>
|
Может, скажете, что мне сделать, чтобы левого текста в начале и в конце письма не повлялось ? | |
|
|
|
|
|
|
|
для: Cyrax
(03.12.2008 в 17:36)
| | А вы то, что получилось вместо отправки запишите в файл (выведите на экран), и посмотрите правильно ли все у вас получается. Проблема именно в формировании отправления. Кстати, \r\n это для Win, иначе \n (это если говорить о разделителях в заголовках). | |
|
|
|
|
|
|
|
для: sim5
(03.12.2008 в 17:47)
| | В данном случае я отправляю со своего виндового сендмейла. А smtp - у mail.ru (чего там у них - я не знаю).
Вот что передаётся стандартной php-функции в конечном счёте:
$to
$subject
=?windows-1251?B?x+Dq4OcgTm8gSy0yODQwIO3gIHd3dy5rcmVvY nl0ZS5jb20=?=
|
$body
$head
From: cyrax-temp@mail.ru cc: cyrax-temp@mail.ru Content-type: text/html; charset=windows-1251
|
Эти 4 параметра и передаются функции
mail($to, $subject, $body, $head)
|
| |
|
|
|
|
|
|
|
для: Cyrax
(03.12.2008 в 19:39)
| | Лучше бы у вас была заглушка sendmail как в Денвере, тогда бы прежде чем отсылать, просматривали бы досконально все баги. Сформируйте почтовое отправление (html) в котором вы получаете баги, и прикрепите его результат здесь, желательно в eml формате. Чтобы найти причину, надо смотреть не кусочки сообщения, а полное его содержание. Ну что я (или кто-то иной) может сказать вам что-то о том, что вы показываете. | |
|
|
|
|
|
|
|
для: Cyrax
(03.12.2008 в 19:39)
| | $head
From: cyrax-temp@mail.ru cc: cyrax-temp@mail.ru Content-type: text/html; charset=windows-1251
|
Это как? Все поля внавал?
И Вы это считаете правильно построенным письмом? :)
Про то, что на одинокий Content-type можно просто забить, я уже молчу.
ps. Вероятнее всего в почтовый ящик доходит не письмо, а отлуп одного из серверов в цепочке о невозможности доставки. Он запросто может быть многокомпонентным (multipart) , даже если исходное письмо с атомарным телом. | |
|
|
|
|
|
|
|
для: Trianon
(03.12.2008 в 20:19)
| | Если $head здесь так показан не с целью "экономии места" на форуме, то какой нафик это заголовок. Однако утверждение в самом начале, что якобы все ОК, вот только маленькая хрень мешает :) | |
|
|
|
|
|
|
|
для: sim5
(03.12.2008 в 20:30)
| | >Если $head здесь так показан не с целью "экономии места" на форуме, то какой нафик это заголовок.
Я знаю хороший способ экономить место на форуме.
>Однако утверждение в самом начале, что якобы все ОК, вот только маленькая хрень мешает :)
И никакая хрень не помешает. Ни маленькая, ни... хм... побольше. | |
|
|
|