如何在html电子邮件中embedded图像

我试图实现一个代码发送embedded式图像的HTML电子邮件。

我已经尝试过使用图像的简单HTML电子邮件,但是这个图像是从服务器获取的。

我强烈build议使用像PHPMailer这样的库来发送邮件。
这很容易,自动处理大部分问题。

关于显示embedded式(内嵌)图像,以下是他们的文档 :

内联附件

还有一种方法可以添加附件。 如果你想制作一张HTML格式的电子邮件,并在桌子上放置了图片,就必须附上图片,然后将标签链接到它上面。 例如,如果使用CID my-photo添加图像作为内联附件,则可以使用<img src="cid:my-photo" alt="my-photo" />在HTML电子邮件中访问该<img src="cid:my-photo" alt="my-photo" />

具体来说,这里是添加内联附件的函数:

 $mail->AddEmbeddedImage(filename, cid, name); //By using this function with this example's 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('name@yourdomain.com', 'First Last'); $mail->AddAddress('whoto@otherdomain.com', '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 电子邮件与embedded式图像,所以我给你一个如何做到这一点的例子。
我告诉过你的图书馆可以使用SMTP以外的许多方法发送电子邮件。
查看其他示例的PHPMailer示例页面 。

无论如何,如果您不想以图书馆支持的方式发送电子邮件,您可以(应该)仍然使用图书馆来构build信息,然后以您想要的方式发送。

例如:

您可以replace发送电子邮件的行:

 $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 

希望有所帮助。 让我知道如果你遇到麻烦,使用它。

我正在使用这个function,查找我的信中的所有图像,并将其附加到消息。

参数:把你的HTML(你想发送);
返回:您可以在mail()使用必要的HTML和标题;

用法示例:

 define("DEFCALLBACKMAIL", "yourmail@yourdomain.com"); // WIll be shown as "from". $final_msg = preparehtmlmail($html); // give a function your html* mail('your@mail.com', '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电子邮件中embedded图像。 编写HTML时,必须在文件系统中提供完整的path:

 <img src="/var/www/hosthttp://img.dovov.comphoto.png" alt="my photo" /> 

它会自动转换为:

 <img src="cid:photo.png" alt="my photo" /> 

根据Arthur Halma的回答,我做了以下工作,正确使用苹果,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 MYH: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,但大多数邮件程序将阻止此垃圾邮件发送者使用技巧来检测电子邮件地址的活跃性。

你不会说什么语言,但这里只是一个例子 。

这是获取stringvariables而不必担心编码的一种方法。

如果你有Mozilla Thunderbird ,你可以使用它来为你获取HTML图像代码。

我在这里写了一个小小的教程,里面有一个截图(这是为PowerShell,但这并不重要):

PowerShell的电子邮件与HTML图片显示红色的X

然后再次:

如何在电子邮件中embedded图像