邮件中添加图片内容

背景:质量分析的数据是在网页端,每月质量分析结束后需要发送邮件。因为网页端的数据已经统计好了,并且展示形式也满足使用需求,只需要把网页端的数据通过邮件发送即可。

已经通过dp获取到了网页端的全屏截图本地保存了,只需要邮件把截图发送出去即可。

本来使用的是email.mime下的multipartimage

代码如下:

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下的EmailMessageemail.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客户端信任中心的自动下载没关系。

posted @ 2024-01-16 19:38  唐大侠的小迷弟  阅读(37)  评论(0编辑  收藏  举报