使用C#从Outlook中的共享文件夹中读取电子邮件

时间:2014-12-12 13:57:51

标签: c# email outlook office-interop

这是问题所在:

我正在使用带有Interop.Outlook库的C#。我可以到达我需要扫描的电子邮件所在的共享文件夹,并抓取值输入到分隔的文本文件中,然后传输到电子表格中。

但是目前该程序仅扫描父级共享收件箱文件夹中的电子邮件。我需要的大多数电子邮件都在此文件夹中,但是收件箱中有一些我需要扫描的子文件夹,此时我无法访问。

以下是当前代码:

 using Microsoft.Office.Interop;


 Outlook.Application app = new Outlook.Application();
 Outlook._NameSpace nSpace = app.GetNamespace("MAPI");
 Outlook.Recipient recip = nSpace.CreateRecipient("sharedFolderName");
 recip.Resolve();

 Outlook.MAPIFolder theParent = 
     nSpace.GetSharedDefaultFolder(recip, OlDefaultFolders.olFolderInbox).Parent;
 Outlook.MAPIFolder shared = 
     nSpace.GetSharedDefaultFolder(recip, OlDefaultFolders.olFolderInbox);
 Outlook.MAPIFolder subFolder = 
     theParent.Folders["Inbox"].Folders["FolderNameINeedToScan"];

我认为我的问题出在最后一行,我试图删除第二行.Folders,但这只是获取父收件箱。返回的当前错误是"找不到对象。"我正在寻找的文件夹确实存在。

如何访问Outlook中的子文件夹?

2 个答案:

答案 0 :(得分:2)

您无法获取GetSharedDefaultFolder获取的委托文件夹的子文件夹或父文件夹。您需要在所需的Exchange邮箱上授予该用户对Full Mailbox的访问权限,然后将该邮箱添加到当前的Outlook配置文件中。然后,该邮箱中的所有文件夹都将在NameSpace.Stores集合中可用。

如果无法将其他邮箱添加到Outlook配置文件,则可以使用“兑换”登录该邮箱,并在Outlook打开时访问这些文件夹。否则,您可以在Outlook关闭时使用NameSpace.Logon登录到特定的邮箱。

答案 1 :(得分:-2)

这是通过使用Eric在答案中给我的提示来解决的。

我不得不改变我使用的nameSpace。最初我用过

Outlook.Application app = new Outlook.Application();
Outlook._NameSpace nSpace = app.GetNamespace("MAPI");
Outlook.Recipient recip = nSpace.CreateRecipient("name of recipient");

然后我会使用收件人创建对共享收件箱的访问权限。但是我无法访问该收件箱中的子文件夹。感谢Eric,我改用了这个:

Outlook._NameSpace nSpace = app.GetNamespace("MAPI");
Outlook.Stores theStore = nSpace.Stores;
Folders subFolder = recip.Parent.Folders;    
dynamic email;
for(int i = 1; i<= subFolder.GetFirst().Folders["folderName"].Folders["subFolderName"].Items.Count; i++)
{
    email = subFolder.GetFirst().Folders["folderName].Folders["subFolderName"].Items[i];

最后一行是进入子文件夹并扫描所有电子邮件的魔法演员。 谢谢Eric