Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Отправка html письма с аттачами
Форумы портала PHP.SU » » Работа с сетью » Отправка html письма с аттачами

Страниц (1): [1]
 

1. Arcoslov - 15 Декабря, 2014 - 17:29:47 - перейти к сообщению
Всем привет!

Подскажите, пожалуйста, как правильно отправлять рассылку, чтобы контент одинаково корректно отображался во всех клиентах (в частности: через браузер, thunderbird, Outlook, the bat).
Рассылка содержит html с аттачами.

На сколько я понял, основная проблема в том, что нужно отправлять и html-версию как html, и html-версию как текст, иначе программы типа thunderbird ничего не поймут и не отобразят, т.к. им подавай html, отправленный как plain text (хотя в веб-морде гугла, например, всё будет работать).

Собственно, не пойму, как это реализовать. У меня приходит пустое письмо всё время, как только не пробовал.

мой код:

PHP:
скопировать код в буфер обмена
  1. <?PHP
  2.  
  3. $eln = "\n"; //конец строки
  4.  
  5. $to = 'my_mail@gmail.com';
  6. $from = '=?utf-8?B?'.base64_encode('Вася пупкин').'?='.' <vasya@pup.kin>';
  7. $subject = '=?utf-8?B?'.base64_encode('сабжект письма').'?=';
  8. $replyto = 'vasya@pup.kin';
  9.  
  10. $headers = 'MIME-Version: 1.0;'.$eln;
  11. $headers .= 'From: '."$from".$eln;
  12. $headers .= 'Reply-To: '."$replyto".$eln;
  13. $headers .= 'Content-type: multipart/mixed; boundary="---mixed";'. $eln;
  14. //начало общей части
  15. $message='';
  16.                 // начало части с альтернативными вариантами
  17.                 $message.='Content-Type: multipart/alternative; boundary="---alternative"'. $eln;
  18.  
  19.                                 //начало первого альтернативного блока (текстовый контент)
  20.                                 $message.='Content-Type: text/plain; charset="UTF-8"; '. $eln;
  21.                                 $message.='Content-Transfer-Encoding: 7bit'. $eln;
  22.                                 $message.=' TEXT HERE'.$eln;
  23.                 //начало  второго альтернативного блока (html контент)
  24.                 $message.='--'.'---alternative'. $eln;
  25.                                 $message.='Content-Type: text/html; charset="UTF-8"; '. $eln;
  26.                                 $message.='Content-Transfer-Encoding: 7bit'. $eln;
  27.                                 $message.=' <b>HTML HERE</b>'.$eln;
  28.                 //окончание части альтернативных блоков
  29.                 $message.='--'.'---alternative--'. $eln;
  30.  
  31. // продолжение общей части
  32. $message.='--'.'---mixed'. $eln;
  33.  
  34.                 //начало аттача
  35.                 $message.='Content-Type: application/octet-stream; name="N.jpg"'. $eln;
  36.                 $message.='Content-Transfer-Encoding: base64'.$eln;
  37.                 $message.='Content-Disposition: attachment; filename="N.jpg"'.$eln;
  38.                 $message.= chunk_split(base64_encode('N.jpg')).$eln;
  39.  
  40. //конец общей части
  41. $message.='--'.'---mixed--'. $eln;
  42.  
  43. if (mail ($to, $subject, $message, $headers)){echo 'good!';}else{echo 'bad';};
  44.  
  45. ?>


Вот что приходит:
CODE (htmlphp):
скопировать код в буфер обмена
  1. Content-type: multipart/mixed; boundary="---mixed";
  2.  
  3. Content-Type: multipart/alternative; boundary="---alternative"
  4. Content-Type: text/plain; charset="UTF-8";
  5. Content-Transfer-Encoding: 7bit
  6.  TEXT HERE
  7. -----alternative
  8. Content-Type: text/html; charset="UTF-8";
  9. Content-Transfer-Encoding: 7bit
  10.  <b>HTML HERE</b>
  11. -----alternative--
  12. -----mixed
  13. Content-Type: application/octet-stream; name="N.jpg"
  14. Content-Transfer-Encoding: base64
  15. Content-Disposition: attachment; filename="N.jpg"
  16.  
  17.  
  18. -----mixed--


Собственно, в браузере вижу пустое письмо, к которому прикреплён джипег как аттач, но он имеет размер 0 bytes.
Текста TEXT HERE или <b>HTML HERE</b> я не вижу.

