Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在Outlook中读取未读邮件的问题_C#_.net_Outlook_Vsto - Fatal编程技术网

C# 在Outlook中读取未读邮件的问题

C# 在Outlook中读取未读邮件的问题,c#,.net,outlook,vsto,C#,.net,Outlook,Vsto,我正在尝试为Outlook开发一个外接程序。我希望在收到新邮件时删除附件 因此,我在NewMailEx事件中调用我的函数。它工作得很好。在该功能中,我尝试在Outlook收件箱中查找未读邮件。从这些我删除附件 我的问题是:当我打开Outlook时,我收到的第一封邮件没有显示在收件箱中(不是在Outlook c#代码中),因此我无法从该邮件中删除附件 从第二封邮件(第一封邮件之后)中,我可以获得收到的邮件,以便删除附件 每当我关闭并重新打开Outlook时,我收到的第一封邮件都会出现此问题 在收到

我正在尝试为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--;
                    }
                }
            }
        }
    }           
}
private void应用程序\u NewMailEx(对象项)
{
string senderEmailid=string.Empty;
outlookNameSpace=this.Application.GetNamespace(“MAPI”);
Outlook.Application myApp=新建Outlook.Application();
Outlook.NameSpace mapiNameSpace=myApp.GetNamespace(“MAPI”);
Outlook.MAPIFolder myInbox=mapiNameSpace.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox);
Outlook。附件;
int test=myInbox.Items.Count;
Microsoft.Office.Interop.Outlook.Recipients收件人=((Outlook.MailItem)myInbox.Items[test])。收件人;
Outlook.Items unreadItems=myInbox.Items.Restrict(“[Unread]=true”);
如果(未读数据项计数>0)
{       
foreach(Outlook.MailItem未编辑邮件)
{
展望。收件人回复;
Outlook.euser-exUser;
弦鞍;
if(mail.SenderEmailType.ToLower()=“ex”)
{
recip=Globals.ThisAddIn.Application.GetNamespace(“MAPI”).CreateRecipient(mail.SenderEmailAddress);
exUser=recip.AddressEntry.GetExchangeUser();
sAddress=exUser.primarySMTAddress;
}
其他的
{
sAddress=mail.SenderEmailAddress.Replace(“,”);
}
字符串[]emailAddressPart=sAddress.Split('@');
字符串strSenderDomain=emailAddressPart[1];
if(lstDomain.Any(item=>item.Contains(strSenderDomain)))
{
附件=mail.attachments;
int-natachmentcount=mail.Attachments.Count;
如果(nAttachmentCount>0)
{
int j=nAttachmentCount;

对于(int i=1;i,您对此无能为力。从上的文档:

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

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

应用程序类的事件不是搜索未读电子邮件的最佳位置。对于Microsoft Outlook处理的每个接收项目,此事件都会触发一次。该项目可以是几种不同的项目类型之一,以供检查ple、MailItem、MeetingItem或SharingItem。EntryIDCollection字符串包含与该项目对应的条目ID。另一种方法是处理Items类的ItemAdd事件

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

也可以考虑处理启动或MaPiLogon完成事件。但是它们在同步完成之前被激发。考虑使用定时器在Outlook启动后运行程序。< /P> 您可以在以下系列文章中了解处理传入电子邮件的可能方法:


此外,我还建议您打破调用链,并将每个属性或方法调用DelaRaring在单独的代码行上。用于在使用完Outlook对象后释放它。如果外接程序试图枚举存储在Microsoft Exchange Server上的集合中的256个以上Outlook项目,这一点尤为重要。如果不及时释放这些对象,则可以达到Exchange对每次打开的最大项数施加的限制。然后在Visual Basic中将变量设置为Nothing(C#中为null)发布对该对象的引用。请在MSDN中的文章中阅读更多相关内容。

谢谢您,先生……打开outlook后……我向outlook发送了一封邮件(outlook已打开,直到没有收到新的第一封邮件)……第一封邮件中的附件未被删除。。。(但函数已执行…问题是未读邮件的计数为0)…请帮助…..您的意思是:事件未引发?您是如何订阅的?如果附加调试器会发生什么?是的,事件已引发…但由于未读邮件计数为0…..它的附件未被删除…..为什么您希望自己查找这些项目?为什么不依赖事件中提供的列表?请参阅我的po中的文档st.参考文档中有一个代码示例:请给我一个在c#中使用syncend…..的代码。上面的链接只提供vb代码…..请帮助。。。。。