首页 > 解决方案 > Outlook 互操作:MailItem 卡在发件箱中

问题描述

我创建MailItem如下:

Application outlook = new Application();
NameSpace ns = outlook.GetNameSpace("MAPI");
Inspector inspector;

AutoResetEvent mailSentEvent;

private void Compose()
{
    MailItem mailItem = outlook.CreateItem(OlItemType.olMailItem));
    inspector = mailItem.GetInspector;

    inspector.Display(false);
    ((InspectorEvents_10_Event)inspector).Close += MailItem_Close;

    mailSentEvent = new AutoResetEvent(false);
    mailSentEvent.WaitOne();
}

private void MailItem_Close()
{
    Console.WriteLine("MailItem_Close ...");
    SyncObject syncObject = ns.SyncObjects[1];
    syncObject.SyncEnd += SyncObject_SyncEnd;
    syncObject.Start();
}

private void SyncObject_SyncEnd()
{
    Console.WriteLine("SyncObject_SyncEnd ...");
    mailSentEvent.Set();
}

编辑 用户点击发送后,输出为

MailItem_Close ...
SyncObject_SyncEnd ...

结束编辑

问题:用户点击发送后,在创建 Outlook之前未运行时,邮件卡在发件箱MailItem中。

如此处所述,使用应避免此问题SyncObject但它不起作用:当 Outlook 尚未运行时,MailItem卡在发件箱中。

我错过了什么?如果 Outlook 没有提前运行,是否有可能确保正在发送邮件?

标签: c#outlookoffice-interop

解决方案


如果没有自动执行,您可以使用类的Start方法SyncObject使用指定的 Send\Receive 组开始同步用户的文件夹。

Public Sub Sync() 
 Dim nsp As Outlook.NameSpace 
 Dim sycs As Outlook.SyncObjects 
 Dim syc As Outlook.SyncObject 
 Dim i As Integer 
 Dim strPrompt As Integer 
 Set nsp = Application.GetNamespace("MAPI") 
 Set sycs = nsp.SyncObjects 
 For i = 1 To sycs.Count 
Set syc = sycs.Item(i) 
strPrompt = MsgBox( _ 
 "Do you wish to synchronize " & syc.Name &"?", vbYesNo) 
If strPrompt = vbYes Then 
 syc.Start 
End If 
 Next 
End Sub

如果未启用连接时立即发送选项,则可能会出现此问题,如下图所示,来自 Outlook 2016。

立即发送

此设置与以下注册表数据相关联,因此管理员也可以通过修改注册表来配置此设置。

Key: HKEY_CURRENT_USER\Software\Microsoft\Office\x.0\Outlook\Options\Mail

或者

Policy key: HKEY_CURRENT_USER\Software\Policies\Microsoft\Office\x.0\Outlook\Options\Mail

DWORD: Send Mail Immediately
Value: 0

注意在上述注册表项路径中,x.0 代表 Outlook 版本(16.0 = Outlook 2016、Outlook 2019 或 Outlook for Office 365、15.0 = Outlook 2013、14.0 = Outlook 2010、12.0 = Outlook 2007)。

邮件卡在发件箱文件夹中的原因有很多 - Work offlineOutlook 中启用了该模式,另一个 Outlook 进程挂在内存中等等。


推荐阅读