Я пытаюсь реализовать код для отправки электронной почты HTML со встроенным изображением.
Я уже пробовал для простой электронной почты HTML с изображением, но это изображение взято с сервера.
Я пытаюсь реализовать код для отправки электронной почты HTML со встроенным изображением.
Я уже пробовал для простой электронной почты HTML с изображением, но это изображение взято с сервера.
Я бы настоятельно рекомендовал использовать библиотеку, например PHPMailer для отправки писем.
Это проще и автоматически обрабатывает большинство проблем.
Что касается отображения встроенных (встроенных) изображений, здесь, что на их документации:
Встроенные вложения
Существует дополнительный способ добавления крепление. Если вы хотите создать HTML-код электронная почта с изображениями, включенными в на столе, необходимо прикрепить изображение, а затем привязать к нему тег. Для Например, если вы добавляете изображение как встроенное приложение с CID my-photo, вы получит доступ к нему в HTML-письме с
<img src="cid:my-photo" alt="my-photo" />
.В частности, здесь добавлена функция добавления встроенное вложение:
$mail->AddEmbeddedImage(filename, cid, name);
//By using this function with this example value above, results in this code:
$mail->AddEmbeddedImage('my-photo.jpg', 'my-photo', 'my-photo.jpg ');
Чтобы дать вам более полный пример того, как он будет работать:
<?php
require_once('../class.phpmailer.php');
$mail = new PHPMailer(true); // the true param means it will throw exceptions on errors, which we need to catch
$mail->IsSMTP(); // telling the class to use SMTP
try {
$mail->Host = "mail.yourdomain.com"; // SMTP server
$mail->Port = 25; // set the SMTP port
$mail->SetFrom('[email protected]', 'First Last');
$mail->AddAddress('[email protected]', 'John Doe');
$mail->Subject = 'PHPMailer Test';
$mail->AddEmbeddedImage("rocks.png", "my-attach", "rocks.png");
$mail->Body = 'Your <b>HTML</b> with an embedded Image: <img src="cid:my-attach"> Here is an image!';
$mail->AddAttachment('something.zip'); // this is a regular attachment (Not inline)
$mail->Send();
echo "Message Sent OK<p></p>\n";
} catch (phpmailerException $e) {
echo $e->errorMessage(); //Pretty error messages from PHPMailer
} catch (Exception $e) {
echo $e->getMessage(); //Boring error messages from anything else!
}
?>
Что касается вашего комментария, вы спросили, как отправить HTML письмо со встроенными изображениями, поэтому я привел вам пример того, как это сделать.
Библиотека, о которой я вам рассказывал, может отправлять электронные письма, используя множество методов, отличных от SMTP.
Взгляните на страницу примера PHPMailer для других примеров.
В том или ином случае, если вы не хотите отправлять электронное письмо способами, поддерживаемыми библиотекой, вы можете (должны) использовать библиотеку для создания сообщения, а затем отправлять его так, как вы хотите.
Например:
Вы можете заменить строку, отправляющую электронное письмо:
$mail->Send();
При этом:
$mime_message = $mail->CreateBody(); //Retrieve the message content
echo $mime_message; // Echo it to the screen or send it using whatever method you want
Надеюсь, что это поможет. Сообщите мне, если у вас возникнут проблемы с его использованием.
Я использую эту функцию, которая находит все изображения в письме и прикрепляет его к сообщению.
Параметры: принимает ваш HTML (который вы хотите отправить),
Возврат: Необходимые HTML и заголовки, которые вы можете использовать в mail()
;
Использование примера:
define("DEFCALLBACKMAIL", "[email protected]"); // WIll be shown as "from".
$final_msg = preparehtmlmail($html); // give a function your html*
mail('[email protected]', 'your subject', $final_msg['multipart'], $final_msg['headers']);
// send email with all images from html attached to letter
function preparehtmlmail($html) {
preg_match_all('~<img.*?src=.([\/.a-z0-9:_-]+).*?>~si',$html,$matches);
$i = 0;
$paths = array();
foreach ($matches[1] as $img) {
$img_old = $img;
if(strpos($img, "http://") == false) {
$uri = parse_url($img);
$paths[$i]['path'] = $_SERVER['DOCUMENT_ROOT'].$uri['path'];
$content_id = md5($img);
$html = str_replace($img_old,'cid:'.$content_id,$html);
$paths[$i++]['cid'] = $content_id;
}
}
$boundary = "--".md5(uniqid(time()));
$headers .= "MIME-Version: 1.0\n";
$headers .="Content-Type: multipart/mixed; boundary=\"$boundary\"\n";
$headers .= "From: ".DEFCALLBACKMAIL."\r\n";
$multipart = '';
$multipart .= "--$boundary\n";
$kod = 'utf-8';
$multipart .= "Content-Type: text/html; charset=$kod\n";
$multipart .= "Content-Transfer-Encoding: Quot-Printed\n\n";
$multipart .= "$html\n\n";
foreach ($paths as $path) {
if(file_exists($path['path']))
$fp = fopen($path['path'],"r");
if (!$fp) {
return false;
}
$imagetype = substr(strrchr($path['path'], '.' ),1);
$file = fread($fp, filesize($path['path']));
fclose($fp);
$message_part = "";
switch ($imagetype) {
case 'png':
case 'PNG':
$message_part .= "Content-Type: image/png";
break;
case 'jpg':
case 'jpeg':
case 'JPG':
case 'JPEG':
$message_part .= "Content-Type: image/jpeg";
break;
case 'gif':
case 'GIF':
$message_part .= "Content-Type: image/gif";
break;
}
$message_part .= "; file_name = \"$path\"\n";
$message_part .= 'Content-ID: <'.$path['cid'].">\n";
$message_part .= "Content-Transfer-Encoding: base64\n";
$message_part .= "Content-Disposition: inline; filename = \"".basename($path['path'])."\"\n\n";
$message_part .= chunk_split(base64_encode($file))."\n";
$multipart .= "--$boundary\n".$message_part."\n";
}
$multipart .= "--$boundary--\n";
return array('multipart' => $multipart, 'headers' => $headers);
}
PHPMailer имеет возможность автоматически вставлять изображения из электронной почты вашего HTML. Вы должны указать полный путь в файловой системе при написании своего HTML:
<img src="/var/www/host/images/photo.png" alt="my photo" />
Он автоматически преобразуется в:
<img src="cid:photo.png" alt="my photo" />
Основываясь на ответе Артура Халмы, я сделал следующее, что правильно работает с сообщениями Apple, Android и iOS.
define("EMAIL_DOMAIN", "yourdomain.com");
public function send_email_html($to, $from, $subject, $html) {
preg_match_all('~<img.*?src=.([\/.a-z0-9:_-]+).*?>~si',$html,$matches);
$i = 0;
$paths = array();
foreach ($matches[1] as $img) {
$img_old = $img;
if(strpos($img, "http://") == false) {
$uri = parse_url($img);
$paths[$i]['path'] = $_SERVER['DOCUMENT_ROOT'].$uri['path'];
$content_id = md5($img);
$html = str_replace($img_old,'cid:'.$content_id,$html);
$paths[$i++]['cid'] = $content_id;
}
}
$uniqid = md5(uniqid(time()));
$boundary = "--==_mimepart_".$uniqid;
$headers = "From: ".$from."\n".
'Reply-to: '.$from."\n".
'Return-Path: '.$from."\n".
'Message-ID: <'.$uniqid.'@'.EMAIL_DOMAIN.">\n".
'Date: '.gmdate('D, d M Y H:i:s', time())."\n".
'Mime-Version: 1.0'."\n".
'Content-Type: multipart/related;'."\n".
' boundary='.$boundary.";\n".
' charset=UTF-8'."\n".
'X-Mailer: PHP/' . phpversion();
$multipart = '';
$multipart .= "--$boundary\n";
$kod = 'UTF-8';
$multipart .= "Content-Type: text/html; charset=$kod\n";
$multipart .= "Content-Transfer-Encoding: 7-bit\n\n";
$multipart .= "$html\n\n";
foreach ($paths as $path) {
if (file_exists($path['path']))
$fp = fopen($path['path'],"r");
if (!$fp) {
return false;
}
$imagetype = substr(strrchr($path['path'], '.' ),1);
$file = fread($fp, filesize($path['path']));
fclose($fp);
$message_part = "";
switch ($imagetype) {
case 'png':
case 'PNG':
$message_part .= "Content-Type: image/png";
break;
case 'jpg':
case 'jpeg':
case 'JPG':
case 'JPEG':
$message_part .= "Content-Type: image/jpeg";
break;
case 'gif':
case 'GIF':
$message_part .= "Content-Type: image/gif";
break;
}
$message_part .= "; file_name = \"$path\"\n";
$message_part .= 'Content-ID: <'.$path['cid'].">\n";
$message_part .= "Content-Transfer-Encoding: base64\n";
$message_part .= "Content-Disposition: inline; filename = \"".basename($path['path'])."\"\n\n";
$message_part .= chunk_split(base64_encode($file))."\n";
$multipart .= "--$boundary\n".$message_part."\n";
}
$multipart .= "--$boundary--\n";
mail($to, $subject, $multipart, $headers);
}
Вы должны закодировать свою электронную почту как мультимиллионный mime, а затем вы можете прикреплять письма в виде вложений в основном. Вы ссылаетесь на них cid в письме.
В качестве альтернативы вы не можете прикреплять их к электронной почте и использовать URL-адреса напрямую, но большинство почтовых программ блокируют это, поскольку спамеры используют трюк для обнаружения активности адресов электронной почты.
Вы не говорите, какой язык, но здесь один пример.
Вот способ получить строковую переменную, не беспокоясь о кодировании.
Если у вас есть Mozilla Thunderbird, вы можете использовать его для получения кода изображения html для вас.
Я написал небольшой учебник здесь, в комплекте с скриншотом (это для powershell, но это не имеет значения для этого):
электронная почта powershell с изображением html, отображающим красный x
И снова: