Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 除非打开Outlook,否则不会触发Outlook文件夹ItemAdded事件_C#_Email_Com_Outlook - Fatal编程技术网

C# 除非打开Outlook,否则不会触发Outlook文件夹ItemAdded事件

C# 除非打开Outlook,否则不会触发Outlook文件夹ItemAdded事件,c#,email,com,outlook,C#,Email,Com,Outlook,MyC应用程序允许用户选择要发送电子邮件的文件。他们需要从outlook/exchange联系人中选择收件人,因为我们管理/同步公司的联系人列表 在他们发送后,我需要捕获msg文件并使用收件人信息将其保存在某个位置 收件人信息在发送期间不可用,因此我找到一些代码来使用send folder ItemAdded事件 这一切都工作得很好,直到有人在outlook尚未打开的情况下运行它,在这种情况下,事件永远不会被触发。Application.itemssend、Inspector.Close等全部激

MyC应用程序允许用户选择要发送电子邮件的文件。他们需要从outlook/exchange联系人中选择收件人,因为我们管理/同步公司的联系人列表

在他们发送后,我需要捕获msg文件并使用收件人信息将其保存在某个位置

收件人信息在发送期间不可用,因此我找到一些代码来使用send folder ItemAdded事件

这一切都工作得很好,直到有人在outlook尚未打开的情况下运行它,在这种情况下,事件永远不会被触发。Application.itemssend、Inspector.Close等全部激活,但不是我需要获取收件人信息的那个

有人知道为什么这不起作用吗

注意:对于类似的问题,有几个问题让Items变量超出范围。事实上,我正在返回它并等待它被执行,当Outlook打开并最终触发事件时,它运行良好

这是我的方法,Outlook只是Microsoft.Office.Interop.Outlook的别名

更新:


}

垃圾收集器将刷取源对象。也就是说,由于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;