如何在 C# Outlook 中访问共享日历?

How to access shared calendars in c# Outlook?

我在通过 C# 访问 Outlook 中的共享日历时遇到了问题。我尝试了下面的代码。但也尝试遍历所有文件夹但没有成功...

using Outlook = Microsoft.Office.Interop.Outlook;
using OutlookApp = Microsoft.Office.Interop.Outlook.Application;
        
void test(){
    OutlookApp outlookApp = new OutlookApp();
    NameSpace mapiNamespace = outlookApp.GetNamespace("MAPI");
        
    //Access my calendar is OK!
    MAPIFolder ownerFolder = mapiNamespace.GetDefaultFolder(OlDefaultFolders.olFolderCalendar);
    Console.WriteLine("My: count:" + ownerFolder.Folders.Count + " path:\"" + ownerFolder.FullFolderPath + "\" items:" + ownerFolder.Items.Count);
        
    //ownerFolder.Folders.Count == 0, why?
    foreach (MAPIFolder subFolder in ownerFolder.Folders) Console.WriteLine(subFolder.FullFolderPath);
        
    //???Points to my calendar???
    Recipient recipient = mapiNamespace.CurrentUser;
    MAPIFolder sharedFolder = mapiNamespace.GetSharedDefaultFolder(recipient, OlDefaultFolders.olFolderCalendar);
    Console.WriteLine("Shared: count:" + sharedFolder.Folders.Count + " path:\"" + sharedFolder.FullFolderPath + "\" items:" + sharedFolder.Items.Count);
        
    //sharedFolder.Folders.Count == 0, why?
    foreach (MAPIFolder subFolder in sharedFolder.Folders) Console.WriteLine(subFolder.FullFolderPath);
}

预先感谢您的回答。

在以下代码中,您将本地用户名传递给 GetSharedDefaultFolder 方法:

//???Points to my calendar???
Recipient recipient = mapiNamespace.CurrentUser;
MAPIFolder sharedFolder = mapiNamespace.GetSharedDefaultFolder(recipient, OlDefaultFolders.olFolderCalendar);

NameSpace.GetSharedDefaultFolder 方法 returns 代表指定用户的指定默认文件夹的 Folder 对象。此方法用于委托方案,其中一个用户已将访问权限委托给另一个用户一个或多个默认文件夹(例如,他们的共享 Calendar 文件夹)。因此,您需要传递与您共享日历的人的用户名(或电子邮件),而不是您的用户名:

Recipient recipient = mapiNamespace.CreateRecipient("Eugene Astafiev");
MAPIFolder sharedFolder = mapiNamespace.GetSharedDefaultFolder(recipient, OlDefaultFolders.olFolderCalendar);

请注意,必须解析 Recipient 对象。

Recipient recipient = mapiNamespace.CreateRecipient("Eugene Astafiev");
recipient.Resolve(); 
if(recipient.Resolved)
{ 
   mapiNamespace.GetSharedDefaultFolder(recipient, OlDefaultFolders.olFolderCalendar);
}