使用Python Win32调用Outlook 16发送邮件时嵌入图片失败的解决方法
解决Outlook邮件内嵌本地图片直接显示的问题
你遇到的问题核心在于直接引用本地图片路径时,收件方没有访问你本地文件系统的权限,所以只能看到占位符。要让图片直接显示,需要把图片作为嵌入式附件添加到邮件中,然后在HTML正文中通过cid(Content ID)引用它。下面是修改后的Python实现代码:
修改后的发送邮件函数
import win32com.client def send_email(sender, recipient): # 初始化Outlook应用 outlook = win32com.client.Dispatch('outlook.application') mail = outlook.CreateItem(0) # 设置邮件基本信息 mail.To = recipient mail.Subject = Subject_Req mail.SentOnBehalfOfName = sender # 1. 添加本地图片作为嵌入式附件 img_path = r'C:\Users\Sid\AppData\Roaming\Microsoft\Signatures\My Project\image001.png' attachment = mail.Attachments.Add(img_path) # 设置附件的Content ID(cid),这个ID要和HTML里的引用对应 cid = 'project_logo_cid' # 使用PropertyAccessor设置PR_ATTACH_CONTENT_ID属性 attachment.PropertyAccessor.SetProperty( "http://schemas.microsoft.com/mapi/proptag/0x3712001F", cid ) # 2. 拼接HTML正文,在末尾添加图片引用 # 把原有的Content_Email和图片标签拼接 html_content = Content_Email + f''' <br> <img src="cid:{cid}" alt="Project Logo" style="width: auto; height: auto;"> ''' mail.HTMLBody = html_content # 触发邮件渲染(可选,但有时能避免渲染问题) mail.GetInspector() # 发送邮件 mail.Send()
关键步骤说明
- 添加嵌入式附件:通过
Attachments.Add()把本地图片加入邮件,这一步会将图片文件嵌入到邮件内容中,而不是作为普通独立附件。 - 设置Content ID:使用
PropertyAccessor.SetProperty()为附件设置唯一的cid,这个属性是Outlook识别内嵌图片引用的核心标识。 - HTML中引用cid:在HTML正文中用
<img src="cid:你的cid值">来关联内嵌附件,这样Outlook会自动匹配到邮件里的图片资源,收件方无需访问你的本地文件就能直接看到图片。
额外注意事项
- 确保
Subject_Req和Content_Email这两个变量在函数外部已经正确定义并赋值。 - 如果图片显示大小不符合需求,可以在
<img>标签里添加style属性调整宽高,比如style="width: 200px; height: auto;"。 - 测试时可以同时发送给自己和外部邮箱,确认两种场景下图片都能正常显示。
内容的提问来源于stack exchange,提问作者Student of the Digital World
相关产品推荐
相关产品推荐

