Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Левый текст (информация о кодировке и пр.) в начале и в конце письма. Как избавиться ?
 
 автор: Cyrax   (02.12.2008 в 13:59)   письмо автору
 
 

Подскажите, откуда берутся нижеприведённые строки в начале и в конце письма, отправляемого с помощью 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 в 18:42)   письмо автору
 
   для: Cyrax   (02.12.2008 в 13:59)
 

Хотя, если смотреть письмо через сайт сервера, то ничего лишнего нет (но при этом письмо отображается не в html, а в текстовом виде).
Если смотреть через Thunderbird, то Html нормально отображается, но при этом в начале и в конце письма какая-то левотня выскакивает...

  Ответить  
 
 автор: sim5   (02.12.2008 в 18:51)   письмо автору
 
   для: Cyrax   (02.12.2008 в 18:42)
 

И так сообщение выглядит только в Thunderbird, а в остальных почтовых клиентах или сервисах нормально?

  Ответить  
 
 автор: Cyrax   (02.12.2008 в 19:14)   письмо автору
 
   для: sim5   (02.12.2008 в 18:51)
 

Вот - заметил. Везде, где письмо отображается как текст - всё нормально. А там, где письмо отображается как html - в начале и в коце вышеуказанная левотня...

Письмо в формате html, без прикреплений.

  Ответить  
 
 автор: sim5   (02.12.2008 в 19:29)   письмо автору
 
   для: Cyrax   (02.12.2008 в 19:14)
 

Вы не правильно формируете почтовое сообщение, ошибка либо в формировании заголовка, либо где-то могут быть лишние символы разделителей строк.

  Ответить  
 
 автор: Cyrax   (02.12.2008 в 19:33)   письмо автору
 
   для: sim5   (02.12.2008 в 19:29)
 

Вы имеете ввиду <br> ?

  Ответить  
 
 автор: sim5   (02.12.2008 в 19:45)   письмо автору
 
   для: Cyrax   (02.12.2008 в 19:33)
 

Нет, я имею ввиду \r или \r\n.

  Ответить  
 
 автор: Cyrax   (02.12.2008 в 21:56)   письмо автору
 
   для: sim5   (02.12.2008 в 19:45)
 

Таких символов у меня там вообще нет...

  Ответить  
 
 автор: Trianon   (02.12.2008 в 22:05)   письмо автору
 
   для: Cyrax   (02.12.2008 в 21:56)
 

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

  Ответить  
 
 автор: Cyrax   (02.12.2008 в 23:00)   письмо автору
 
   для: Trianon   (02.12.2008 в 22:05)
 

Я проверил отправку письма того же содержания (полностью, включая заголовки), которое раньше не приводило к таким проблемам - сейчас даже такое письмо снабжается артефактами.
Выходит, что дело не в содержании письма...

  Ответить  
 
 автор: AcidTrash   (02.12.2008 в 23:10)   письмо автору
 
   для: Cyrax   (02.12.2008 в 23:00)
 

Почтовый сервер ваш или хостинга?

  Ответить  
 
 автор: Cyrax   (02.12.2008 в 23:32)   письмо автору
 
   для: AcidTrash   (02.12.2008 в 23:10)
 

Почтовый сервер мой. Тестирую сайт локально, письма отправляю через smtp.mail.ru sendmail'ом.
Возможно, при отправке писем через сервер хостера проблем не будет...

  Ответить  
 
 автор: sim5   (03.12.2008 в 06:20)   письмо автору
 
   для: Cyrax   (02.12.2008 в 21:56)
 

