C# 除非打开Outlook,否则不会触发Outlook文件夹ItemAdded事件
MyC应用程序允许用户选择要发送电子邮件的文件。他们需要从outlook/exchange联系人中选择收件人,因为我们管理/同步公司的联系人列表 在他们发送后,我需要捕获msg文件并使用收件人信息将其保存在某个位置 收件人信息在发送期间不可用,因此我找到一些代码来使用send folder ItemAdded事件 这一切都工作得很好,直到有人在outlook尚未打开的情况下运行它,在这种情况下,事件永远不会被触发。Application.itemssend、Inspector.Close等全部激活,但不是我需要获取收件人信息的那个 有人知道为什么这不起作用吗 注意:对于类似的问题,有几个问题让Items变量超出范围。事实上,我正在返回它并等待它被执行,当Outlook打开并最终触发事件时,它运行良好 这是我的方法,Outlook只是Microsoft.Office.Interop.Outlook的别名 更新:C# 除非打开Outlook,否则不会触发Outlook文件夹ItemAdded事件,c#,email,com,outlook,C#,Email,Com,Outlook,MyC应用程序允许用户选择要发送电子邮件的文件。他们需要从outlook/exchange联系人中选择收件人,因为我们管理/同步公司的联系人列表 在他们发送后,我需要捕获msg文件并使用收件人信息将其保存在某个位置 收件人信息在发送期间不可用,因此我找到一些代码来使用send folder ItemAdded事件 这一切都工作得很好,直到有人在outlook尚未打开的情况下运行它,在这种情况下,事件永远不会被触发。Application.itemssend、Inspector.Close等全部激
}垃圾收集器将刷取源对象。也就是说,由于try/catch块限制了源对象的作用域,因此不会触发事件。您需要在全局范围内声明对象,并确保它仍然处于活动状态
请注意,当同时添加超过16项的多个项目时,不会触发ItemAdd事件。这是Outlook中一个众所周知的问题。使用解决方案对我的原始帖子进行了更新。这可能是Outlook 2013的一个问题,因为我发现一个旧产品做了类似的事情,现在它挂起了,因为它也应该等待ItemAdded事件
注意:之后必须清理所有引用,这包括知道完成后是否需要关闭Outlook。调用oApp.Quit将退出Outlook,即使Outlook已经打开。我的印象是它基本上只是将其存储在一个局部变量中以便返回。无论采用哪种方式,我通常都避免在try块中定义内容,因此我将其移出try并获得相同的行为,然后将其全局移动到类中,仍然获得相同的行为。我甚至尝试过将应用程序对象移出,以防它被处理掉,或者有什么东西带走了已发送的文件夹。不走运。我“可能”有解决办法,但我不知道原因。添加关于显示收件箱的块似乎有效。但是,即使在清理了我在此处创建的对象之后,它仍会使outlook保持打开状态。另外,我基本上是在打开一个完整的outlook实例,而不是自动使用。
public Outlook.Items Send(string subject, string body) {
try {
// Create the Outlook application.
Outlook.Application oApp = new Outlook.Application();
Outlook.MAPIFolder sentFolder = oApp.Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderSentMail);
Outlook.Items itmsSentFolder = sentFolder.Items;
itmsSentFolder.ItemAdd += new Outlook.ItemsEvents_ItemAddEventHandler(Items_ItemAdd);
Outlook.MailItem oMsg = (Outlook.MailItem)oApp.CreateItem(Outlook.OlItemType.olMailItem);
_inspector = oMsg.GetInspector;
oMsg.Subject = subject;
oMsg.Body = body;
int iAttachType = (int)Outlook.OlAttachmentType.olByValue;
foreach (string file in _attachments) {
Outlook.Attachment oAttach = oMsg.Attachments.Add(file, iAttachType, 1, Path.GetFileName(file));
}
((Outlook.InspectorEvents_10_Event)_inspector).Close += new Outlook.InspectorEvents_10_CloseEventHandler(Inspector_Close);
oMsg.Mileage = MESSAGE_FLAG;
oMsg.Display(false);
oMsg = null;
oApp = null;
return itmsSentFolder;
} catch (Exception ex) {
_log.Error("Error sending attachments to Outlook", ex);
throw;
}
}
public Outlook.Items Send(string subject, string body) {
try {
_sent = false;
try {
_oApp = (Outlook.Application)Marshal.GetActiveObject("Outlook.Application");
_closeOutlook = false;
} catch {
_oApp = new Outlook.Application();
_closeOutlook = true;
}
if (_oApp.Explorers.Count <= 0) {
_oApp.Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox).Display();
_oApp.ActiveExplorer().WindowState = Outlook.OlWindowState.olMinimized;
}
_sentFolder = _oApp.Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderSentMail);
_itmsSentFolder = _sentFolder.Items;
_itmsSentFolder.ItemAdd += new Outlook.ItemsEvents_ItemAddEventHandler(Items_ItemAdd);
_oMsg = (Outlook.MailItem)_oApp.CreateItem(Outlook.OlItemType.olMailItem);
_inspector = _oMsg.GetInspector;
_oMsg.Subject = subject;
_oMsg.Body = body;
((Outlook.ItemEvents_10_Event)_oMsg).Send += new Microsoft.Office.Interop.Outlook.ItemEvents_10_SendEventHandler(MailItem_Send);
((Outlook.ItemEvents_10_Event)_oMsg).Write += new Microsoft.Office.Interop.Outlook.ItemEvents_10_WriteEventHandler(MailItem_Write);
int iAttachType = (int)Outlook.OlAttachmentType.olByValue;
foreach (string file in _attachments) {
Outlook.Attachment oAttach = _oMsg.Attachments.Add(file, iAttachType, 1, Path.GetFileName(file));
}
((Outlook.InspectorEvents_10_Event)_inspector).Close += new Outlook.InspectorEvents_10_CloseEventHandler(Inspector_Close);
_oMsg.Mileage = MESSAGE_FLAG;
_oMsg.Display(true);
} catch (Exception ex) {
_log.Error("Error sending attachments to Outlook", ex);
throw;
}
return _itmsSentFolder;