保存消息

适用于:Outlook 2013 | Outlook 2016

在保存邮件之前,客户端通常调用邮件的 IMAPIProp::SetProps 方法,以设置邮件文本属性、附件属性 PR_SUBJECT (PidTagSubject) 以及与收件人列表关联的属性之外的几个属性。

PR_MESSAGE_CLASS (PidTagMessageClass) 属性设置为 IPM 等字符串。请注意,描述传出消息的 类。 尽管客户端应对所有传出消息设置 PR_MESSAGE_CLASS ,但如果未设置,则消息存储提供程序会提供默认值。 传出消息的默认消息类是 IPM。

PR_MESSAGE_FLAGS (PidTagMessageFlags) 属性中设置MSGFLAG_UNSENT标志。 如果需要,还可以设置MSGFLAG_READ和MSGFLAG_UNMODIFIED标志。 设置MSGFLAG_UNMODIFIED允许组合下的消息模拟传递的消息。 MSGFLAG_UNMODIFIED只能在第一次保存消息之前由客户端设置。

准备好创建未发送邮件的永久副本时,请对邮件及其所有附件调用 IMAPIProp::SaveChanges 。 如果打算立即发送消息,则无需调用 SaveChanges。 对 SubmitMessage 的 调用在内部保存消息作为其处理的一部分。

调用 SaveChanges 时,最好指定KEEP_OPEN_READWRITE标志,以便稍后修改消息。 其他可设置的标志包括FORCE_SAVE(指示在提交更改后应关闭邮件或附件),KEEP_OPEN_READONLY(指示不会进行进一步的更改),以及允许消息存储提供程序批处理客户端请求的标志,MAPI_DEFERRED_ERRORS。

在为邮件调用 SaveChanges 之前,必须为邮件中的每个附件调用 SaveChanges 。 如果无法保存附件,则发送邮件时附件不会包含在邮件中,并且不会显示在邮件的附件表中。 如果在保存所有附件后未能保存邮件,邮件和附件都将丢失。

调用 SaveChanges 时,消息存储提供程序会更新以下属性:

  • PR_DISPLAY_TO (PidTagDisplayTo) 列出所有主要收件人。

  • PR_DISPLAY_TO 列出所有抄送接收者。

  • PR_DISPLAY_BCC (PidTagDisplayBcc) 列出了所有盲件抄送接收者。

  • PR_LAST_MODIFICATION_TIME (PidTagLastModificationTime)

  • PR_MESSAGE_FLAGS 设置MSGFLAG_HASATTACH是否已保存一个或多个附件,并清除MSGFLAG_UNMODIFIED以显示邮件已更改。

  • PR_MESSAGE_SIZE (PidTagMessageSize) 包含消息的最新大小。

  • PR_MESSAGE_ATTACHMENTS (PidTagMessageAttachments) 提供对附件表的访问权限。

  • PR_MESSAGE_RECIPIENTS (PidTagMessageRecipients) 提供对收件人表的访问权限。

某些消息属性通常在创建消息时由客户端或服务提供程序提供。 如果客户端忽略了设置它们,则由消息存储提供程序在调用 SaveChanges 时更新它们。 例如,如果邮件的 PR_ENTRYID (PidTagEntryId) 和 PR_RECORD_KEY (PidTagRecordKey) 属性是在创建邮件时设置的,则无需在保存时对其进行修改。 但是,在消息创建时忽略设置的消息存储提供程序必须在首次调用 SaveChanges 时对其进行设置。

如果 SaveChanges 返回MAPI_E_CORRUPT_DATA,则假定正在保存的数据现在已丢失。 当网络连接丢失或服务器未运行时,使用客户端-服务器模型实现的消息存储提供程序可能会返回此值。 在向用户返回错误之前,请尝试第二次写入和保存数据,方法是调用 SetProps ,然后再次调用 SaveChanges。 如果数据在本地缓存,这应该不是问题。 但是,如果没有本地缓存或第二次 SaveChanges 调用失败,则显示错误以提醒用户问题。