Тема отправки писем очень часто встречается в повседневной жизни 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);
Спасибо за рабочий код!
Да, отлично работает, но есть одна неприятность, которую не могу победить. Если какой либо текст в письме начинать с новой строки, то в теле письма весь текст идет подряд. Допустим текст отредактировать так:
Какой-то текст вокруг картинки.
Какой-то текст вокруг картинки.
Какой-то текст вокруг картинки.
Какой-то текст вокруг картинки.
В теле письма результат будет таким:
Какой-то текст вокруг картинки. Какой-то текст вокруг картинки. Какой-то текст вокруг картинки. Какой-то текст вокруг картинки.
Пропишите так:
Какой-то текст вокруг картинки.
и будет всё норм!
А, да? Так надо было прописать? А то я без тебя — болвана, сам то не сообразил
Спасибо:))
В тебе сообщения видны разделители и заголовки, html как обычный текст. ЭТО РАБОЧИЙ КОД???
И ещё не мешало бы сделать так, чтобы при ошибке введения кода безопасности не писать сообщение по новой — это первый класс.
Да, код рабочий. Очень помог, спасибо автору!
Это основа, а дальше можно хоть что придумывать, делать и первый класс и последний.