c# - 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
方法退出时由垃圾收集器释放。
推荐阅读
- javascript - discord.js 从旧消息中读取反应
- ios - 如何在没有 https 的情况下使用 ftp 服务器安装 .ipa 文件?
- multithreading - 终止特定线程
- algorithm - 通过使用不同的促销来最小化总价的算法
- java - 如果我不使用 selenium 服务器独立文件,是否需要 selenium 服务器来使用 selenium 客户端创建 selenium 自动化?
- antlr4 - Antlr4 不匹配复合令牌
- listview - Fluter/Dart 如何将索引从 Listview.builder 传递到项目小部件
- javascript - 如何查找在 Map JavaScript 中用作键的类实例?
- heap - 为什么堆Delete element的复杂度等于O(logn)而Build是O(n)?
- php - 此路由不支持 GET 方法。支持的方法:POST。在插入/存储