使用pywin32复制.msg邮件丢失附件及图片问题求助
解决pywin32复制Outlook邮件.msg时附件丢失的问题
你的代码存在几个关键问题,导致附件丢失和COM错误,以下是修正方案:
核心问题分析
语法错误:
pythoncom CoInitialize()应为pythoncom.CoInitialize()(缺少点号)execpt拼写错误,正确是except- 收件人邮箱地址未加引号,应为
"exemple@mail.com"
未正确加载.msg文件:
代码中未定义draft变量,需要通过namespace.OpenSharedItem()加载本地.msg文件附件添加方式错误:
直接将原邮件的Attachment对象传入Add()方法会触发COM错误,需使用附件的路径名,或通过Copy()方法复制附件到新邮件HTML正文引用错误:
draft_path是字符串路径,没有HTMLbody属性,应使用加载后的邮件对象draft.HTMLBody
修正后的代码
import win32com.client as win32 import pythoncom # 初始化COM环境 pythoncom.CoInitialize() outlook = win32.Dispatch('Outlook.Application') namespace = outlook.GetNameSpace('MAPI') # 加载本地.msg文件 draft_path = "C:\\Users\\Lucas\\Documents\\TESTE.msg" draft = namespace.OpenSharedItem(draft_path) # 创建新邮件 message = outlook.CreateItem(0) # 复制所有附件(包括内嵌图片) for attachment in draft.Attachments: try: # 复制附件对象到新邮件(更可靠,支持内嵌图片与HTML的关联) attachment.Copy() message.Attachments.Paste() except Exception as e: print(f"添加附件出错: {e}") # 设置邮件核心信息 message.To = "exemple@mail.com" message.HTMLBody = draft.HTMLBody message.Subject = draft.Subject # 显示邮件(如需直接发送可替换为message.Send()) message.Display()
额外说明
- 用
Copy()+Paste()的方式复制附件,能完整保留内嵌图片与HTML正文的CID关联,避免正文中图片无法显示 - 运行前确保Outlook已正常启动,且当前用户有权限访问目标.msg文件
- 若附件是云存储(如OneDrive)中的文件,需先确认文件本地可访问,否则需额外处理云附件的加载逻辑
内容的提问来源于stack exchange,提问作者Lucas Santana
相关产品推荐
相关产品推荐

