Outlook Interop: 邮件项目卡在发件箱中

问题描述 投票:0回答:1

我创造了一个 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();
}

EDIT当用户点击 发送 输出是

MailItem_Close ...
SyncObject_SyncEnd ...

编辑结束

问题:当用户点击 发送郵件被卡在收件箱中 当Outlook尚未运行时 之前 MailItem 是创建。

如上所述 此处的使用 SyncObject 应该可以避免这个问题。但它不工作:当Outlook还没有运行时。MailItem 被卡在了发件箱里。

我到底遗漏了什么?如果Outlook没有提前运行,是否可以完全保证邮件的发送?

c# outlook office-interop
1个回答
1
投票

你可以使用 开始 的方法 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。

Send immediately

该设置与以下注册表数据绑定,因此该设置也可以由管理员通过修改注册表进行配置。

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 offline 模式在Outlook中启用,另一个Outlook进程挂在内存中等等。


1
投票

请确保 syncObject 变量是在全局层面声明的,否则会被Garbage Collected。

同时,摆脱 mailSentEvent.WaitOne() - 它使你的应用程序停止,事件永远不会启动,因为它需要Windows消息泵来运行。

© www.soinside.com 2019 - 2024. All rights reserved.