Outlook ItemAdd事件未一致触发

Outlook ItemAdd event not triggered consistently(Outlook ItemAdd事件未一致触发)
本文介绍了Outlook ItemAdd事件未一致触发的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试确定传入的邮件是否为垃圾邮件。ItemAdd事件只工作一次。它不会始终如一地触发。

如何解决此问题?

我执行以下操作:

public partial class ThisAddIn
{

    private void ThisAddIn_Startup(object sender, System.EventArgs e)
    {
        Outlook.MAPIFolder inbox = Application.Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox);
        inbox.ItemAdd += new Outlook.ItemsEvents_ItemAddEventHandler(InboxFolderItemAdded);
    }

    private void InboxFolderItemAdded(object Item)
    {
        if (Item is Outlook.MailItem)
        {
            Debug.WriteLine("I'm in!");
            Outlook.MailItem mail = (Outlook.MailItem)Item;
            int[] answer = Predict(mail);

            if(answer[0] == 0) // Not spam
            {
                Outlook.MAPIFolder inboxFolder = ((Outlook.MAPIFolder)this.Application.ActiveExplorer().Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox));
                mail.Move(inboxFolder);
            }

            else if(answer[0] == 1) // Spam
            {
                Outlook.MAPIFolder junkFolder = ((Outlook.MAPIFolder)this.Application.ActiveExplorer().Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderJunk));
                mail.Move(junkFolder);
            }
        }
    }

    private int[] Predict(Outlook.MailItem mailBody)
    {
        Debug.WriteLine("I'm inside in predict function");
        double[]feature = featureExtraction.findFeatureIncomingMail(mailBody.Body);
        int[] answer = tree.Decide(feature);
        return answer;
    }
}

当我给自己发送邮件时,"我在"和"我在预测功能中"在调试控制台中只显示一次。

推荐答案

首先,您的代码不会编译-ItemAdd对象上没有MAPIFolder事件。它由Items对象(从MAPIFolder.Items属性返回)公开。

其次,引发事件(Items)的对象必须保持活动状态-在类级别声明它,而不是将其声明为局部变量,该变量在ThisAddIn_Startup方法退出时由垃圾收集器释放。

这篇关于Outlook ItemAdd事件未一致触发的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

DispatcherQueue null when trying to update Ui property in ViewModel(尝试更新ViewModel中的Ui属性时DispatcherQueue为空)
Drawing over all windows on multiple monitors(在多个监视器上绘制所有窗口)
Programmatically show the desktop(以编程方式显示桌面)
c# Generic Setlt;Tgt; implementation to access objects by type(按类型访问对象的C#泛型集实现)
InvalidOperationException When using Context Injection in ASP.Net Core(在ASP.NET核心中使用上下文注入时发生InvalidOperationException)
LINQ many-to-many relationship, how to write a correct WHERE clause?(LINQ多对多关系,如何写一个正确的WHERE子句?)