使用Python的email.mime.multipart发送HTML邮件时命名内联图像

时间:2015-05-10 14:27:19

标签: python html-email

使用python的电子邮件包我发送带有内嵌图像的电子邮件。这样可行。现在,我想为这些图像(而不是html标题..)分配实际名称,因此在下载它们时,它们不会被命名为' noname' (例如gmail)。现在代码:

from email.mime.multipart import MIMEMultipart

msgRoot = MIMEMultipart('related')
msgAlternative = MIMEMultipart('alternative')
...

# image file
msgText = MIMEText('<img src="cid:image" alt="Smiley" title="title">', 'html')
msgAlternative.attach(msgText)

# In-line Image
with open('/Users/john/Desktop/2015-04-21_13.35.38.png', 'rb') as fp:
    msgImage = MIMEImage(fp.read())
msgImage.add_header('Content-ID', '<image>')
msgRoot.attach(msgImage)

...
server.sendmail(sender, recipients, msgRoot.as_string())

我尝试了很多东西,并且还多次询问谷歌。它甚至可能吗?感谢。

2 个答案:

答案 0 :(得分:3)

解决方案:

实际上可以分配 Content-ID Content-Type Content-Transfer-Encoding &amp; Content-Disposition 到一个MIME文件(check for more)。通过这样,你可以添加:

msgImage.add_header('Content-Disposition', 'inline', filename='filename')

所以,你最终得到了:

from email.mime.multipart import MIMEMultipart

msgRoot = MIMEMultipart('related')
msgAlternative = MIMEMultipart('alternative')
...

# image file
msgText = MIMEText('<img src="cid:image" alt="Smiley" title="title">', 'html')
msgAlternative.attach(msgText)

# In-line Image
with open('/Users/john/Desktop/2015-04-21_13.35.38.png', 'rb') as fp:
    msgImage = MIMEImage(fp.read())
msgImage.add_header('Content-ID', '<image>')
msgImage.add_header('Content-Disposition', 'inline', filename='filename')
msgRoot.attach(msgImage)

...
server.sendmail(sender, recipients, msgRoot.as_string())

你完成了。

您可能更喜欢@PascalvKooten提到的方式,创建MIMEImage实例,如下所示:

msgImage = MIMEImage(fp.read(), filename='filename')

这也像魅力一样。

答案 1 :(得分:1)

在你提到这个问题后我调查了这个,很难找到!

验证后,可以通过以下方式设置名称:

msgImage = MIMEImage(fp.read(), name = 'filename')

此外,我维持yagmail;一个应该可以轻松发送电子邮件的包。我包含了您想要的功能,并刚刚发布了一个新的小更新!

您可以使用yagmail获取pip install(或者使用{3}来获取Python 3)。

开始连接:

pip3 install

这只会发送图片:

import yagmail
yag = yagmail.Connect('username', 'password')

它将使用路径末尾的默认命名(在本例中为yag.send('someone@mail.com', contents = ['/local/or/external/image.png']) )。虽然也可以给别名(所有别名都由dicts完成,如下所示:image.png

该软件包将自行猜测文件内容,也就是说,它会知道您何时在谈论HTML /图像/其他类型的内容,或者当您正在撰写文本时......您可以所有这些只是把它放进contents = [{'/local/or/external/image.png' : 'newfilename'}]

另一个例子:

contents

它有许多你可能会觉得有吸引力的其他功能,described and maintained here