c#Outlook加载项在电子邮件位于“已发送”邮箱后获取“已发送日期”

本文关键字:获取 日期 已发送日期 加载项 电子邮件 c#Outlook 已发送 | 更新日期: 2023-09-27 17:57:32

我制作了一个用于商业目的的Outlook外接程序(Outlook 2013和2016 VSTO外接程序),用于将电子邮件详细信息保存到我们的数据库中。外接程序在撰写新电子邮件时启动,但在发送电子邮件时关闭。

只有在将电子邮件移动到"已发送"邮箱后,才会添加电子邮件的发送日期。有没有一种方法可以使用我的当前加载项(或另一个加载项),在它关闭后可以用来获取发送日期,而不让用户等待它移动到发送的邮箱?

我知道它可以很容易地在VBA中完成,但我想最好使用外接程序,这样它可以很方便地加载到所有使用exchange服务器的用户。

c#Outlook加载项在电子邮件位于“已发送”邮箱后获取“已发送日期”

这个日期不是今天的日期/时间(现在)还是接近它的日期?

在VBA中可以执行的所有操作都可以在COM加载项中执行-订阅"已发送邮件"文件夹中的Items.ItemAdd事件并检索事件触发的日期。

感谢德米特里的回复。它让我走上了正确的道路。当将新项目添加到"已发送"邮箱时,我使用现有的VSTO加载项进行激发。我不知道当在"ThisAddIn_Startup"方法中插入这个时,会重新激活外接程序,这现在是有意义的。

我以这个例子为例。

这是我的代码:

Outlook.NameSpace outlookNameSpace;
Outlook.MAPIFolder Sent_items;
Outlook.Items items;
private void ThisAddIn_Startup(object sender, System.EventArgs e)
{
    outlookNameSpace = this.Application.GetNamespace("MAPI");
    Sent_items = outlookNameSpace.GetDefaultFolder(Microsoft.Office.Interop.Outlook.OlDefaultFolders.olFolderSentMail);
    items = Sent_items.Items;
    items.ItemAdd += new Outlook.ItemsEvents_ItemAddEventHandler(items_ItemAdd);
}
void items_ItemAdd(object Item)
{
    Outlook.MailItem mail = (Outlook.MailItem)Item;       
    string strMailItemNumber_filter = mail.UserProperties["MailItemNumber"].Value;
    if ((Item != null) && (!string.IsNullOrWhiteSpace(strMailItemNumber_filter)))
    {
        if (mail.MessageClass == "IPM.Note" &&
                   mail.UserProperties["MailItemNumber"].Value.ToUpper().Contains(strMailItemNumber_filter.ToUpper())) //Instead of subject use other mail property
        {
            //Write 'Sent date' to DB
            System.Windows.Forms.MessageBox.Show("Sent date is: "+ mail.SentOn.ToString()+ " MailNr = "+strMailItemNumber_filter);
        }
    }
}

我必须创建一个新的邮件用户定义属性来匹配我发送的电子邮件,才能在发送的邮箱中找到正确的电子邮件:

        private void AddUserProperty(Outlook.MailItem mail)
    {
        Outlook.UserProperties mailUserProperties = null;
        Outlook.UserProperty mailUserProperty = null;
        try
        {
            mailUserProperties = mail.UserProperties;
            mailUserProperty = mailUserProperties.Add("MailItemNrProperty", Outlook.OlUserPropertyType.olText, false, 1);
            // Where 1 is OlFormatText (introduced in Outlook 2007)
            mail.UserProperties["MailItemNumber"].Value = "Any value as string...";
            mail.Save();
        }
        catch (Exception ex)
        {
            System.Windows.Forms.MessageBox.Show(ex.Message);
        }
        finally
        {
            if (mailUserProperty != null) Marshal.ReleaseComObject(mailUserProperty);
            if (mailUserProperties != null) Marshal.ReleaseComObject(mailUserProperties);
        }
    }