Отправка e-mail PHP

Отправка e-mail 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 = "spawn9106@mail.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);

Поделитесь статьей со своими друзьями