直接在HTML邮件中链接图片地址是不行的。引文大部分邮件服务商都会自动屏蔽带有外链的图片,因为不知道这些链接是否指向恶意网站。
只需要在HTML中通过
方式一:引用src="cid:0"就可以把附件作为图片嵌入了。如果有多个图片,给它们依次编号,然后引用不同的cid:x即可。
Q: 使用方式一在苹果邮件客户端会出现A1的邮件图片,会替换A2的邮件图片;
方式二:
读取图片并添加邮件头
fp = open(imgpath, 'rb')
msgImage = MIMEImage(fp.read())
fp.close()
# Define the image's ID as referenced above
msgImage.add_header('Content-ID', '<image{count}>'.format(count=i))
msgRoot.attach(msgImage)
解决方式一中出现的问题;
# -*- coding:utf-8 -*-
import smtplib
from email import encoders
from email.mime.base import MIMEBase
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.header import Header
class EmailMsg():
def sendMail(self, msg):
# 邮件对象:
message = MIMEMultipart()
message.attach(MIMEText(msg, 'html', 'utf-8'))
# 三个参数:第一个为文本内容,第二个 plain 设置文本格式,第三个 utf-8 设置编码
# message = MIMEText(msg, 'html', 'utf-8')
message['from'] = '[email protected]'
message['to'] = '[email protected]'
password = "123456"
message['subject'] = Header(u'公众号消息', 'utf-8').encode()
smtp_server = "smtp.163.com"
server = smtplib.SMTP(smtp_server, 25) # SMTP协议默认端口是25
# 打印出和SMTP服务器交互的所有信息。
# server.set_debuglevel(1)
# 登录SMTP服务器
server.login(message['from'], password)
# 添加附件就是加上一个MIMEBase,从本地读取一个图片:
with open('./img/00_00.jpg', 'rb') as f:
# 设置附件的MIME和文件名,这里是png类型:
mime = MIMEBase('image', 'jpg', filename='timg.jpg')
# 加上必要的头信息:
mime.add_header('Content-Disposition', 'attachment', filename='test.png')
mime.add_header('Content-ID', '<0>') //如果有多个文件需要使用.format(index)
mime.add_header('X-Attachment-Id', '0') //如果有多个文件需要使用.format(index)
# 把附件的内容读进来:
mime.set_payload(f.read())
# 用Base64编码:
encoders.encode_base64(mime)
# 添加到MIMEMultipart:
message.attach(mime)
# 发邮件,由于可以一次发给多个人,所以传入一个list;
# 邮件正文是一个str,as_string()把MIMEText对象变成str。
server.sendmail(message['from'], [message['to']], message.as_string())
server.quit()
if __name__ == '__main__':
em = EmailMsg()
em.sendMail('''<html lang="en">
<body>
<h1>附件中的图片</h1>
<img src="cid:0">
<img src="cid:1">
<img src="cid:2">
....
</body>
</html>''')