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

时间:2018-05-31 10:10:08

标签: vsto outlook-addin

我有一个带有两个功能区的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
}

我试图在"发送"单击按钮,但mailItem变为null。

现在我正在尝试发送新邮件并将其发送到已发送的文件夹。

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

1 个答案:

答案 0 :(得分:1)

首先,您需要保持源对象的活动,即防止它被破坏或释放。要实现这一点,您必须在类级别声明源对象:

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