C# 仅限Outlook Online(非缓存)模式下的COMException
下面显示的示例代码说明了我遇到的问题,即当我在联机模式下启动Outlook时,无法获取传递给OutboxItems\u ItemAdd处理程序的邮件项目的大部分属性。返回的错误为:C# 仅限Outlook Online(非缓存)模式下的COMException,c#,outlook,vsto,outlook-addin,C#,Outlook,Vsto,Outlook Addin,下面显示的示例代码说明了我遇到的问题,即当我在联机模式下启动Outlook时,无法获取传递给OutboxItems\u ItemAdd处理程序的邮件项目的大部分属性。返回的错误为: Attachments = {System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.Runtime.InteropServices.CO
Attachments = {System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.Runtime.InteropServices.COMException: Exception from HRESULT: 0x8004010F
--- End of inner exception stack trace ---
at System.Runtime...
在SentItems_ItemAdd处理程序中尝试检索邮件项目的属性时,我没有遇到此错误。另外,需要注意的是,在Outlook缓存模式下,一切都可以完美运行;发件箱处理程序中的问题仅在Outlook以联机模式启动时出现。这是一个错误,还是我只是做错了什么
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Linq;
using Outlook = Microsoft.Office.Interop.Outlook;
using Office = Microsoft.Office.Core;
namespace OnlineErrorTest{
public partial class ThisAddIn{
Outlook.Folder sentFolder;
Outlook.Folder outboxFolder;
Outlook.Items sentItems;
Outlook.Items outboxItems;
private void ThisAddIn_Startup(object sender, System.EventArgs e) {
sentFolder = this.Application.ActiveExplorer().Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderSentMail) as Outlook.Folder;
outboxFolder = this.Application.ActiveExplorer().Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderOutbox) as Outlook.Folder;
sentItems = sentFolder.Items;
outboxItems = outboxFolder.Items;
sentItems.ItemAdd += SentItems_ItemAdd;
outboxItems.ItemAdd += OutboxItems_ItemAdd;
}
private void OutboxItems_ItemAdd(object Item) {
Outlook.MailItem mi = Item as Outlook.MailItem;
Outlook.Recipients r = mi.Recipients; //CAUSES EXCEPTION //System.Runtime.InteropServices.COMException: Exception from HRESULT: 0x8004010F
}
private void SentItems_ItemAdd(object Item) {
Outlook.MailItem mi = Item as Outlook.MailItem;
Outlook.Recipients r = mi.Recipients; //WORKS FINE
}
private void ThisAddIn_Shutdown(object sender, System.EventArgs e) {
}
private void InternalStartup(){
this.Startup += new System.EventHandler(ThisAddIn_Startup);
this.Shutdown += new System.EventHandler(ThisAddIn_Shutdown);
}
}
}错误代码为MAPI_E_NOT_FOUND,这意味着该邮件已不存在-这并不奇怪:当您的代码到达邮件时,Exchange Server很可能已发送邮件并将其移动到“已发送邮件”文件夹
您不应触摸正在提交的邮件-即使您成功地触摸到带有OOM的项目,也会中止提交过程。改为使用Application.ItemSend事件-这是您在将项目移交给后台处理程序并发送之前访问该项目的最后机会 错误代码为MAPI\u E\u未找到。哪个lien引发例外?仅在联机模式=>Outlook.Recipients r=mi.Recipients//导致异常//System.Runtime.InteropServices.COMException:HRESULT的异常:0x8004010FYes我也在使用ItemSend,但问题是我需要测量签名和加密过程,这意味着除了发件箱添加事件之外,我似乎没有任何选择。奇怪的是,Microsoft提供了一个事件处理程序,但没有记录它只在缓存模式下工作的事实。我不希望它既不能在缓存模式下工作,也不能在联机模式下工作。所有文件夹都有事件处理程序,重要的是你在那里做什么。我有大约10000个用户,它在缓存模式下运行多年似乎很好,尽管现在你每隔一段时间就会提到它,但我确实听说有一个用户的发件箱中有一封电子邮件;很少见,但我还是听说过。我想我会接受你的建议,谨慎行事,不要再碰发件箱里的OOM了