邮件中添加图片内容
背景:质量分析的数据是在网页端,每月质量分析结束后需要发送邮件。因为网页端的数据已经统计好了,并且展示形式也满足使用需求,只需要把网页端的数据通过邮件发送即可。
已经通过dp获取到了网页端的全屏截图本地保存了,只需要邮件把截图发送出去即可。
本来使用的是email.mime
下的multipart
和image
代码如下:
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
message = MIMEMultipart("alternative")
message["Subject"] = "质xxx测试邮件"
message["From"] = sender_email
message["To"] =", ".join(receiver_email)
# 邮件内容
html = """\
<html>
<body>
<p>各位,好!</p>
<p> 以下是xxxx息:</p>
<img src="cid:image1">
</body>
</html>
"""
# 添加邮件正文
msgText = MIMEText(html, 'html')
message.attach(msgText)
# 读取本地图片并根据cid映射图片
with open('pic1.jpg', 'rb') as img_file:
msgImage = MIMEImage(img_file.read())
msgImage.add_header('Content-ID', '<image1>') # 注意HTML中的cid与此处对应
message.attach(msgImage)
# 发送邮件
message.attach(msgImage)
context = ssl.create_default_context()
with smtplib.SMTP_SSL("mail.xxx.com", 465, context=context) as server:
server.login(sender_email, login_password)
server.sendmail(sender_email, receiver_email, message.as_string())
由于本人使用的是foxmail
客户端,自测来看内容正常展示。
但是同事这边使用的是outlook
客户端,显示图片是个红叉。
网上查了解决办法:文件
>选项
>信任中心
>信任中心设置
>`自动下载,把不自动下载标准...和不下载加密或...取消勾选。
重新发送了邮件,不展示...
关闭客户端再打开再重新发送邮件,依然不展示...
怀疑是我邮件正文的html
写的有点简陋、怀疑是我截图的图片过大、怀疑是outlook版本有问题(好在我没升级...别瞎折腾了)
不死心又在网上搜了相同现象的问题,终于找到了。浅试一下:
使用email.message
下的EmailMessage
和email.utils
下的make_msgid
from email.message import EmailMessage
from email.utils import make_msgid
message = EmailMessage()
message["Subject"] = subject
message["From"] = sender_email
message["To"] = ", ".join(receiver_emails)
html = """
<html>
<body>
<p>各位,好!</p>
<p> 以下是xxxx息:</p>
<img src="cid:image1">
</body>
</html>
"""
figure_id = make_msgid()
html = html.replace('image1', figure_id[1:-1])
message.add_alternative(html, subtype='html')
with open('pic1.jpg', 'rb') as img_file:
message.get_payload()[0].add_related(img_file.read(), 'image', 'jpeg', cid=figure_id)
with smtplib.SMTP_SSL(self.host, self.port, context=context) as server:
server.login(sender_email, login_password)
server.sendmail(sender_email, receiver_email, message.as_string())
重点就在需要使用make_msgid
生成附件的id,然后消息体读取文件后跟这个id关联上。(看起来一开始的写法好像也没问题,也是能关联起来的呀,在这个问题上耽搁时间比较久,不再深究)
发送邮件,验证接受图片正常展示。所以跟开没开outlook客户端信任中心的自动下载没关系。