Как вручную вставить изображения в электронное письмо? - PullRequest
0 голосов
/ 28 июня 2010

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

Как встраивать изображения в электронные письма без использования стороннего программного обеспечения?

Ответы [ 2 ]

0 голосов
/ 13 октября 2017

Я использую vanilla PHP для отправки писем со встроенными изображениями.Ядро кода выглядит следующим образом:

$from = "$from_name <$from_email>";
$reply = "$replyto_name <$replyto_email>";
$to = "$to_name <$to_email>";

$main_boundary = substr( sha1(rand()), 0, 20 );  
$part_boundary = substr( sha1(rand()), 0, 20 );  

$headers  = "From: $from\n";  
$headers .= "Reply-To: $reply\n";  
$headers .= "X-Mailer: PHP script mailer\n";  
$headers .= "MIME-Version: 1.0\n";  
$headers .= 'Content-Type: multipart/alternative;'."\n".' boundary="'.$main_boundary.'"'."\n";

$message=
'This is a multi-part message in MIME format.
--'.$main_boundary.'
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 7bit

'.$msgTXT.'

--'.$main_boundary.'
Content-Type: multipart/related;
 boundary="'.$part_boundary.'"


--'.$part_boundary.'
Content-Type: text/html; UTF-8
Content-Transfer-Encoding: 7bit

'.$msgHTML.'

--'.$part_boundary.'
Content-Type: image/png; name="logo.png"
Content-Transfer-Encoding: base64
Content-Disposition: inline; filename="logo.png"
Content-ID: <part1.logo.111@example.com>

<base64 encoded image here>
--'.$part_boundary.'
Content-Type: image/gif; name="logo2.gif"
Content-Transfer-Encoding: base64
Content-Disposition: inline; filename="logo2.gif"
Content-ID: <part2.logo.222@example.com>

<base64 encoded image here>
--'.$part_boundary.'--

--'.$main_boundary.'--

';

$mailsent = mail ($to, $subject, $message, $headers);

Что важно:

  • объявить Content-Type как multipart / альтернативный
  • использовать 2 граничных блока в качестве маркеров/ разделители для основной границы электронной почты и границы детали для компонентов электронной почты внутри основного региона.Обратите внимание, что он отправляет текстовое и альтернативное сообщение HTML.Все встроенные изображения должны быть в кодировке base64.Обратите внимание, что \ r \ n \ r \ n должен быть сохранен в том виде, в котором он работает для кода, он действует как разделитель, как определено в спецификациях RFC.Таким же образом можно использовать этот механизм для отправки электронных писем с вложениями, просто нужно выбрать правильный тип контента.
0 голосов
/ 28 июня 2010

Обычно, если вы прикрепляете изображение к электронному письму, используя следующие заголовки MIME, оно будет доступно для text/html как изображение:

Content-Type: image/jpeg
Attachment-Disposition: inline; filename=MYIMAGE.JPG

А затем в теле сообщения:

Content-Type: text/html; charset=utf-8
Content-Transfer-Encoding: 7bit

<html>

    <!-- HTML tags -->
    <img src="MYIMAGE.JPG" />
    <!-- more HTML tags -->

</html>
...