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

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Отправка html письма с аттачами

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Описание: как работает content-type: multipart?
Arcoslov
Отправлено: 15 Декабря, 2014 - 17:29:47
Post Id


Новичок


Покинул форум
Сообщений всего: 13
Дата рег-ции: Дек. 2014  


Помог: 0 раз(а)




Всем привет!

Подскажите, пожалуйста, как правильно отправлять рассылку, чтобы контент одинаково корректно отображался во всех клиентах (в частности: через браузер, 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 ?
так же и про открытие любого нового блока.
 
 Top
esterio
Отправлено: 15 Декабря, 2014 - 17:47:16
Post Id



Активный участник


Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012  
Откуда: Украина, Львов


Помог: 127 раз(а)




сформируйте отправте письмо с помощю того thunderbird (или йому подобніх) и посмотрите исходник. проанализируйте и увидете что вы делаете не так
 
 Top
Мелкий Супермодератор
Отправлено: 15 Декабря, 2014 - 18:22:34
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




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

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

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

Неверно.

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

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

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


-----
PostgreSQL DBA
 
 Top
Arcoslov
Отправлено: 16 Декабря, 2014 - 19:01:13
Post Id


Новичок


Покинул форум
Сообщений всего: 13
Дата рег-ции: Дек. 2014  


Помог: 0 раз(а)




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 или ещё что-нибудь, пусть за заголовками следит давно написанный и отлаженный код.

Да я уж понял..
но я хочу разобраться, а не забить.

(Отредактировано автором: 16 Декабря, 2014 - 19:01:58)

 
 Top
Мелкий Супермодератор
Отправлено: 16 Декабря, 2014 - 19:38:26
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Раз хотите разобраться - то читайте соответствующий RFC. По-моему, последняя версия это rfc2046: https://tools[dot]ietf[dot]org/html/rfc2046


-----
PostgreSQL DBA
 
 Top
esterio
Отправлено: 16 Декабря, 2014 - 20:04:19
Post Id



Активный участник


Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012  
Откуда: Украина, Львов


Помог: 127 раз(а)




Arcoslov пишет:
Я делаю вроде по той же схеме, как видите, но без related,

сделайте related
я здесь не раз на форуме бросал ссилку на хабр де описана структура. мне в свое время помогло. а еще здешний обитатель написал свой класс для отправки почты. поищите в гугле по форуму
 
 Top
Arcoslov
Отправлено: 16 Декабря, 2014 - 21:53:28
Post Id


Новичок


Покинул форум
Сообщений всего: 13
Дата рег-ции: Дек. 2014  


Помог: 0 раз(а)




Мелкий пишет:
Раз хотите разобраться - то читайте соответствующий RFC. По-моему, последняя версия это rfc2046: https://tools[dot]ietf[dot]org/html/rfc2046

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

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

а зачем в моей гораздо более простой задаче related?
я даже не понимаю, что это он делает. я же никакие картинки не приаттачиваю, они только в виде ссылок в вёрстке.
 
 Top
esterio
Отправлено: 17 Декабря, 2014 - 12:07:56
Post Id



Активный участник


Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012  
Откуда: Украина, Львов


Помог: 127 раз(а)




я ж просил посмотреть в моих сообщениях. я ссилку бросал (причем недавно)
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


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

(Отредактировано автором: 17 Декабря, 2014 - 12:09:12)

 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Работа с сетью »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB