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 部分中的“链接”类似于:&lt;img src="cid:XXX"&gt; 其中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,并在您的图像标签srcattribute 中使用它。您还需要将图像嵌入到消息中。

检查python's 3.5 email example 19.1.14,它显示了如何在 HTML 中嵌入文件。

请注意,对于 3.7,API 发生了变化。

【讨论】:

以上是关于Python,MIME,在电子邮件中嵌入图像的主要内容,如果未能解决你的问题,请参考以下文章

在 html 中嵌入图像以自动发送 Outlook365 电子邮件

在 MIME 中嵌入图像

在电子邮件中嵌入图片

MIME-电子邮件图像在 iphone 上显示为可点击的框

电子邮件中的 MIME 多部分

在 perl 中使用电子邮件 :: MIME 发送多个文件?