Python,MIME,在电子邮件中嵌入图像

时间:2017-06-04 21:55:17

标签: python

我正在测试发送带有嵌入式png文件的电子邮件。我使用代码:

from smtplib import SMTP
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText

template ="""
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<h2>Image Test</h2>
<img src="/home/depot/wintergreen/mplplots/01.png">
</body>
</html>"""

MAIL_HOST = 'smtp.gmail.com:587'
MAIL_USER = 'xxx@gmail.com'
MAIL_PASSWORD = 'xxx'
MAIL_REPICIENTS = ['vincent.konate@gmail.com']        

message = MIMEMultipart('alternative')
message['Subject'] = "Test Image"

html = MIMEText(template, 'html', "utf-8")
message.attach(html)

smtp = SMTP(MAIL_HOST)
smtp.ehlo()
smtp.starttls()
smtp.login(MAIL_USER, MAIL_PASSWORD)
smtp.sendmail(MAIL_USER, MAIL_REPICIENTS, message.as_string())
smtp.close()

发送工作,但图像没有显示,而是我看到的: enter image description here

我正在测试Jupyter笔记本;当我输入

from IPython.display import Image
Image("/home/depot/wintergreen/mplplots/01.png")

图像显示,因此路径正确。

这里可能有什么问题?

2 个答案:

答案 0 :(得分:0)

您需要使用email.utils.make_msgid创建一个ID,然后在图像标签src属性中使用它。您还需要将图像嵌入消息中。

选中python's 3.5 email example 19.1.14,其中显示了如何在HTML和HTML中嵌入文件。

请注意,对于 3.7 ,API已更改。

答案 1 :(得分:-1)

您的图片网址需要包含主机名。你只有:

<img src="/home/depot/wintergreen/mplplots/01.png">

您需要以下内容:

<img src="http://myhostname.com/home/depot/wintergreen/mplplots/01.png">

因为当您的用户收到电子邮件时,需要有域名。

现在,如果图像未在某处托管,但在所有收件人均可访问的文件系统上可用(例如,在公司内部网上阅读时),则可以使用file URI而不是http。例如

<img src="file:///home/depot/wintergreen/mplplots/01.png">

适用于设备可以访问文件本地目录的收件人。

最后,选项包括电子邮件中的图像本身(而不仅仅是指向它的链接)。要实际包含图像,您需要发送一条MIME消息,该消息本身包含HTML,图像和从一个到另一个的引用(&#34;链接&#34;在HTML部分内如:<img src="cid:XXX">其中cid指的是图片的Content-ID。有关详细信息,请参阅Embed picture in email

(您可以直接在HTML中使用数据uri,但这在电子邮件客户端中有很多支持。例如,请参阅What is Data URI support like in major email client software?。您需要调查是否有这样的问题。适合您的用户群。)