IXPLogon::SubmitMessage

适用于:Outlook 2013 | Outlook 2016

指示 MAPI 后台处理程序有一条消息供传输提供程序传递。

HRESULT SubmitMessage(
  ULONG ulFlags,
  LPMESSAGE lpMessage,
  ULONG FAR * lpulMsgRef,
  ULONG FAR * lpulReturnParm
);

参数

ulFlags

[in]控制如何提交消息的标志的位掩码。 可以设置以下标志:

BEGIN_DEFERRED

MAPI 后台处理程序调用具有以前延迟的消息的传输提供程序。 消息的条目标识符与延迟时相同。 通过使用带有 NOTIFY_SENTDEFERRED 标志的 IMAPISupport::SpoolerNotify 方法,将消息的入口标识符传递回 MAPI 后台处理程序,从而延迟了消息。

lpMessage

[in]指向消息对象的指针 (表示要传递) 具有读/写权限的消息,传输提供程序使用该权限访问和操作该消息。 此对象在传输提供程序从 后续调用 IXPLogon::EndMessage 方法返回之前保持有效。

lpulMsgRef

[out]指向变量的指针,其中传输提供程序返回分配给此消息的引用值。 MAPI 后台处理程序在此消息的后续调用中传递此引用值。 MAPI 后台处理程序先将值初始化为 0,然后再将其返回到传输提供程序。

lpulReturnParm

[out]指向对应于 SubmitMessage 返回MAPI_E_WAIT或MAPI_E_NETWORK_ERROR错误值的变量的指针。

返回值

S_OK

调用成功并返回了一个或多个预期值。

MAPI_E_BUSY

传输提供程序无法处理消息,因为它正在执行另一个操作。 提供程序应使用此返回值来指示未发生任何处理,并且 MAPI 后台处理程序不应调用 EndMessage。 MAPI 后台处理程序稍后将再次尝试 SubmitMessage 调用。

MAPI_E_CANCEL

尽管传输提供程序请求 MAPI 后台处理程序在以前的 SpoolerNotify 调用上重新提交消息,但条件已更改,不应重新发送消息。 MAPI 后台处理程序将继续处理其他操作。

MAPI_E_NETWORK_ERROR

网络错误阻止了成功完成操作。 lpulReturnParm 参数应设置为 MAPI 后台处理程序重新提交消息之前将经过的秒数。

MAPI_E_NOT_ME

传输提供程序无法处理此消息。 MAPI 后台处理程序应尝试为其查找另一个传输提供程序。 提供程序应使用此返回值来指示未发生任何处理,并且 MAPI 后台处理程序不应调用 EndMessage

MAPI_E_WAIT

暂时性问题阻止传输提供程序处理消息。 lpulReturnParm 参数应设置为 MAPI 后台处理程序重新提交消息之前将经过的秒数。

备注

MAPI 后台处理程序在具有要传递的传输提供程序的消息时调用 IXPLogon::SubmitMessage 方法。 消息通过使用 lpMessage 参数传递给传输提供程序。

如果提供程序已准备好接受消息,则应使用 lpulMsgRef 参数返回引用值,处理传递的对象,并返回相应的值 (通常S_OK) 。 如果提供程序未准备好处理传输,则它应返回错误值,并选择性地返回 lpulReturnParm 中的另一个 MAPI 返回值,以指示 MAPI 后台处理程序在重新提交消息之前应等待的时间。

传输提供程序对此方法的实现可以执行以下操作:

  • 将消息放入内部队列以等待传输,可能会将消息复制到本地存储,然后返回。

  • 尝试执行实际传输并在传输完成时返回,无论成功还是失败。

  • 确定是否在检查所涉及的资源后发送消息。 在这种情况下,如果资源可用,提供程序可以锁定资源、准备消息并提交它。 如果资源繁忙,提供程序可以准备消息并推迟到以后发送。

消息传输的首选技术取决于传输提供程序和竞争系统资源的进程的预期数量。

SubmitMessage 调用期间,传输提供程序控制从消息对象传输消息数据。 但是,在传输数据之前,传输提供程序应为消息分配引用值,该消息在 lpulMsgRef 中返回指针。 这样做是因为在此过程中的任何时候,MAPI 后台处理程序都可以调用 IXPLogon::TransportNotify 方法,并将 NOTIFY_CANCEL_MESSAGE 标志设置为指示提供程序应释放任何打开的对象并停止消息传输。

传输提供程序不应发送消息的任何不可传输属性。 当它找到这样的属性时,它应继续处理下一个属性。 提供商应尽一切努力不显示MAPI_P1收件人信息作为传输的邮件内容的一部分;提供商应仅出于寻址目的使用此收件人信息。 MAPI_P1收件人是内部生成的用于重新发送邮件的收件人;不应传输它们。 请改用其他收件人来传输收件人信息。 这种安排的目的是允许重新发送收件人看到与原始收件人完全相同的收件人表。

SubmitMessage 调用期间,MAPI 后台处理程序处理在传输邮件期间打开的对象的方法,并处理任何附件。 此处理可能需要很长时间。 在此处理过程中,传输提供程序可以频繁调用 MAPI 后台处理程序的 IMAPISupport::SpoolerYield 方法,以释放其他系统任务的 CPU 时间。

所有邮件收件人都显示在 MAPI 后台处理程序最初传递的邮件的收件人表中。 传输提供程序应仅处理它可以处理的收件人(基于条目标识符和/或地址类型),并且尚未将其 PR_RESPONSIBILITY (PidTagResponsibility) 属性设置为 TRUE。 如果 PR_RESPONSIBILITY 已设置为 TRUE,则表示另一个传输提供程序已处理该收件人。 当提供程序完成对收件人的充分处理以确定是否可以处理该收件人的邮件时,它应在传递的邮件中将该收件人的 PR_RESPONSIBILITY 属性设置为 TRUE。 通常,提供程序在消息传递完成后做出此决定。

通常,传输提供程序在完成消息数据传输之前不会从 SubmitMessage 调用返回。 如果未返回任何错误,则从 MAPI 后台处理程序到提供程序的下一次调用是调用 IXPLogon::EndMessage 方法。

如果 SubmitMessage 返回错误,MAPI 后台处理程序会释放进程中的消息,而不保存更改。 如果传输提供程序要求保存消息更改,则必须在返回之前对消息调用 IMAPIProp::SaveChanges 方法。

如果由于传输问题而发生错误,MAPI 后台处理程序会保留消息,但会根据 lpulReturnParm 中返回的值延迟将消息重新提交到传输提供程序。 如果 来自 SubmitMessage 的返回值MAPI_E_WAIT或MAPI_E_NETWORK_ERROR,则传输提供程序必须填写该值。 如果发生严重错误情况,传输提供程序必须使用 NOTIFY_CRITICAL_ERROR 标志调用 IMAPISupport::SpoolerNotify 方法。

另请参阅

IMAPIProp::SaveChanges

IMAPISupport::SpoolerNotify

IMAPISupport::SpoolerYield

IXPLogon::EndMessage

IXPLogon::TransportNotify

IXPLogon : IUnknown