Правила     Закладки     Карма    Календарь    Журналы    Помощь    Поиск    PDA    Чат   
        СМС-ки
   
Пейджер выключен!
 
Фильтр авторов:    показать 
  скрыть
  Ответ в темуСоздание новой темыСоздание опроса

> Отправка html рассылки с вложениями и аттачами, как работает multipart?
Arcoslov  
[x] Дата
Цитировать сообщение


Гость пожелал остаться неизвестным

Unregistered









Всем доброго дня.

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

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

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

мо код:
<?php

$eln = "\n"; //конец строки

$to = 'my_mail@gmail.com';
$from = '=?utf-8?B?'.base64_encode('Вася пупкин').'?='.' <vasya@pup.kin>';
$subject = '=?utf-8?B?'.base64_encode('сабжект письма').'?=';
$replyto = 'vasya@pup.kin';

$headers = 'MIME-Version: 1.0;'.$eln;
$headers .= 'From: '."$from".$eln;
$headers .= 'Reply-To: '."$replyto".$eln;
$headers .= 'Content-type: multipart/mixed; boundary="---mixed";'. $eln;
//начало общей части
$message='';
// начало части с альтернативными вариантами
$message.='Content-Type: multipart/alternative; boundary="---alternative"'. $eln;

//начало первого альтернативного блока (текстовый контент)
$message.='Content-Type: text/plain; charset="UTF-8"; '. $eln;
$message.='Content-Transfer-Encoding: 7bit'. $eln;
$message.=' TEXT HERE'.$eln;
//начало второго альтернативного блока (html контент)
$message.='--'.'---alternative'. $eln;
$message.='Content-Type: text/html; charset="UTF-8"; '. $eln;
$message.='Content-Transfer-Encoding: 7bit'. $eln;
$message.=' <b>HTML HERE</b>'.$eln;
//окончание части альтернативных блоков
$message.='--'.'---alternative--'. $eln;

// продолжение общей части
$message.='--'.'---mixed'. $eln;

//начало аттача
$message.='Content-Type: application/octet-stream; name="N.jpg"'. $eln;
$message.='Content-Transfer-Encoding: base64'.$eln;
$message.='Content-Disposition: attachment; filename="N.jpg"'.$eln;
$message.= chunk_split(base64_encode('N.jpg')).$eln;

//конец общей части
$message.='--'.'---mixed--'. $eln;

if (mail ($to, $subject, $message, $headers)){echo 'good!';}else{echo 'bad';};

?>


Вот что приходит:

Content-type: multipart/mixed; boundary="---mixed";

Content-Type: multipart/alternative; boundary="---alternative"
Content-Type: text/plain; charset="UTF-8";
Content-Transfer-Encoding: 7bit
TEXT HERE
-----alternative
Content-Type: text/html; charset="UTF-8";
Content-Transfer-Encoding: 7bit
<b>HTML HERE</b>
-----alternative--
-----mixed
Content-Type: application/octet-stream; name="N.jpg"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="N.jpg"


-----mixed--




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

1) что я делаю не так?
2) я правильно понимаю, что после строки:
$headers .= 'Content-type: multipart/mixed; boundary="---mixed";'. $eln;
не нужно задавать $message='--'.'---mixed'.$eln ?
так же и про открытие любого нового блока.

Это сообщение отредактировал Arcoslov - 15.12.2014 - 15:38
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
twin  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Глухой нуб
******

Профиль
Группа: Администратор
Почтальон группы
Сообщений: 17423
Пользователь №: 6543
На форуме: 16 лет, 7 месяцев, 12 дней
Карма: 327

Трезвый :
14 лет, 4 месяца, 21 день


Вот тут посмотри, может что полезное найдется.


--------------------
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
PMСайт пользователяICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Arcoslov  
Дата
Цитировать сообщение


Гость пожелал остаться неизвестным

Unregistered









Цитата (twin @ 15.12.2014 - 18:25)
Вот тут посмотри, может что полезное найдется.

Спасибо, но чё-т не помогло.
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
F**k  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Новичок
*

Профиль
Группа: Пользователь
Сообщений: 32
Пользователь №: 40641
На форуме: 10 лет, 5 месяцев, 2 дня
Карма: 3




Arcoslov, используй Swiftmailer.
Он умеет аттачить файлы, "внедрять" (embed) картинки так, что почтовые программы корректно из отображают.
Начни читать здесь: http://swiftmailer.org/docs/messages.html#attaching-files
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Arcoslov  
Дата
Цитировать сообщение


Гость пожелал остаться неизвестным

Unregistered









