c# - 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 没有提前运行,是否有可能确保正在发送邮件?
解决方案
如果没有自动执行,您可以使用类的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 offline
Outlook 中启用了该模式,另一个 Outlook 进程挂在内存中等等。
推荐阅读
- python - 通过重新排序一列重新排序您的数据框
- python - 在 sparksql 中将日期从字符串转换为日期
- xml - Powershell如何仅替换给定数量的匹配项?
- aframe - 有没有办法提高我的多标记网络应用程序的性能?
- authentication - .net 核心认证与谷歌与远程成员存储
- python - 在 keras Tokenizer 中使用 tf-idf
- html - 如何风格
- python - 尝试使用 Selenium 将文件上传到网络浏览器
- ruby-on-rails - 如何在 ActiveAdmin 中保持 UI 和内容本地化分开
- android - 我可以在整个应用程序中使用一个按钮和多种样式吗?