Outlook Mac插件开发:如何检查已发邮件附件是否同步至服务器?
解决Outlook插件邮件附件同步校验问题
核心优化思路
不用依赖内嵌附件的ContentId配对,通过附件元数据校验+状态字段判断结合超时机制,快速确认附件是否同步完成,同时避免无限等待。
可行方案
1. 附件数量+元数据匹配校验
- 先在插件端调用
Office.context.mailbox.item.getAttachmentsAsync(),记录附件的数量、名称、大小(无需ContentId,基础信息足够做校验)。 - 发送邮件后,调用Graph API获取已发送邮件的附件列表时,带上
$count=true参数:GET /v2.0/me/mailfolders/sentitems/messages/<MAIL_ID>/attachments?$count=true - 对比接口返回的
@odata.count和插件端记录的附件数量;同时抽查附件的名称、大小是否匹配。如果完全一致,说明附件已同步完成;如果不一致,进行1秒间隔的短轮询,同时设置最大轮询时长(比如30秒),超时则终止等待,转为后台异步处理。
2. 结合邮件lastModifiedDateTime字段判断
附件同步过程中,已发送邮件的lastModifiedDateTime会持续更新。可以:
- 第一次获取已发送邮件时记录该时间戳
- 后续轮询时,对比最新的
lastModifiedDateTime,如果连续两次请求(间隔1秒)的时间戳一致,说明邮件内容(包括附件)已稳定,同步完成。 - 该方法可与附件数量校验结合使用,双重保障准确性。
流程简化建议
优化现有流程,减少不必要的轮询步骤:
- 去掉步骤3-4的syncId轮询:
saveAsync成功后,直接调用/v2.0/me/messages/<MAIL_ID>/send接口发送邮件; - 在SentItems中查找已发送邮件时,用邮件主题+发送时间或草稿邮件的
internetMessageId定位,比轮询syncId更高效。
超时与降级处理
- 设置明确的轮询超时时间(比如30秒),超时后不再等待,将同步任务标记为待处理,后续通过插件后台定时任务或下次启动时再尝试同步;
- 给用户提示“邮件已发送,附件同步可能需要一点时间,我们会稍后完成CRM同步”,避免用户长时间等待。
内容的提问来源于stack exchange,提问作者Norbert Székely
相关产品推荐
相关产品推荐

