从 Outlook 获取 C# 中的未读电子邮件

本文关键字:电子邮件 Outlook 获取 | 更新日期: 2023-09-27 17:55:49

嗨,我需要获取未读电子邮件。最后几行是否正确,因为它在 0 时引发i异常 - 数组索引超出边界。

Microsoft.Office.Interop.Outlook.Application myApp = new    Microsoft.Office.Interop.Outlook.ApplicationClass();
Microsoft.Office.Interop.Outlook.NameSpace mapiNameSpace = myApp.GetNamespace("MAPI");
Microsoft.Office.Interop.Outlook.MAPIFolder myInbox = mapiNameSpace.GetDefaultFolder(Microsoft.Office.Interop.Outlook.OlDefaultFolders.olFolderInbox);
Microsoft.Office.Interop.Outlook.Items oItems = myInbox.Items.Restrict("[UnRead] = true");
for(int i = 0; i <= oItems.Count; i++)
{
    Microsoft.Office.Interop.Outlook.MailItem oMsg = ( Microsoft.Office.Interop.Outlook.MailItem)oItems[i];
    textEmail.Text += "'r'nSubject:" + oMsg.Subject.ToString();
}

从 Outlook 获取 C# 中的未读电子邮件

Microsoft.Office.Interop.Outlook.Items 集合的索引从 1 开始。(可能是由于交换对象的遗留 + VBA 影响)

因此,您需要从 1 开始计数器或使用 for each 循环。(你的结束索引检查也是错误的)

// index starts from 1.
for(int i = 1; i <= oItems.Count; i++)
{
    Microsoft.Office.Interop.Outlook.MailItem oMsg = ( Microsoft.Office.Interop.Outlook.MailItem)oItems[i];
    textEmail.Text += "'r'nSubject:" + oMsg.Subject.ToString();
}

另一种选择是使用 foreach 循环,它比 for 循环稍慢,但对于所有实际目的几乎等效。

// var doesn't work for these com based legacy object models.
foreach(Microsoft.Office.Interop.Outlook.MailItem oMsg in oItems)
{
    textEmail.Text += "'r'nSubject:" + oMsg.Subject.ToString();
}

尝试改用 foreach 循环

foreach (var item in oItems)
{
   textEmail.Text += "'r'nSubject:" + item.Subject.ToString();
}