开发用于审核收件箱中的邮件。在这个尝试用自定义类包装收件箱中的所有邮件项目。我使用以下代码来做到这一点。
OutlookNS._NameSpace outNS;
List<MailWrapper> wrappedItems = new List<MailWrapper>();
OutlookNS.Explorer explorer;
private void ThisAddIn_Startup(object sender, System.EventArgs e)
{
outNS = this.Application.GetNamespace("MAPI");
OutlookNS.MAPIFolder folder = outNS.GetDefaultFolder(OutlookNS.OlDefaultFolders.olFolderInbox) as OutlookNS.MAPIFolder;
foreach (OutlookNS.MailItem item in folder.Items)//No items here
{
try
{
OutlookNS.MailItem mailItem = item as OutlookNS.MailItem;
MailWrapper wrappedItem = new MailWrapper(mailItem); ;
wrappedItems.Add(wrappedItem);
}
catch (Exception ex)
{
// do nothing for now
}
}
}
但这不是取物品。有人可以帮忙吗。猜测可能是因为邮件还没有加载。
答案 0 :(得分:0)
首先,永远不要遍历文件夹中的所有项目 - 您将耗尽RPC通道。
最重要的是,您假设收件箱中的所有项目都是MailItem
个对象。您还可以拥有MeetingItem
,ReportItem
等
答案 1 :(得分:0)
无需包装文件夹中的所有项目。相反,您可以处理Explorer类的SelectionChange事件,当用户以编程方式选择其他或其他Microsoft Outlook项目或通过与用户界面交互时触发该事件。当用户(以编程方式或通过用户界面)单击或切换到包含项目的其他文件夹时,也会发生此事件,因为Outlook会自动选择该文件夹中的第一个项目。
所以基本上你可以在Outlook中选择(进入视图)时包装一个项目。您还可以找到有用的Developing an Inspector Wrapper for Outlook 2010文章。
作为一种变通方法,您可以保留EntryID
的列表,该列表可用于使用命名空间类的GetItemFromID
方法检索原始项目。
此外,我注意到以下代码行:
foreach (OutlookNS.MailItem item in folder.Items)//No items here
Items
集合可能包含不同类型的Outlook项目。您需要检查MessageClass属性或只检查项目类型(VBA):
For Each Item In olFolder.Items
If TypeOf Item Is Outlook.MailItem Then
Dim oMail As Outlook.MailItem: Set oMail = Item
Debug.Print oMail.SenderEmailAddress
End If
Next