在Outlook中阅读未读邮件的问题

时间:2015-05-05 07:57:50

标签: c# .net outlook vsto

我正在尝试为Outlook开发一个加载项。我希望在收到新邮件时删除附件。

所以我在NewMailEx事件上调用我的函数。它工作正常。在该功能中,我尝试在Outlook收件箱中查找未读邮件。从那些我删除附件。

我的问题是:当我打开Outlook时,收到的第一封邮件没有显示在收件箱中(不在outlook c#代码中),因此我无法从该邮件中删除附件。

从第二封邮件(第一封邮件之后),我可以收到收到的邮件,这样我就可以删除附件。

每当我关闭并重新打开Outlook时,我收到的第一封邮件都会出现此问题。

收到第一封邮件时,没有未读邮件。

private void Application_NewMailEx(object Item)
{
    string senderEmailid = string.Empty;
    outlookNameSpace = this.Application.GetNamespace("MAPI");
    Outlook.Application myApp = new Outlook.Application();
    Outlook.NameSpace mapiNameSpace = myApp.GetNamespace("MAPI");
    Outlook.MAPIFolder myInbox = mapiNameSpace.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox);
    Outlook.Attachments attachments;
    int test = myInbox.Items.Count;

    Microsoft.Office.Interop.Outlook.Recipients recipients = ((Outlook.MailItem)myInbox.Items[test]).Recipients;
    Outlook.Items unreadItems = myInbox.Items.Restrict("[Unread]=true");
    if (unreadItems.Count > 0)
    {       
        foreach (Outlook.MailItem mail in unreadItems)
        {
            Outlook.Recipient recip;
            Outlook.ExchangeUser exUser;
            string sAddress;

            if (mail.SenderEmailType.ToLower() == "ex")
            {
                recip = Globals.ThisAddIn.Application.GetNamespace("MAPI").CreateRecipient(mail.SenderEmailAddress);
                exUser = recip.AddressEntry.GetExchangeUser();
                sAddress = exUser.PrimarySmtpAddress;
            }
            else
            {
                sAddress = mail.SenderEmailAddress.Replace("'", "");
            }
            string[] emailAddressPart = sAddress.Split('@');
            string strSenderDomain = emailAddressPart[1];
            if (lstDomain.Any(item => item.Contains(strSenderDomain)))
            {
                attachments = mail.Attachments;
                int nAttachmentCount = mail.Attachments.Count;
                if (nAttachmentCount > 0)
                {
                    int j = nAttachmentCount;
                    for (int i = 1; i <= nAttachmentCount; i++)
                    {
                        mail.Attachments[j].Delete();
                        j--;
                    }
                }
            }
        }
    }           
}

2 个答案:

答案 0 :(得分:1)

你无能为力。来自NewMailEx的文档:

  

此外,仅当Outlook正在运行时才会触发该事件。换句话说,当Outlook未打开时,它不会触发收件箱中收到的新项目。

这意味着您必须手动调用方法,以便在打开Outlook时查看所有未读的电子邮件。

答案 1 :(得分:1)

Application类的NewMailEx事件不是搜索未读电子邮件的最佳位置。对于Microsoft Outlook处理的每个接收项,此事件将触发一次。该项可以是几种不同项类型之一,例如,MailItem,MeetingItem或SharingItem。 EntryIDsCollection字符串包含与该项对应的条目ID。另一种方法是处理Items类的ItemAdd事件。

相反,您可以等到Outlook完成项目同步并运行代码以搜索未读电子邮件。 Microsoft Outlook完成使用指定的发送/接收组同步用户的文件夹后立即触发SyncObject类的SyncEnd事件。

您也可以考虑处理Startup或MAPILogonComplete事件。但是在同步完成之前它们会被触发。在Outlook启动后,请考虑使用计时器稍稍运行该过程。

您可以在以下系列文章中了解处理传入电子邮件的可能方法:

另外,我建议打破调用链并在单独的代码行上对每个属性或方法调用进行delaclaring。完成使用后,使用System.Runtime.InteropServices.Marshal.ReleaseComObject释放Outlook对象。如果您的加载项尝试枚举存储在Microsoft Exchange Server上的集合中超过256个Outlook项目,这一点尤为重要。如果您未及时发布这些对象,则可以达到Exchange对任何时候打开的最大项目数的限制。然后在Visual Basic中将变量设置为Nothing(C#中为null)以释放对该对象的引用。有关详细信息,请参阅MSDN中的Systematically Releasing Objects文章。