复制或移动邮件或文件夹

·
2026-01-22 08:49:26

适用于:Outlook 2013 | Outlook 2016

客户端可以使用以下四种方法之一来复制或移动邮件或文件夹:

IMAPIFolder::CopyFolder

IMAPIFolder::CopyMessages

IMAPIProp::CopyTo

IMAPIProp::CopyProps

通过设置适当的标志和参数, CopyTo 和 CopyProps 可以像 CopyFolder 或 CopyMessages 一样工作。 决定调用哪种方法时,请考虑以下问题:

是否复制或移动文件夹或邮件?

你对要移动或复制的文件夹或邮件了解多少?

将移动或复制多少个文件夹或邮件的属性?

可以使用 IMAPIProp 方法复制或移动文件夹或邮件。

IMAPIFolder::CopyMessages 仅适用于消息; IMAPIFolder::CopyFolder 仅适用于文件夹。

虽然使用 IMAPIFolder 方法不需要复制或移动文件夹或邮件支持的任何属性的知识,但你必须具备一些知识才能使用 IMAPIProp 方法。 使用 IMAPIProp::CopyProps 时,必须能够显式指定要复制或移动的文件夹或邮件属性。 使用 IMAPIProp::CopyTo 时,除非要复制或移动所有属性,否则必须显式指定应排除哪些属性。 有关这些方法的详细信息,请参阅 复制 MAPI 属性。

要复制或移动的属性数可能会影响你决定使用哪种方法。 如果要复制或移动多条消息,请调用 IMAPIFolder::CopyMessages。 另一种选择是调用 IMAPIProp::CopyProps 以仅复制文件夹 PR_CONTAINER_CONTENTS (PidTagContainerContents) 属性。 以下过程演示如何使用 CopyMessages。

复制或移动一封或多封邮件

找到源文件夹和目标文件夹的有效条目标识符。

通过调用 IMAPISession::OpenEntry 或 IMsgStore::OpenEntry 并设置 MAPI_MODIFY 标志,以读/写模式打开这些文件夹。

检查从 OpenEntry 返回的接口指针是否为 IMAPIFolder 接口指针。 如果没有,请将其强制转换为 LPMAPIFOLDER 类型。

创建表示要复制或移动的一个或多个消息的条目标识符数组。

调用 IMAPIFolder::CopyMessages 并设置以下标志:

MESSAGE_MOVE,如果要执行移动操作。

如果希望文件夹显示进度指示器,请在 ulUIParam 参数中MESSAGE_DIALOG并传递窗口句柄。

释放源文件夹和目标文件夹的 IMAPIFolder 指针。

如果要将文件夹的完整内容复制到另一个文件夹,请调用源文件夹的 IMAPIFolder::CopyFolder 或 IMAPIProp::CopyTo 方法。

若要复制文件夹的几个属性,请调用其 IMAPIProp::CopyProps 方法。 若要复制文件夹的大部分属性,请调用 IMAPIProp::CopyTo。

例如,如果要复制文件夹 的 PR_DISPLAY_NAME (PidTagDisplayName) 和 PR_COMMENT (PidTagComment) 属性,则可以使用以下选项:

调用 IMAPIFolder::CopyFolder 以复制所有文件夹属性,然后从新文件夹中删除不需要的属性。

调用 CopyTo 并排除文件夹的所有属性, PR_DISPLAY_NAME 和 PR_COMMENT除外。

调用 CopyProps,在 include 数组中传递 PR_DISPLAY_NAME 和 PR_COMMENT 。

在这种情况下, CopyProps 是最佳选择,因为它用于复制一小部分属性,并且是最容易实现的调用。

若要仅复制或移动文件夹属性(不包括邮件),请调用文件夹的 IMAPIProp::CopyTo 方法并排除以下属性:

PR_CONTAINER_CONTENTS (PidTagContainerContents)

PR_FOLDER_ASSOCIATED_CONTENTS (PidTagFolderAssociatedContents)

复制方法可以返回S_OK,指示总成功、MAPI_W_PARTIAL_COMPLETION、指示部分成功或错误。 如果返回MAPI_W_PARTIAL_COMPLETION,请使用 HR_FAILED 宏访问更具体的错误。 有关详细信息,请参阅 使用宏进行错误处理。

如果将消息从一个消息存储复制到另一个消息存储区,并且 Unicode 不受两者支持,请注意,信息可能因代码页转换而丢失。 通常无法知道消息存储是否支持一种或两种格式,因此无法确定是将文本属性复制为 ASCII 字符串还是 Unicode 字符串。 如果支持 Unicode,请尝试执行 Unicode 复制;如果失败并MAPI_E_BAD_CHARWIDTH错误值,则使用 ASCII。