我正在使用EmailMultiAlternatives类通过django发送文本和html邮件。 在使用一些虚拟代码进行测试时,我想添加带有一些文本的图像。
msg = EmailMultiAlternatives('My subject','some text here', 'from@domain.com', ['to@my_domain.com'])
msg.attach_alternative('<p>here is what I was talking about</p> <img src="logo.png" alt="logo_here" /> <div>You see???</div>', 'text/html')
msg.attach_file('/var/my_site/static/images/logo.png')
msg.send()
问题是在电子邮件客户端上图像没有显示...
查看原始电子邮件,我发现了这个:
--===============1013820581535380480==
Content-Type: text/html; charset="utf-8"
MIME-Version: 1.0
Content-Transfer-Encoding: quoted-printable
<p>here is what I was talking about</p> <img src=3D"logo.png" alt=3D"logo_h=
ere" /> <div>You see???</div>
--===============1013820581535380480==--
有没有人知道我做错了什么?
谢谢!
编辑:我可以设法将图像嵌入到html邮件中。似乎EmailMultiAlternatives有一个可以接受MimeImage对象的attach方法。实际上它可以接受任何继承自MimeBase的东西。
fp = open('test.jpg', 'rb')
msgImage = MIMEImage(fp.read())
fp.close()
mimeImage = MimeImage(fp.read())
mimeImage.add_header('Content-ID', '<logo.png>')
msg.attach(mimeImage)
msg.send()
答案 0 :(得分:4)
我遇到了同样的问题,这就是我发现的:
首先,免责声明。我对电子邮件标准知之甚少。这是我在搜索,阅读和试验后发现的。据我所知,它有效。
1)图像不显示的问题是因为Django中的EmailMessage(和EmailMultiAlternatives)类使用“multipart / mixed”内容类型作为消息,实际上你需要“multipart / related”。 对我有用的是:
msg = EmailMultiAlternatives()
msg.mixed_subtype = 'related'
多数民众赞成!
2)3D显示问题不应影响您的信息。我认为这是“引用的可打印”规范的一部分。如果您不喜欢它并且您更喜欢8位或7位,请在文件顶部尝试:
from email import Charset
# Due to http://code.djangoproject.com/ticket/11212
Charset.add_charset('utf-8',Charset.SHORTEST,None,'utf-8')
正如评论所说,我从django票中得到了这个。
我知道这个问题相当陈旧,但没有回复令我满意,并且是唯一一个在这个问题上出现谷歌搜索的人。
答案 1 :(得分:1)
这只是部分解决方案。当我在thunderbird中创建一个电子邮件并嵌入一个图像(当我查看该消息时它是可见的),源代码如下所示:
--------------070800070205000904000708
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: 7bit
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
</head>
<body bgcolor="#ffffff" text="#000000">
<img alt="asdsa" src="cid:part1.08020903.07040100@grsites.com"
height="38" width="150"><br>
</body>
</html>
--------------070800070205000904000708
Content-Type: image/jpeg;
name="added.jpg"
Content-Transfer-Encoding: base64
Content-ID: <part1.08020903.07040100@grsites.com>
Content-Disposition: inline;
filename="added.jpg"
然后图像的内容如下。图像标记中的URL必须是附加图像的Content-ID。我只是不确定如何指定。
编辑:看来你可以用标准库中的电子邮件模块而不是Django的EmailMultiAlternatives来实现。见这里:http://code.activestate.com/recipes/473810/