EmailMultiAlternatives 在 django 中发送带有图像的邮件时添加 3D

Posted

技术标签:

【中文标题】EmailMultiAlternatives 在 django 中发送带有图像的邮件时添加 3D【英文标题】:EmailMultiAlternatives adding a 3D when sending mail with image in django 【发布时间】:2010-12-08 13:30:44 【问题描述】:

我正在使用 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"  /> <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 对象的附加方法。实际上它可以接受任何从 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()

【问题讨论】:

【参考方案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  src="cid:part1.08020903.07040100@grsites.com"
  ><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/

【讨论】:

【参考方案2】:

我遇到了同样的问题,这是我发现的:

首先,免责声明。我对电子邮件消息标准了解不多。这是我在搜索、阅读和实验后发现的。据我所知,它有效。

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 票中得到的。

我知道这个问题已经很老了,但没有一个让我满意的回复,并且是唯一一个出现在这个问题上的谷歌搜索。

【讨论】:

这为我修好了!只是一个小错字,应该是 msg.mixed_subtype = 'related' 而不是 relative...

以上是关于EmailMultiAlternatives 在 django 中发送带有图像的邮件时添加 3D的主要内容,如果未能解决你的问题,请参考以下文章

EmailMultiAlternatives 的 Celery 错误

在mail_admins()中发送EmailMultiAlternatives

如何在 Django 中为 EmailMultiAlternatives 自定义电子邮件后端

将多个收件人电子邮件和姓名附加到 EmailMultiAlternatives

python + django+ EmailMultiAlternatives Template'对象没有属性'encode

DJango 邮件在本地工作但不在生产中