使用内嵌图像在php中发送电子邮件

时间:2011-03-31 10:35:51

标签: php image email inline

我使用php的内置邮件功能来发送电子邮件。到目前为止,通过查看其他示例并剥离我认为必要的内容,我已经取得了很多成就。

我目前使用内联图片发送电子邮件的代码如下所示。内容是使用一个模板生成的,该模板可能有也可能没有一些占位符,这些占位符被我的数据库中的值替换(这被省略)

function sendEmail($to, $subject, $htmlmessage, $inline_images = array()){   
   define('RN', "\n");
   /* define mime boundaries */
   $mime_boundary_mix = "_mix_" . md5(time());

   /* set headers */
   $headers = "From: info@domain.nl" . RN;
   $headers .= "Reply-To: info@domain.nl" . RN;
   $headers .= "Return-Path: info@otherdomain.nl" . RN;
   $headers .= "Message-ID: <".time()."_DOMAIN@".$_SERVER['SERVER_NAME'].">" . RN;
   $headers .= "X-Mailer: PHP v".phpversion() . RN;

   $headers .= "Mime-Version: 1.0" . RN;
   $headers .= "Content-Type: multipart/mixed;" . RN;
   $headers .= " boundary=\"{$mime_boundary_mix}\"";

   /* start email body with mime_boundary */
   $msg = "--{$mime_boundary_mix}" . RN;
   /* include html */
   $msg .= "Content-Type: text/html; charset=\"iso-8859-15\"". RN;
   $msg .= "Content-Transfer-Encoding: 8bit". RN . RN;
   $msg .= $htmlmessage . RN;

   /* check if there are inline images */
   if(count($inline_images) > 0) {
      foreach($inline_images as $image) {
         $path_to_image = $image['path'];
         $image_filename = basename($path_to_image);
         $image_type = filetype($path_to_image);

         $file_handler = fopen($path_to_image, 'rb');
         $image_data = chunk_split(base64_encode(fread($file_handler, filesize($path_to_image))));
         fclose($file_handler);

         /* start mime boundary */
         $msg .= "--{$mime_boundary_mix}" . RN;
         /* add image data */
         $msg .= "Content-Type: {" . image_type_to_mime_type (exif_imagetype($path_to_image)) . "};" . RN;
         $msg .= " name=\"{$image_filename}\"" . RN;
         $msg .= "Content-Disposition: inline;" . RN;
         $msg .= " filename=\"{$image_filename}\"" . RN;
         $msg .= "Content-Transfer-Encoding: base64" . RN . RN;
         $msg .= $image_data . RN . RN;

      }
      /* end mime boundary */
      $msg .= "--{$mime_boundary_mix}--" . RN;

   }
   /* end mime boundary */
   $msg .= "--{$mime_boundary_mix}--" . RN;

   return mail($to, $subject, $msg, $headers);
}

$ inline_images是一个数组,其中包含带有图像路径的项目,如: array([0] =&gt; array('path'=&gt;“myimage.png”))(如果我没弄错,但这并不重要)

任何人都可以告诉我为什么使用这个代码,Outlook会在这封电子邮件中添加一个附件图标以及为什么gmail会显示警告:你想显示所有图像并且在我允许这些图像时不显示任何图像吗? 关于这个的一些问题: - 在Outlook中接收此电子邮件工作正常,但如果可能的话我想隐藏回形针图标,毕竟它是嵌入式图像而不是真正的附件。 - 在GMail中,我收到电子邮件,其中包含图像作为附件和空白(图像图标残破)在电子邮件中的所有图像的位置,我该如何解决这个问题? GMail首先问我是否要允许图像,但是在我允许空白显示之后。我还可以将图像隐藏在GMail中作为附件吗? - 我也尝试在Office Outlook Web Access中查看电子邮件,它以与GMail相同的方式显示电子邮件:图像未显示,但仅作为附件。

任何人都可以帮我吗? 如果您需要更多详细信息,请询问。

1 个答案:

答案 0 :(得分:0)

为什么不能选择像phpmailer或switmailer这样的库。他们为html邮件提供全面支持。此外,您不需要创建所有标题。