基于MAPI的Outlook插件附件保存后出现重复扩展名问题咨询
附件文件名重复后缀问题分析
这不是Outlook的正常运行机制,是你的MAPI操作流程中出现了文件名处理异常。
可能的原因
- 调用
CopyTo复制邮件时,默认的属性复制逻辑可能错误地重复拼接了附件的文件名后缀,比如处理PR_ATTACH_FILENAME或PR_DISPLAY_NAME属性时叠加了后缀。 - 邮件保存与存储提交的顺序或状态处理不当,导致附件属性在保存过程中被意外修改。
排查与解决建议
- 复制完成后,立即遍历新邮件的附件集合,检查附件的
PR_ATTACH_FILENAME和PR_DISPLAY_NAME属性值,确认是否已经出现重复后缀,定位问题发生的环节。 - 放弃依赖
CopyTo的默认附件复制行为,手动处理附件复制:- 通过原邮件的
IMessage::GetAttachTable获取附件列表 - 为新邮件逐个调用
IMessage::CreateAttach创建附件 - 手动复制原附件的所有关键属性(尤其是文件名相关属性),确保属性值完全一致
- 通过原邮件的
- 调整保存顺序:确保先完成
IMessage::SaveChanges操作,再执行pStorage->Commit,避免存储状态不一致引发的属性异常。
你提供的代码片段
CComPtr<IMessage> pMsgNew; hRes = pMsg->CopyTo(0, NULL, NULL, NULL, NULL, (LPIID)&IID_IMessage, pMsgNew, 0, NULL); hRes = pMsgNew->SaveChanges (KEEP_OPEN_READWRITE); hRes = pStorage->Commit(STGC_DEFAULT);
内容的提问来源于stack exchange,提问作者P. Ng
相关产品推荐
相关产品推荐

