You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 06:39:25