|
|
|
|
|
для: sim5
(03.12.2008 в 20:30)
| | >Если $head здесь так показан не с целью "экономии места" на форуме, то какой нафик это заголовок.
Я знаю хороший способ экономить место на форуме.
>Однако утверждение в самом начале, что якобы все ОК, вот только маленькая хрень мешает :)
И никакая хрень не помешает. Ни маленькая, ни... хм... побольше. | |
|
|
|
|
|
|
|
для: Trianon
(03.12.2008 в 20:19)
| | Если $head здесь так показан не с целью "экономии места" на форуме, то какой нафик это заголовок. Однако утверждение в самом начале, что якобы все ОК, вот только маленькая хрень мешает :) | |
|
|
|
|
|
|
|
для: 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) , даже если исходное письмо с атомарным телом. | |
|
|
|
|
|
|
|
для: Cyrax
(03.12.2008 в 19:39)
| | Лучше бы у вас была заглушка sendmail как в Денвере, тогда бы прежде чем отсылать, просматривали бы досконально все баги. Сформируйте почтовое отправление (html) в котором вы получаете баги, и прикрепите его результат здесь, желательно в eml формате. Чтобы найти причину, надо смотреть не кусочки сообщения, а полное его содержание. Ну что я (или кто-то иной) может сказать вам что-то о том, что вы показываете. | |
|
|
|
|
|
|
|
для: 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 в 17:36)
| | А вы то, что получилось вместо отправки запишите в файл (выведите на экран), и посмотрите правильно ли все у вас получается. Проблема именно в формировании отправления. Кстати, \r\n это для Win, иначе \n (это если говорить о разделителях в заголовках). | |
|
|
|
|
|
|
|
для: 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 в 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 в 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
(02.12.2008 в 21:56)
| | Если тело вашего почтового сообщения содержит несколько частей, например, это текстовая и html-версии письма, то, например, если первая часть, это текст, и в конце этого текста будет перевод строки, то в зависимости от порядка формирования тела сообщения, это может привести к ошибке похожей на вашу - будет читаться текстовая версия (может быть не опознана кодировка), а из html вы увидите только заголовок, больше ничего. Если просмотреть исходник такого сообщения (полученного), то вы не увидите в нем html-части.
В этой теме я прикреплял "сборник" вопросов о почте, в котором есть подборка тестовых почтовых отправлений. Скопируйте их из исходника, дайте им расширение .eml, и отсылайте через Outlook на свои ящики. Просматривая их на всевозможных почтовых сервисах, или различных почтовых клиентах, вы можете удостовериться, что они будут приняты правильно. А теперь, обратите внимание, что эти тестовые соообщения, отправляя одно и тоже, формируются по разному, но с учетом рекомендаций, и без ошибок. Сравните рузультат ваших отправлений с этими тестовыми, думаю, что вы найдете причину.
Sendmail не проверяет синтасиса ваших отправлений и не парсит их на наличие ошибок. Даже не грамотно составленное сообщение он отправит, исключение составляют переводы строк в заголовке, например, в адресе, в этом случае sendmail не отправит сообщение. | |
|
|
| |
|