Отправка писем с картинками на php

Отправка писем с картинками на php Тема отправки писем очень часто встречается в повседневной жизни web-разработчиков, и я не могу оставить ее без внимания. Раньше я уже публиковал пару статей про отправку писем, но хочу написать еще одну. В этой статье я покажу как можно отправлять письма с html-версткой, в которой присутствуют картинки.

Если два способа отображения картинок в письме — подгружать картинки с сайта и отправлять картинки в письме. Первый способ — подгрузка с сайта, проще, но в нем возникают проблемы — не все почтовые агенты отображают содержимое, которое подтягивается с сайтов, картинки блокируются. В таком случае пользователю, чтобы увидеть картинки в письме, нужно будет постоянно разблокировать содержимое письма — это не удобно.
Второй способ отображения картинок в письме — это отправка картинок вместе с письмом. В данном случае, большинство почтовых агентов сразу показывают картинки. Этот способ мне нравится больше, и код именно этого способа отправки я и хочу показать.
Для верстки письма используются те же самые теги, что и для верстке в браузере. Чтобы отобразить в письме картинку нужно использовать тег . Единственное отличие будет в атрибуте SRC — в данном примере ему будет присвоен не путь к картинке, а CID картинки. CID — Content-ID будет указывать на картинку, которую мы предварительно закодируем и отправим вместе с письмом.
А теперь сам код, посмотрев который, вы окончательно поймете принцип отправки письма с картинками:

// картинки
$attach = array(
	'http://vk-book.ru/img/scroll_mouse.jpg',
	'http://vk-book.ru/img/ugly.png'
);
// чтобы отображалась картинка и ее не было в аттаче
// путь к картинке задается через CID: - Content-ID
// тестовый текст
$text = '
	<div style="width: 700px; margin: 0 auto;">
		<h1>тело письма с картинкой</h1>
		<h2>Блок по центру</h2>
		<p>
			<img style="float: left; margin-right: 15px; margin-bottom: 15px;" src="cid:scroll_mouse.jpg" width="128" height="128" />
			Какой-то текст вокруг картинки. Какой-то текст вокруг картинки. Какой-то текст вокруг картинки. Какой-то текст вокруг картинки.
			<br/>
			<img style="float: left; margin-right: 15px; margin-bottom: 15px;" src="cid:ugly.png" width="128" height="128" />
			Какой-то текст вокруг картинки. Какой-то текст вокруг картинки. Какой-то текст вокруг картинки. Какой-то текст вокруг картинки.
		</p>
	</div>
';

$from = "test@test.com";
$to = "zhenikipatov@yandex.ru";
$subject = "Тема письма";

// Заголовки письма === >>>
$headers = "From: $from\r\n";
//$headers .= "To: $to\r\n";
$headers .= "Subject: $subject\r\n";
$headers .= "Date: " . date("r") . "\r\n";
$headers .= "X-Mailer: zm php script\r\n";
$headers .= "MIME-Version: 1.0\r\n";
$headers .= "Content-Type: multipart/alternative;\r\n";
$baseboundary = "------------" . strtoupper(md5(uniqid(rand(), true)));
$headers .= "  boundary=\"$baseboundary\"\r\n";
// <<< ====================

// Тело письма === >>>
$message  =  "--$baseboundary\r\n";
$message .= "Content-Type: text/plain;\r\n";
$message .= "Content-Transfer-Encoding: 7bit\r\n\r\n";
$message .= "--$baseboundary\r\n";
$newboundary = "------------" . strtoupper(md5(uniqid(rand(), true)));
$message .= "Content-Type: multipart/related;\r\n";
$message .= "  boundary=\"$newboundary\"\r\n\r\n\r\n";
$message .= "--$newboundary\r\n";
$message .= "Content-Type: text/html; charset=utf-8\r\n";
$message .= "Content-Transfer-Encoding: 7bit\r\n\r\n";
$message .= $text . "\r\n\r\n";
// <<< ==============

// прикрепляем файлы ===>>>
foreach($attach as $filename){
	$mimeType='image/png';
	$fileContent = file_get_contents($filename,true);
	$filename=basename($filename);
	$message.="--$newboundary\r\n";
	$message.="Content-Type: $mimeType;\r\n";
	$message.=" name=\"$filename\"\r\n";
	$message.="Content-Transfer-Encoding: base64\r\n";
	$message.="Content-ID: <$filename>\r\n";
	$message.="Content-Disposition: inline;\r\n";
	$message.=" filename=\"$filename\"\r\n\r\n";
	$message.=chunk_split(base64_encode($fileContent));
}
// <<< ====================

// заканчиваем тело письма, дописываем разделители
$message.="--$newboundary--\r\n\r\n";
$message.="--$baseboundary--\r\n";

// отправка письма
$result = mail($to, $subject, $message , $headers);
var_dump($result);
Рассказать друзьям:


Оценить:
(1 оценок, среднее: 5,00 из 5)

