2012-04-11 107 views
7

我正尝试在嵌入式图像中使用Django创建电子邮件。在iPhone,iPad上显示嵌入式图像

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" /> 

此作品在网络浏览器,Outlook,Thunderbird的罚款...所有除了在OSX上,iPad和苹果邮件客户端苹果手机。图像显示两次。它们被正确放置在内联中,但它们也被附加到电子邮件的底部。我的问题是,我该如何摆脱底部的图像?还是应该以不同方式处理电子邮件中的图像。

参考文献:
http://djangosnippets.org/snippets/1507/
Django: How to send HTML emails with embedded images
creating a MIME email template with images to send with python/django

+0

重新标记您的问题,如“邮件”或“苹果电邮”更具体的标签找人更感兴趣,而忘记索要“创建使用Django电子邮件”现在。 – hynekcer 2012-04-11 11:37:43

+0

感谢您的建议 – SunnySydeUp 2012-04-11 11:43:32

+0

附加图片(据我所知)是试图让他们默认显示 - 即不必启用“显示来自[email protected]的所有图像”,所以替代方法是改为使用服务器上托管的图像的URL。该图片只会显示一次,但可能需要用户采取措施 – 2012-04-11 11:52:34

回答

10

不同的电子邮件客户选择来呈现不同的方式multipart/mixed消息。

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

Apple邮件上OSX和iOS是不同的,在目前为止,因为它们将显示在顺序multipart/mixed消息中的每个部分,他们都包括在内,不论HTML和图像之间的任何内引用的。这会导致您的图像在您的HTML中显示一次,并在消息的末尾自动显示内容。

解决方案是将您的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="[email protected]", 
           to=["[email protected]"]) 
# 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() 
+0

这是否显示Gmail中的电子邮件而不按“显示图片...”? – nelsonvarela 2012-07-16 09:31:23

+0

@iAmTheOneAndOnly我还没有测试过,但我怀疑它。即使这样做,这是Gmail中的一个错误,您应该期望他们修复它,所以不要依赖它。 – 2012-07-16 22:44:17

+0

任何想法如何可以用ruby做到这一点?的ActionMailer? – mirage 2015-06-18 08:31:25