使用图 api 和 C# 下载子文件夹中的附件

Downloading attachments with in sub folders using graph api and C#

我正在创建一个从 outlook365 帐户下载附件的解决方案。此帐户的收件箱有子文件夹和子文件夹中的文件夹。结构如下所示。

我一直在尝试下载附件,但我只能从主收件箱中的邮件中获取附件。

但我想查看子文件夹。因此,通过研究 Microsoft 图形文档 (https://docs.microsoft.com/en-us/graph/api/attachment-get?view=graph-rest-1.0&tabs=http#http-request),我发现了以下 HTTP URL 请求。

GET /me/mailFolders/{id}/childFolders/{id}/.../messages/{id}/attachments/{id}
GET /users/{id | userPrincipalName}/mailFolders/{id}/childFolders/{id}/messages/{id}/attachments/{id}

GET /me/mailFolders/{id}/childFolders/{id}/.../messages/{id}/attachments/{id}/$value
GET /users/{id | userPrincipalName}/mailFolders/{id}/childFolders/{id}/messages/{id}/attachments/{id}/$value

我是 C# 的新手,我很难将上述 URL 方法转换为 C#。下面是我用来抓取消息和展开附件的当前代码。

public static async Task<IMailFolderMessagesCollectionPage> GetAttachmentToday()
    {
        var DateToDay = DateTime.Now.ToString("dd.MM.yyyy");

        var SearchOption = new List<QueryOption>
        {
            new QueryOption("search", $"%22received:{DateToDay}%22")
        };

        try
        {
            var attachments = await graphClient.Me.MailFolders.Inbox.Messages
                .Request(SearchOption)
                .Top(5)
                .Select(a => new
                {
                    a.Subject,
                    a.HasAttachments
                })
                .Expand("attachments")
                .GetAsync();

            return attachments;
        }
        catch(ServiceException ex)
        {
            Console.WriteLine($"Error getting events: {ex.Message}");
            return null;
        }
    }

我不知道如何实施 Microsoft 文档 URL 建议与 var attachments = await graphClient.Me.MailFolders.Inbox.Messages 一起工作。希望有人能指出我正确的道路。

我弄清楚了这一点,并使用了 Microsoft 文档提供的示例 HTML 代码。下面是

GET /me/mailFolders/{id}/childFolders/{id}/.../messages/{id}/attachments/{id}
GET /users/{id | userPrincipalName}/mailFolders/{id}/childFolders/{id}/messages/{id}/attachments/{id}

GET /me/mailFolders/{id}/childFolders/{id}/.../messages/{id}/attachments/{id}/$value
GET /users/{id | userPrincipalName}/mailFolders/{id}/childFolders/{id}/messages/{id}/attachments/{id}/$value

所以基于上面的代码,我想出了下面的 C# 代码。

//To get the first supfolder and it's ID.
var FirstSubFolderIDs = await graphClient.Me.MailFolders["Inbox"].ChildFolders
                    .Request()
                    .Select(fid => new
                    {
                        fid.Id,
                        fid.DisplayName
                    })
                    .GetAsync();
                
                foreach(var FirstSubFolderID in FirstSubFolderIDs)
                {
                    if(FirstSubFolderID.Id != null)
                    {   //Using the above ID to get the second folder and it's ID.
                        var SecondSubFolderIDs = await graphClient.Me.MailFolders["Inbox"]
                            .ChildFolders[$"{FirstSubFolderID.Id}"]
                            .ChildFolders
                            .Request()
                            .Select(sid => new
                            {
                                sid.Id,
                                sid.DisplayName
                            })
                            .GetAsync();

                        foreach (var SecondSubFolderID in SecondSubFolderIDs)
                        {
                            if(SecondSubFolderID.Id != null)
                            {   //Continuing on using the first 2 ID's to get the 3rd folder and it's ID.
                                var ThirdSubFolderIDs = await graphClient.Me.MailFolders["Inbox"]
                                    .ChildFolders[$"{FirstSubFolderID.Id}"]
                                    .ChildFolders[$"{SecondSubFolderID.Id}"]
                                    .ChildFolders
                                    .Request()
                                    .Select(tid => new
                                    {
                                        tid.Id,
                                        tid.DisplayName,
                                    })
                                    .GetAsync();               

                                foreach (var ThirdSubFolderID in ThirdSubFolderIDs)
                                {
                                    if(ThirdSubFolderID.DisplayName == "New")
                                    {   //Now you're at the last folder where the emails are at.
                                        var GetMessageAttachments = await graphClient.Me.MailFolders["Inbox"]
                                            .ChildFolders[$"{FirstSubFolderID.Id}"]
                                            .ChildFolders[$"{SecondSubFolderID.Id}"]
                                            .ChildFolders[$"{ThirdSubFolderID.Id}"]
                                            .Messages
                                            //.Request(SearchOption)
                                            .Request()
                                            .Expand("attachments")
                                            .Select(gma => new
                                            {   
                                                gma.Id,
                                                gma.Subject,
                                                gma.HasAttachments,                                               
                                                gma.Attachments
                                            })
                                            .GetAsync();

                                        //Get Message count that includes attachments
                                        var MessageCount = GetMessageAttachments.Count;

                                        if (MessageCount != 0)
                                        {
                                          //Do what you want here
                                        }

决定回答我的问题,这样其他人可能会觉得这有帮助。