我创造了一个 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没有提前运行,是否可以完全保证邮件的发送?
你可以使用 开始 的方法 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进程挂在内存中等等。
请确保 syncObject
变量是在全局层面声明的,否则会被Garbage Collected。
同时,摆脱 mailSentEvent.WaitOne()
- 它使你的应用程序停止,事件永远不会启动,因为它需要Windows消息泵来运行。