Отправка писем с картинками на php: 8 комментариев

  1. Да, отлично работает, но есть одна неприятность, которую не могу победить. Если какой либо текст в письме начинать с новой строки, то в теле письма весь текст идет подряд. Допустим текст отредактировать так:
    Какой-то текст вокруг картинки.
    Какой-то текст вокруг картинки.
    Какой-то текст вокруг картинки.
    Какой-то текст вокруг картинки.
    В теле письма результат будет таким:
    Какой-то текст вокруг картинки. Какой-то текст вокруг картинки. Какой-то текст вокруг картинки. Какой-то текст вокруг картинки.

  2. В тебе сообщения видны разделители и заголовки, html как обычный текст. ЭТО РАБОЧИЙ КОД???
    И ещё не мешало бы сделать так, чтобы при ошибке введения кода безопасности не писать сообщение по новой — это первый класс.

  3. Да, код рабочий. Очень помог, спасибо автору!
    Это основа, а дальше можно хоть что придумывать, делать и первый класс и последний.

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

    <?php
    function PrepareMail($_sFrom, $_sTo, $_sSubject, $_sMessage, $_asP_Attachment, &$_asMailInfo)
    /*
    Подготавливает данные для вызова функции mail.

    $_sFrom
    Электронный адрес отправителя в виде "user@domen" или "Имя отправителя «.

    $_sTo
    Электронный адрес получателя в виде «user@domen» или «Имя получателя «.
    Можно указать несколько адресов, разделенных запятой.

    $_sSubject
    Тема письма.

    $_sMessage
    Текст письма.

    $_asP_Attachment
    Массив (полных или относительных) имен графических файлов, встроенных в текст письма, и/или файлов,
    которые нужно прикрепить к письму. Перед именем графического файла должна стоять подстрока вида «»,
    где формат — стандартное обозначение соответствующего графического формата (например, «png», «jpeg» и т.п.).
    Имена графических файлов в массиве должны предшествовать именам прикрепляемых файлов.
    В тексте письма в теге перед именами графических файлов должна стоять подстрока «cid:».

    $_asMailInfo
    Ассоциативный массив, в который функция запишет выходные данные.
    Ключи массива:
    — sSubject
    — sHeaders
    — sBody
    */
    {
    $bTextClosed = false;
    $sBoundary1 = «<<>>»;
    $sBoundary2 = «<<>>»;

    $_asMailInfo = array(
    ‘sSubject’ => »,
    ‘sHeaders’ => »,
    ‘sBody’ => »
    );

    $_asMailInfo[‘sSubject’] = ‘=?utf-8?b?’.base64_encode($_sSubject).’?=’;

    $_asMailInfo[‘sHeaders’] = <<<text
    MIME-Version: 1.0
    From: $_sFrom
    To: $_sTo
    Reply-To: $_sFrom
    Content-Type: multipart/mixed; Boundary="$sBoundary1"

    text;

    $_asMailInfo['sBody'] = <<<text
    —$sBoundary1
    Content-Type: multipart/related; Boundary="$sBoundary2"

    —$sBoundary2
    Content-Type: text/html; Charset=utf-8
    Content-Transfer-Encoding: quoted-printable

    $_sMessage

    text;

    if ($_asP_Attachment) {
    foreach ($_asP_Attachment as $sP_Attachment) {
    $iEnc1 = strpos($sP_Attachment, '’, 1);
    $bImage = $iEnc1 === 0 && $iEnc2 >= 1;

    if ($bImage) {
    $sImageFormat = substr($sP_Attachment, 1, $iEnc2 — 1);
    $sP_Attachment = substr($sP_Attachment, $iEnc2 + 1);
    }

    $sF_Attachment = basename($sP_Attachment);
    $sF_Attachment64 = ‘=?utf-8?b?’.base64_encode($sF_Attachment).’?=’;
    $sAttachment = file_get_contents($sP_Attachment);
    $sAttachment64 = chunk_split(base64_encode($sAttachment));

    if ($bImage) {
    $_asMailInfo[‘sBody’] .= <<<text
    —$sBoundary2
    Content-Type: image/$sImageFormat; Name=$sF_Attachment
    Content-Id: $sF_Attachment
    Content-Transfer-Encoding: base64
    Content-Disposition: inline; FileName=$sF_Attachment

    $sAttachment64

    text;
    }
    else {
    if (!$bTextClosed) {
    $bTextClosed = true;

    $_asMailInfo['sBody'] .= <<<text
    —$sBoundary2—

    text;
    }

    $_asMailInfo['sBody'] .= <<<text
    —$sBoundary1
    Content-Type: application/octet-stream; Name=$sF_Attachment64
    Content-Transfer-Encoding: base64
    Content-Disposition: attachment; FileName=$sF_Attachment64

    $sAttachment64

    text;
    }
    }
    }

    if (!$bTextClosed) {
    $_asMailInfo['sBody'] .= <<<text
    —$sBoundary2—

    text;
    }

    $_asMailInfo['sBody'] .= <<

    Пример отправки письма с помощью данной функции:

    <?php
    PrepareMail(
    $sFrom,
    $sTo,
    $sSubject,
    $sMessage,
    [
    'Attachment/02.png’,
    ‘Attachment/ИТОГИ КЛУБА 10.02.2022.pdf’,
    ‘Attachment/ИТОГИ КЛУБА 12.02.2022.pdf’
    ],
    $asMailInfo
    );

    $bResult = mail($sTo, $asMailInfo[‘sSubject’], $asMailInfo[‘sBody’], $asMailInfo[‘sHeaders’]);
    ?>

Добавить комментарий для Юрий Отменить ответ

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*

code