Событие Outlook ItemAdd не вызывается последовательно - PullRequest
0 голосов
/ 22 апреля 2019

Я пытаюсь решить, является ли входящая почта спамом или нет.Событие 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;
    }
}

Когда я отправляю себе письмо, я нахожусь внутри и я нахожусь внутрив функции прогнозирования "отображается только один раз в консоли отладки.

Ответы [ 2 ]

1 голос
/ 22 апреля 2019

Во-первых, ваш код не будет компилироваться - нет события ItemAdd для объекта MAPIFolder. Он предоставляется объектом Items (возвращается из свойства MAPIFolder.Items).

Во-вторых, объект, вызывающий события (Items), должен оставаться живым - объявить его на уровне класса, а не как локальную переменную, которая освобождается сборщиком мусора при выходе из метода ThisAddIn_Startup.

0 голосов
/ 23 июня 2019

Рабочий код будет выглядеть как

 public partial class ThisAddIn
 {
    Outlook.Items items=null;
private void ThisAddIn_Startup(object sender, System.EventArgs e)
{
     Outlook.MAPIFolder inbox = 
    Application.Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox);
    items=inbox.Items;
    items.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;
 }
}
...