Python发邮件内嵌图片附件,,发送包含有图片内容的HT


发送包含有图片内容的HTML邮件是一个很普遍的需求,无论是写运维脚本还是网站后台都有可能碰到。前些天写一个脚本的时候仔细研究了一下,问题的关键在于如何在HTML邮件正文插入本地图片,而不是以附件的方式。

现在的一些多媒体邮件中的图片多以图片链接的形式嵌入,但是很多邮件客户端需要用户确定之后才能显示,而直接嵌入本地图片的方式,可以一定程度上避免。当然,这同样会造成邮件过大,如果发送次数非常频繁,可能也会给造成一些性能负担。

邮件正文嵌入本地图片的原理

MIME(Multipurpose Internet Mail Extensions)协议支持在邮件头中指定各种类型的媒体文件,而邮件正文中则可以直接引用Header中定义的 Content-ID。以图片类型为例,MIME邮件头类似于:

Content-Type: image/png; name="digglife.png"Content-Disposition: inline; filename="digglife.png"Content-Transfer-Encoding: base64Content-ID: <digglife>Content-Location: digglife.png

邮件正文中则可以这样引用,注意src的内容。

<img src="cid:digglife" alt="digglife">

所以,在 HTML 邮件正文中嵌入本地图片的问题就转换为,如何在程序中定义邮件头。

python内置的 email 模块就提供了丰富的接口,使用起来非常直观方便。 如下是邮件中内嵌附件图片的代码。

from email.MIMEMultipart import MIMEMultipartfrom email.MIMEText import MIMETextfrom email.MIMEImage import MIMEImageimport smtplibsubject = 'May the Force Be With You!'sendfrom = 'i@digglife.net'sendto = 'anakin@tatooi.ne'copyto = 'c3po@tatooi.ne'msg = MIMEMultipart('related')msg['Subject'] = subjectmsg['From'] = sendfrommsg['To'] = sendtomsg['CC'] = copytocontent = MIMEText('<html><body><img src="cid:digglife" alt="digglife"></body></html>')msg.attach(content,'html'))#二进制模式读取图片,并绑定到邮件头fp = open('digglife.png','rb')img = MIMEImage(fp.read())img.add_header('Content-ID','digglife')msg.attach(img)smtp = smtplib.SMTP()#连接本地SMTP服务器smtp.connect('127.0.0.1')smtp.sendmail(sendfrom, [sendto,copyto] ,msg.as_string())

评论关闭