Outlook.ItemsEvents 添加到已发邮件时获取mailItem

Outlook.ItemsEvents Get mailItem when adds to the sent mails

我有一个带有两个功能区的 Outlook 加载项(用于阅读邮件和撰写邮件)。

我创建了一个事件,当它发送到已发送的项目时会收到​​一封电子邮件。

这是我的ThisAddIn.cs

private void ThisAddIn_Startup(object sender, System.EventArgs e)
{
    OutlookApplication = Application as Outlook.Application;
    OutlookInspectors = OutlookApplication.Inspectors;
    OutlookInspectors.NewInspector +=
        new Outlook.InspectorsEvents_NewInspectorEventHandler(OutlookInspectors_NewInspector);

    var sentBoxItems =
        this.Application.Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderSentMail).Items;
    sentBoxItems.ItemAdd +=
        new Outlook.ItemsEvents_ItemAddEventHandler(Items_ItemsAdd);
}

private void Items_ItemsAdd(object Item)
{
    if (Item != null)
        Helpers.SaveMailSent((Outlook.MailItem)Item); // Here do stuff to save mail
}

我试图在单击 "Send" 按钮时获取事件,但 mailItem 变为空。

现在我正在尝试获取新邮件何时发送并进入已发送文件夹。

问题是每次发送邮件时都不会触发事件(有时会执行,但有时不会)

首先,你需要保持源对象存活,即防止它被破坏或释放。要实现它,您必须在 class 级别声明源对象:

 private Outlook.Items sentBoxItems = null;

 private void ThisAddIn_Startup(object sender, System.EventArgs e)
{
    OutlookApplication = Application as Outlook.Application;
    OutlookInspectors = OutlookApplication.Inspectors;

    sentBoxItems =
        this.Application.Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderSentMail).Items;
    sentBoxItems.ItemAdd +=
        new Outlook.ItemsEvents_ItemAddEventHandler(Items_ItemsAdd);
}

private void Items_ItemsAdd(object Item)
{
    if (Item != null)
        Helpers.SaveMailSent((Outlook.MailItem)Item); // Here do stuff to save mail
}

还要注意以下事实:

  1. MailItem class 的 DeleteAfterSubmit 属性 允许设置一个布尔值,如果邮件消息的副本在发送时未保存,则为 True,否则为 False副本保存在“已发送邮件”文件夹中。因此,已发送的项目将永远不会添加到“已发送项目”文件夹中。
  2. 如果将多个项目添加到文件夹(通常超过 16 个),则不会触发 ItemAdd 事件。这是OOM中的一个众所周知的问题。