Как вставлять изображения в html-адрес электронной почты
Я пытаюсь реализовать код для отправки электронной почты HTML со встроенным изображением.
Я уже пробовал для простой электронной почты HTML с изображением, но это изображение взято с сервера.
Ответы
Ответ 1
Я бы настоятельно рекомендовал использовать библиотеку, например 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!
}
?>
Edit:
Что касается вашего комментария, вы спросили, как отправить 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
Надеюсь, что это поможет.
Сообщите мне, если у вас возникнут проблемы с его использованием.
Ответ 2
Я использую эту функцию, которая находит все изображения в письме и прикрепляет его к сообщению.
Параметры: принимает ваш 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);
}
Ответ 3
PHPMailer имеет возможность автоматически вставлять изображения из электронной почты вашего HTML. Вы должны указать полный путь в файловой системе при написании своего HTML:
<img src="/var/www/host/images/photo.png" alt="my photo" />
Он автоматически преобразуется в:
<img src="cid:photo.png" alt="my photo" />
Ответ 4
Основываясь на ответе Артура Халмы, я сделал следующее, что правильно работает с сообщениями 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);
}
Ответ 5
Вы должны закодировать свою электронную почту как мультимиллионный mime, а затем вы можете прикреплять письма в виде вложений в основном. Вы ссылаетесь на них cid в письме.
В качестве альтернативы вы не можете прикреплять их к электронной почте и использовать URL-адреса напрямую, но большинство почтовых программ блокируют это, поскольку спамеры используют трюк для обнаружения активности адресов электронной почты.
Вы не говорите, какой язык, но здесь один пример.
Ответ 6
Вот способ получить строковую переменную, не беспокоясь о кодировании.
Если у вас есть Mozilla Thunderbird, вы можете использовать его для получения кода изображения html для вас.
Я написал небольшой учебник здесь, в комплекте с скриншотом (это для powershell, но это не имеет значения для этого):
электронная почта powershell с изображением html, отображающим красный x
И снова:
Как вставлять изображения в электронную почту