Python,MIME,在电子邮件中嵌入图像
Posted
技术标签:
【中文标题】Python,MIME,在电子邮件中嵌入图像【英文标题】:Python, MIME, Embed image in email 【发布时间】:2017-11-05 15:35:24 【问题描述】:我正在测试发送带有嵌入 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()
发送有效,但是图像没有显示,而是我看到的:
我正在使用 Jupyter 笔记本进行测试;当我输入
from IPython.display import Image
Image("/home/depot/wintergreen/mplplots/01.png")
图片显示,所以路径是正确的。
这里有什么问题?
【问题讨论】:
您认为 Gmail 会如何访问您本地硬盘上的图像?!你还没有嵌入任何东西。 @jonrsharpe 那么我如何将图像附加到电子邮件中? 您是否尝试过仅搜索该内容?例如。 ***.com/q/7755501/3001761, ***.com/q/920910/3001761, ***.com/q/19171742/3001761, ... @jonrsharpe 是的,我查了所有这些,但我不熟悉这个概念,所以无法适应我的例子。所以我知道我应该使用内容 ID? 然后发布您的尝试minimal reproducible example,说明您卡在哪里。鉴于已接受的答案,这似乎是个好主意。 【参考方案1】:您的图片 URL 需要包含主机名。你只有:
<img src="/home/depot/wintergreen/mplplots/01.png">
你需要这样的东西:
<img src="http://myhostname.com/home/depot/wintergreen/mplplots/01.png">
因为当您的用户收到电子邮件时,需要有域。
现在,如果图像没有托管在某个地方,但可以在所有收件人可访问的文件系统上使用(例如,在公司 Intranet 上阅读时),您可以使用 file
URI 而不是 http
。例如
<img src="file:///home/depot/wintergreen/mplplots/01.png">
这适用于那些设备可以访问文件本地目录的收件人。
最后,可以选择在电子邮件中包含图像本身(而不仅仅是指向它的链接)。要实际包含图像,您需要发送一条 MIME 消息,该消息本身包括 HTML、图像和从一个到另一个的引用(HTML 部分中的“链接”类似于:<img src="cid:XXX">
其中cid
指的是图片的 Content-ID。详见Embed picture in email。
(您可以直接在 HTML 中使用 data-uri,但这在电子邮件客户端中的支持参差不齐。例如,请参阅 What is Data URI support like in major email client software?。您需要调查这是否适合您的用户群。)
【讨论】:
我相信这是本地目录/home
,而不是公开托管的目录。
@jonrsharpe,这也行不通。如果它是本地文件,则需要有一个文件类型 URL:file:///mydir/filename.png
。由于 OP 表明它是电子邮件,因此打开本地目录将是有问题的,除非电子邮件的所有接收者都具有相同的本地目录(对于内部公司电子邮件可能是一个很好的假设,但鉴于大多数电子邮件现在可以通过移动设备准备好,这似乎有点牵强。)跨度>
嗯,没错,这就是为什么这个答案对他们没有帮助的原因。如果图像已经公开(或至少对收件人可用),他们可以放入正确的链接,但我不认为它是。【参考方案2】:
您需要使用email.utils.make_msgid
来创建一个ID,并在您的图像标签src
attribute 中使用它。您还需要将图像嵌入到消息中。
检查python's 3.5 email example 19.1.14,它显示了如何在 HTML 中嵌入文件。
请注意,对于 3.7,API 发生了变化。
【讨论】:
以上是关于Python,MIME,在电子邮件中嵌入图像的主要内容,如果未能解决你的问题,请参考以下文章