1) что я делаю не так?
2) я правильно понимаю, что после строки:
$headers .= 'Content-type: multipart/mixed; boundary="---mixed";'. $eln;
не нужно задавать $message='--'.'---mixed'.$eln ?
так же и про открытие любого нового блока.
2. esterio - 15 Декабря, 2014 - 17:47:16 - перейти к сообщению
сформируйте отправте письмо с помощю того thunderbird (или йому подобніх) и посмотрите исходник. проанализируйте и увидете что вы делаете не так
3. Мелкий - 15 Декабря, 2014 - 18:22:34 - перейти к сообщению
Arcoslov пишет:
контент одинаково корректно отображался во всех клиентах (в частности: через браузер, thunderbird, Outlook, the bat).
Рассылка содержит html с аттачами.

Вопрос как отправить или как сделать так, чтобы корректно отображался?
Вёрстка почтовых рассылок имеет огромное число граблей и особенностей.

Arcoslov пишет:
им подавай html, отправленный как plain text

Неверно.

Arcoslov пишет:
нужно отправлять и html-версию как html, и html-версию как текст

Нужно отправлять html-версию письма и текстовую версию письма. Именно оформленное текстом, без каких-либо html. Обычно текстовая версия пишется и оформляется отдельно - т.к. автоматическая генерация из html будет выглядеть ужасно.

Не вижу никакого смысла писать очередную реализацию почтовых заголовков - возьмите phpmailer или ещё что-нибудь, пусть за заголовками следит давно написанный и отлаженный код.
4. Arcoslov - 16 Декабря, 2014 - 19:01:13 - перейти к сообщению
esterio пишет:
сформируйте отправте письмо с помощю того thunderbird (или йому подобніх) и посмотрите исходник. проанализируйте и увидете что вы делаете не так


сделал из thunderbird. Понимание не пришло.
он делает по такой схеме:

CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. --mixed
  3.     --alternative
  4.     (text here)
  5.     --alternative
  6.         --related
  7.         (html here)
  8.         --related
  9.         (picture here)
  10.         --related
  11.         (picture here)
  12.         .....
  13.         --related--
  14.     --alternative--
  15. --mixed
  16. (attach here)
  17. --mixed--
  18.  


Единственное, что я понял - это что открывающие boundary тоже надо ставить (ибо они там стоят). Однако, это ничего не поменяло.
Я делаю вроде по той же схеме, как видите, но без related, пока моделирую простую ситуацию. Приходит так же пустое.

Мелкий пишет:
Arcoslov пишет:
контент одинаково корректно отображался во всех клиентах (в частности: через браузер, thunderbird, Outlook, the bat).
Рассылка содержит html с аттачами.

Вопрос как отправить или как сделать так, чтобы корректно отображался?
Вёрстка почтовых рассылок имеет огромное число граблей и особенностей.

я не про вёрстку. вёрстка есть, если её отправлять из thunderbird, она корректно отображается во всех браузерах и клиентах.


Мелкий пишет:
Не вижу никакого смысла писать очередную реализацию почтовых заголовков - возьмите phpmailer или ещё что-нибудь, пусть за заголовками следит давно написанный и отлаженный код.

Да я уж понял..
но я хочу разобраться, а не забить.
5. Мелкий - 16 Декабря, 2014 - 19:38:26 - перейти к сообщению
Раз хотите разобраться - то читайте соответствующий RFC. По-моему, последняя версия это rfc2046: https://tools[dot]ietf[dot]org/html/rfc2046
6. esterio - 16 Декабря, 2014 - 20:04:19 - перейти к сообщению
Arcoslov пишет:
Я делаю вроде по той же схеме, как видите, но без related,

сделайте related
я здесь не раз на форуме бросал ссилку на хабр де описана структура. мне в свое время помогло. а еще здешний обитатель написал свой класс для отправки почты. поищите в гугле по форуму
7. Arcoslov - 16 Декабря, 2014 - 21:53:28 - перейти к сообщению
Мелкий пишет:
Раз хотите разобраться - то читайте соответствующий RFC. По-моему, последняя версия это rfc2046: https://tools[dot]ietf[dot]org/html/rfc2046

угу. буду курить.

esterio пишет:
сделайте related

а зачем в моей гораздо более простой задаче related?
я даже не понимаю, что это он делает. я же никакие картинки не приаттачиваю, они только в виде ссылок в вёрстке.
8. esterio - 17 Декабря, 2014 - 12:07:56 - перейти к сообщению
я ж просил посмотреть в моих сообщениях. я ссилку бросал (причем недавно)
http://habrahabr[dot]ru/post/17531/
если вы не понимаете зачем. значит нужно курить спекы
цитирую
Цитата:
Ошибка третья — выбор только одного субтипа

CODE (htmlphp):
скопировать код в буфер обмена
  1. Content-type: multipart/mixed
  2.  
  3.     Content-type: multipart/alternative
  4.         Content-type: text/plain
  5.         Content-type: multipart/related
  6.             Content-type: text/html
  7.             Content-type: image/jpeg
  8.             Content-type: image/jpeg
  9.  
  10.         Content-type: application/msword


вот примерна структура

 

Powered by ExBB FM 1.0 RC1