在iPhone,iPad上显示内嵌图像

我正在试图用内联图像在Django中创build一个电子邮件。

msg = EmailMultiAlternatives(...) image_file = open('file_path', 'rb') img = MIMEImage(img_data) image_file.close() img.add_header('Content-ID', '<image1>') img.add_header('Content-Disposition', 'inline') msg.attach(img) msg.send() 

在模板中,我会这样引用它:

 <img src="cid:image1" /> 

这在networking浏览器,outlook,thunderbird …中都可以正常工作,除了OSX,iPad和iPhone上的苹果邮件客户端。 图像显示两次。 它们被正确放置在内联中,但也被附加到电子邮件的底部。 我的问题是,我如何摆脱底部的图像? 或者我应该以不同方式处理电子邮件中的图像

参考文献:
http://djangosnippets.org/snippets/1507/
Django:如何发送embedded式图像的HTML电子邮件
用python / django创build一个带有图片的MIME邮件模板

不同的电子邮件客户端select以不同的方式呈现multipart/mixed消息。

大多数客户select按照他们被添加到电子邮件中的顺序来呈现每个部分(在“多部分”消息中)内联。 但是 ,如果在text/html部分中引用图像,则大多数客户端不会在以后再次显示该图像,作为“内联所有部分”过程的一部分。

OSX和iOS上的Apple Mail是不同的,只要它们按照包含的顺序显示multipart/mixed消息中的每个部分,而不pipeHTML和图像之间是否有内部引用。 这将导致您的图像在HTML中显示一次,并在消息的结尾自动内联。

解决scheme是将您的HTML和图像资产分组到一个related部分。 即:

 from django.core.mail import EmailMultiAlternatives from email.mime.image import MIMEImage from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText # HTML + image container related = MIMEMultipart("related") # Add the HTML html = MIMEText('an image: <img src="cid:some_image"/>', "html") related.attach(html) # Add an image with open("icon.png", "rb") as handle: image = MIMEImage(handle.read()) image.add_header("Content-ID", "<some_image>") image.add_header("Content-Disposition", "inline") related.attach(image) # top level container, defines plain text version email = EmailMultiAlternatives(subject="demo", body="plain text body", from_email="foo@example.com", to=["bar@example.com"]) # add the HTML version email.attach(related) # Indicate that only one of the two types (text vs html) should be rendered email.mixed_subtype = "alternative" email.send()