Цитата (F**k @ 15.12.2014 - 21:06)
Arcoslov, используй Swiftmailer.
Он умеет аттачить файлы, "внедрять" (embed) картинки так, что почтовые программы корректно из отображают.
Начни читать здесь: http://swiftmailer.org/docs/messages.html#attaching-files

Да я уж так и понял, что надо использовать phpmailer или что-то такое ))
однако, хочется разобраться в ситуации, а не убегать от проблемы )
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
F**k  
[x] Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Новичок
*

Профиль
Группа: Пользователь
Сообщений: 32
Пользователь №: 40641
На форуме: 10 лет, 5 месяцев, 2 дня
Карма: 3




Я тут нагуглил работающий вариант:
<?php

// read file for attach
$filename = 'image.jpg';
$file_size = filesize($filename);
$content = file_get_contents($filename);
$content = chunk_split(base64_encode($content));

// a random hash will be necessary to send mixed content
$separator = md5(time());

// carriage return type (we use a PHP end of line constant)
$eol = PHP_EOL;

// main header (multipart mandatory)
$headers = "From: name <test@test.com>" . $eol;
$headers .= "MIME-Version: 1.0" . $eol;
$headers .= "Content-Type: multipart/mixed; boundary=\"" . $separator . "\"" . $eol . $eol;
$headers .= "Content-Transfer-Encoding: 7bit" . $eol;
$headers .= "This is a MIME encoded message." . $eol . $eol;

// plain text message
$headers .= "--" . $separator . $eol;
$headers .= "Content-Type: text/plain; charset=\"iso-8859-1\"" . $eol;
$headers .= "Content-Transfer-Encoding: 8bit" . $eol . $eol;
$headers .= 'Plain text message'. $eol . $eol; // <------------------------------------ [1]

// html message

$headers .= "--" . $separator . $eol;
$headers .= "Content-Type: text/html; charset=\"iso-8859-1\"" . $eol;
$headers .= "Content-Transfer-Encoding: 8bit" . $eol . $eol;
$headers .= '<h1>html message</h1>'. $eol . $eol; // <------------------------------------ [2]

// attachment

$headers .= "--" . $separator . $eol;
$headers .= "Content-Type: application/octet-stream; name=\"" . $filename . "\"" . $eol;
$headers .= "Content-Transfer-Encoding: base64" . $eol;
$headers .= "Content-Disposition: attachment" . $eol . $eol;
$headers .= $content . $eol . $eol;
$headers .= "--" . $separator . "--";

//SEND Mail
if (mail('email@gmail.com', 'subject', '', $headers)) {
echo "OK";
} else {
echo "ERROR";
}


Отсюда видно, что все заголовки нужно передавать именно как заголовки, т.е. в $headers, а не $message. А $message получается вообще пустой.

И вот здесь:
$message.= chunk_split(base64_encode('N.jpg')).$eln;

Нужно передавть содердание файла, а не название.
(если это не "опечатка")

Это сообщение отредактировал F**k - 15.12.2014 - 21:01
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Arcoslov  
Дата
Цитировать сообщение


Гость пожелал остаться неизвестным

Unregistered









F**k, вариант вроде фунцихлирует, но есть одно НО.
Получатель в почтовых клиентах получает почту, в которой заблочены картинки, там есть опция типа если вы уверены, дозагрузить изображения.
В случае, если отправлять вёрстку из thunderbird, то клиент, не смотря на это предупреждение, увидит все картинки за исключением фонов таблиц. То есть, человек, не разрешив ещё дозагрузить все картинки , уже видит красивую рассылку.

А если отправлять этим скриптом, то до загрузки картинок клиент вообще не увидит никаких картинок, это дичайшее уродство.

Какой-то сложный код генерит этот загадочный сандербёрд..

swiftmailer умеет отправлять так же кошерно, как и thunderbird?



По поводу файла - да, очепятка, заметил уже.. почикал нечаянно.

Это сообщение отредактировал Arcoslov - 16.12.2014 - 23:49
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
F**k  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Новичок
*

Профиль
Группа: Пользователь
Сообщений: 32
Пользователь №: 40641
На форуме: 10 лет, 5 месяцев, 2 дня
Карма: 3




Swiftmailer умеет – http://swiftmailer.org/docs/messages.html#...ine-media-files

А в примере выше картинка именно аттачится к письму, клиенты должны ее показывать как вложение.
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Arcoslov  
Дата
Цитировать сообщение


Гость пожелал остаться неизвестным

Unregistered









лады, спасибо.
Ещё позаморачиваюсь немного и буду курить свифтмейлер wink.gif

Это сообщение отредактировал Arcoslov - 17.12.2014 - 12:59
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Arcoslov  
Дата
Цитировать сообщение


Гость пожелал остаться неизвестным

Unregistered