Если тело вашего почтового сообщения содержит несколько частей, например, это текстовая и html-версии письма, то, например, если первая часть, это текст, и в конце этого текста будет перевод строки, то в зависимости от порядка формирования тела сообщения, это может привести к ошибке похожей на вашу - будет читаться текстовая версия (может быть не опознана кодировка), а из html вы увидите только заголовок, больше ничего. Если просмотреть исходник такого сообщения (полученного), то вы не увидите в нем html-части.
В этой теме я прикреплял "сборник" вопросов о почте, в котором есть подборка тестовых почтовых отправлений. Скопируйте их из исходника, дайте им расширение .eml, и отсылайте через Outlook на свои ящики. Просматривая их на всевозможных почтовых сервисах, или различных почтовых клиентах, вы можете удостовериться, что они будут приняты правильно. А теперь, обратите внимание, что эти тестовые соообщения, отправляя одно и тоже, формируются по разному, но с учетом рекомендаций, и без ошибок. Сравните рузультат ваших отправлений с этими тестовыми, думаю, что вы найдете причину.
Sendmail не проверяет синтасиса ваших отправлений и не парсит их на наличие ошибок. Даже не грамотно составленное сообщение он отправит, исключение составляют переводы строк в заголовке, например, в адресе, в этом случае sendmail не отправит сообщение.

  Ответить  
 
 автор: Cyrax   (03.12.2008 в 14:25)   письмо автору
 
   для: 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)

Найдите ошибку ))

  Ответить  
 
 автор: sim5   (03.12.2008 в 14:48)   письмо автору
 
   для: 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

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

  Ответить  
 
 автор: Cyrax   (03.12.2008 в 17:36)   письмо автору
 
   для: 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"$mail2);
  
// Определяем кодировку письма по заголовку 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"$mail2);
  
// Выделяем заголовок 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$bodytrim($head));
}
?>


Может, скажете, что мне сделать, чтобы левого текста в начале и в конце письма не повлялось ?

  Ответить  
 
 автор: sim5   (03.12.2008 в 17:47)   письмо автору
 
   для: Cyrax   (03.12.2008 в 17:36)
 

А вы то, что получилось вместо отправки запишите в файл (выведите на экран), и посмотрите правильно ли все у вас получается. Проблема именно в формировании отправления. Кстати, \r\n это для Win, иначе \n (это если говорить о разделителях в заголовках).

  Ответить  
 
 автор: Cyrax   (03.12.2008 в 19:39)   письмо автору
 
   для: sim5   (03.12.2008 в 17:47)
 

В данном случае я отправляю со своего виндового сендмейла. А smtp - у mail.ru (чего там у них - я не знаю).

Вот что передаётся стандартной php-функции в конечном счёте:
$to
cyrax-temp@mail.ru


$subject
=?windows-1251?B?x+Dq4OcgTm8gSy0yODQwIO3gIHd3dy5rcmVvY nl0ZS5jb20=?=


$body
 123 


$head
From: cyrax-temp@mail.ru cc: cyrax-temp@mail.ru Content-type: text/html; charset=windows-1251


Эти 4 параметра и передаются функции
mail($to, $subject, $body, $head)

  Ответить  
 
 автор: sim5   (03.12.2008 в 19:50)   письмо автору
 
   для: Cyrax   (03.12.2008 в 19:39)
 

Лучше бы у вас была заглушка sendmail как в Денвере, тогда бы прежде чем отсылать, просматривали бы досконально все баги. Сформируйте почтовое отправление (html) в котором вы получаете баги, и прикрепите его результат здесь, желательно в eml формате. Чтобы найти причину, надо смотреть не кусочки сообщения, а полное его содержание. Ну что я (или кто-то иной) может сказать вам что-то о том, что вы показываете.

  Ответить  
 
 автор: Trianon   (03.12.2008 в 20:19)   письмо автору
 
   для: 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) , даже если исходное письмо с атомарным телом.

  Ответить  
 
 автор: sim5   (03.12.2008 в 20:30)   письмо автору
 
   для: Trianon   (03.12.2008 в 20:19)
 

Если $head здесь так показан не с целью "экономии места" на форуме, то какой нафик это заголовок. Однако утверждение в самом начале, что якобы все ОК, вот только маленькая хрень мешает :)

  Ответить  
 
 автор: Trianon   (03.12.2008 в 20:40)   письмо автору
 
   для: sim5   (03.12.2008 в 20:30)
 

>Если $head здесь так показан не с целью "экономии места" на форуме, то какой нафик это заголовок.

Я знаю хороший способ экономить место на форуме.

>Однако утверждение в самом начале, что якобы все ОК, вот только маленькая хрень мешает :)

И никакая хрень не помешает. Ни маленькая, ни... хм... побольше.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования