我正在尝试为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--;
}
}
}
}
}
}
答案 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启动后,请考虑使用计时器稍稍运行该过程。
您可以在以下系列文章中了解处理传入电子邮件的可能方法:
Outlook NewMail event unleashed: the challenge (NewMail, NewMailEx, ItemAdd)
Outlook NewMail unleashed: writing a working solution (C# example)
另外,我建议打破调用链并在单独的代码行上对每个属性或方法调用进行delaclaring。完成使用后,使用System.Runtime.InteropServices.Marshal.ReleaseComObject释放Outlook对象。如果您的加载项尝试枚举存储在Microsoft Exchange Server上的集合中超过256个Outlook项目,这一点尤为重要。如果您未及时发布这些对象,则可以达到Exchange对任何时候打开的最大项目数的限制。然后在Visual Basic中将变量设置为Nothing(C#中为null)以释放对该对象的引用。有关详细信息,请参阅MSDN中的Systematically Releasing Objects文章。