F**k, покурил я свифтмейлер.
ничего особенного (как и ничего, решающего мою проблему) я там не нашёл.

если он отправляет text/html, то оно в клиенте с неразблоченными картинками смотрится точно так же, как отправляет скрипт, который ты откопал.

Не нашёл я какой-то уникальной настройки, чтобы отправлял так круто, как thunderbird.
Подскажешь? ))

в свифтмейлере есть :
1) setBody('<b>html text</b>', 'text/html');
2) addPart('text', 'text/plain');

Первое боди, как я понял, является предпочтительным для длиента, а альтернативное, для тех случаев, если основное не катит.

Вот, собственно, и всё..

Это сообщение отредактировал Arcoslov - 3.01.2015 - 01:09
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
F**k  
[x] Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Новичок
*

Профиль
Группа: Пользователь
Сообщений: 32
Пользователь №: 40641
На форуме: 10 лет, 5 месяцев, 2 дня
Карма: 3




Ну вот смотри как у меня работает такой пример:
<?php

require_once 'vendor/autoload.php';

$message = Swift_Message::newInstance()
->
setSubject('Hello')
->
setFrom('test@localhost.dev')
->
setTo('test@localhost.dev');
$message->setBody(
'<html>' .
'<head></head>' .
'<body>' .
' Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet.' .
' <img src="' . $message->embed(Swift_Image::fromPath('../image.jpg')) . '" width="100" align="left" alt="Image" />' .
' Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet.' .
'</body>' .
'</html>',
'text/html'
)
->
addPart('Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet.', 'text/plain');

$transport = Swift_SmtpTransport::newInstance('localhost', 1025)
->
setUsername('your username')
->
setPassword('your password');

$mailer = Swift_Mailer::newInstance($transport);
$mailer->send($message);


В итоге я получается письмо с HTML и plain-text частяями. В HTML "внедрено" изображение.

HTML:
user posted image

Plain-text:
user posted image

И вот так оно отображается в Thunderbird:
user posted image

Ну и само письмо на всякий случай.

P.S.
То есть, я предполагаю, что именно "внедренные" картинки почтовый клиенты показывают "сразу", а по остальным могут возникнуть вопросы "дозагрузить?" и тд.

Это сообщение отредактировал F**k - 3.01.2015 - 06:25
PMПисьмо на e-mail пользователю
    1   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Arcoslov  
Дата
Цитировать сообщение


Гость пожелал остаться неизвестным

Unregistered









Цитата (F**k @ 3.01.2015 - 07:56)

То есть, я предполагаю, что именно "внедренные" картинки почтовый клиенты показывают "сразу", а по остальным могут возникнуть вопросы "дозагрузить?" и тд.

Хвала богам!
Твоё предположение полностью верное! А то я уже совсем замучался.
Действительно, теперь получатель видит рассылку полностью с картинками ещё до нажатия кнопки "дозагрузить изображения".
Всё работает просто отлично!

Конечно, остаётся не понятным, что это за способ такой, как он так эмбедит картинки хитро.. ну, как я предполагаю, картинки копируются\кодируются в тело письма, и получатель не видит их как прикреплённые файлы, а в самом письме ссылка на картинку выглядит так:

<img class="CToWUd" alt="logo" src="?ui=2&ik=ee4041a8c7&view=fimg&th=14ab155a5a9e11c7&attid=0.1&disp=emb&attbid=ANGjdJ8lsZoB7G9wA2zxAq0uReAXG9adp84zpWm9bKbiuM4u4BItZ6yWFrzltjI54qbgat3WImZWuicDSoL8hX4PLjprD-0lVNS9PGfs6i0f6nHcJll0Ugxpd7j6fdo&sz=w244&ats=1420321588750&rm=14ab155a5a9e11c7&zw&atsh=1" style="display:block;width:122px">

причём, параметр class я ему не задавал, оно само при эмбеде так работает.

я так смотрю, результатом функции $message->embed(Swift_Image::fromPath('../image.jpg')) является простая строка вида
cid:adf8daced8b0b1f01e2d1c6e25dcac8d@test5.localhost
, и это подставляется в src= " ... ".

Интересно разобраться, как самому эмбедить, без свифтмейлера ;)
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
  Быстрый ответ
Информация о Госте
Введите Ваше имя
Кнопки кодов
Для вставки цитаты, выделите нужный текст и
НАЖМИТЕ СЮДА
Введите сообщение
Смайлики
:huh:  :o  ;) 
:P  :D  :lol: 
B)  :rolleyes:  <_< 
:)  :angry:  :( 
:unsure:  :blink:  :ph34r: 
     
Показать всё

Опции сообщения  Включить смайлики?
 Включить подпись?
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:

Опции темы Ответ в темуСоздание новой темыСоздание опроса