Microsoft Graph to Manage Mailboxes in C#

การรวม Microsoft Graph API และ Aspose.Email สำหรับ .NET กับแอปพลิเคชันอีเมลช่วยให้นักพัฒนาสามารถเข้าถึงและจัดการข้อมูล Mailbox ได้อย่างง่ายดาย ทำการดำเนินการต่างๆ เช่น การดึงข้อความ การดึงโครงสร้างโฟลเดอร์ และการบันทึกอีเมลในรูปแบบต่างๆ ในบทความนี้ เราจะสำรวจวิธีใช้การรวมที่ทรงพลังนี้ในการประมวลผลและจัดการ Mailboxes

การนำเสนอ Microsoft Graph

Microsoft Graph เป็นแพลตฟอร์ม API ที่ครอบคลุมซึ่งจัดทำโดย Microsoft ที่มีจุดสิ้นสุดแบบรวมเพื่อเข้าถึงบริการและข้อมูลของ Microsoft ที่หลากหลาย มันทำหน้าที่เป็นประตูสู่ข้อมูลขนาดใหญ่ที่มีอยู่ใน Microsoft 365 รวมถึง Mailbox ของ Outlook, ปฏิทิน, รายชื่อผู้ติดต่อ, OneDrive, Teams และอื่น ๆ

ด้วย Microsoft Graph นักพัฒนาสามารถสร้างแอปพลิเคชันที่มีปฏิสัมพันธ์กับข้อมูลและข้อมูลเชิงลึกของผู้ใช้ได้อย่างราบรื่นทั่วทั้งระบบคลาวด์ของ Microsoft สิ่งนี้ทำได้ผ่าน API แบบ RESTful และ SDK ที่ให้วิธีการในการตรวจสอบสิทธิ์ อนุญาต และสอบถามข้อมูลได้อย่างง่ายดาย

เกี่ยวกับ Aspose.Email สำหรับ .NET

Aspose.Email สำหรับ .NET เป็นไลบรารีที่มีฟีเจอร์ครบครันที่ช่วยให้นักพัฒนาสามารถทำงานกับไฟล์และโปรโตคอลอีเมลในแอปพลิเคชัน .NET ของพวกเขา มันให้ชุด API ที่แข็งแกร่งสำหรับการสร้าง การจัดการ และการแปลงข้อความอีเมลในรูปแบบต่างๆ เช่น MSG, EML และ MBOX นอกจากนี้ ไลบรารียังรองรับโปรโตคอลอีเมล เช่น SMTP, POP3 และ IMAP ทำให้การจัดการอีเมลมีความหลากหลาย

ในคู่มือนี้ เราจะใช้ Aspose.Email เพื่อโต้ตอบกับ Microsoft Graph โดยการประมวลผลข้อมูล Mailbox โปรแกรมmatically ด้วย GraphClient จาก Aspose.Email เราสามารถดำเนินการ Mailbox ได้อย่างมีประสิทธิภาพโดยการตรวจสอบสิทธิ์กับ Microsoft Graph

เพื่อเริ่มต้นการใช้ไลบรารี คุณต้องรวมเข้าไปในโครงการของคุณ วิธีที่ง่ายที่สุดในการรับ Aspose.Email สำหรับ .NET คือผ่าน NuGet Package Manager:

  • เปิดโครงการของคุณใน Visual Studio
  • ไปที่ Tools > NuGet Package Manager > Manage NuGet Packages for Solution
  • ค้นหา Aspose.Email
  • เลือกแพ็คเกจและคลิก Install

หรือคุณสามารถใช้ Package Manager Console:

Install-Package Aspose.Email

คุณยังสามารถ ดาวน์โหลด เวอร์ชันล่าสุดของ API ได้โดยตรงจาก เว็บไซต์ ของ Aspose

กำหนดค่าแอปของคุณใน Azure Portal

ก่อนที่เราจะดำดิ่งลงไปในโค้ด สิ่งสำคัญคือการกำหนดค่าแอปพลิเคชันของคุณภายใน Azure portal เพื่อเปิดใช้งานการเข้าถึง Microsoft Graph เพียงทำตามขั้นตอนเหล่านี้:

  1. สร้างแอป Azure Active Directory (AAD):

    • ไปที่ Azure Portal
    • ไปที่ Azure Active Directory > App registrations
    • คลิก New registration เพื่อสร้างแอปพลิเคชันใหม่
    • กำหนดชื่อและตั้งค่า URI การเปลี่ยนเส้นทางหากจำเป็น
    • คลิก Register เพื่อทำขั้นตอนนี้ให้เสร็จสิ้น
  2. ตั้งค่าการอนุญาต API:

    • ในแอปที่ลงทะเบียนของคุณ ให้ไปที่ API permissions
    • คลิก Add a permission > Microsoft Graph
    • เลือก Application permissions สำหรับการเรียกจากเซิร์ฟเวอร์ไปยังเซิร์ฟเวอร์
    • เลือกสิทธิ์ที่จำเป็น เช่น Mail.Read, Mail.ReadWrite, User.Read, เป็นต้น
    • คลิก Add permissions เพื่อใช้
  3. สร้าง Client Secret:

    • ไปที่ Certificates & secrets ในแอปของคุณ
    • คลิก New client secret และให้คำอธิบาย
    • กำหนดระยะเวลาหมดอายุ จากนั้นคลิก Add
    • บันทค่าลับที่สร้างขึ้น เนื่องจากคุณจะต้องใช้มันในภายหลัง
  4. รวบรวมค่าการกำหนดค่า:

    • รับ Tenant ID, Client ID, และ Client Secret จากหน้าสรุปของแอปและส่วนลับ
    • คุณจะใช้ค่าพวกนี้เพื่อทำการตรวจสอบสิทธิ์และโต้ตอบกับ Microsoft Graph

เมื่อแอปพลิเคชันของคุณได้รับการกำหนดค่าแล้ว คุณพร้อมที่จะดำเนินการพัฒนา

รับ Access Token และเริ่มต้น GraphClient

ก่อนที่จะลงลึกไปในปฏิบัติการ Mailbox เราจำเป็นต้องเปิดประตูสู่ระบบนิเวศของข้อมูลและบริการที่กว้างใหญ่ของ Microsoft Graph การเข้าถึงนี้จะได้รับการอนุญาตผ่าน Access token ของ OAuth 2.0 - คีย์ดิจิตอลที่อนุญาตให้แอปพลิเคชันของคุณโต้ตอบกับ Microsoft Graph ในนามของผู้ใช้หรือบริการ นึกถึงมันเหมือนกับบัตรผ่านที่ปลอดภัยที่ให้คุณเข้าถึงจักรวาลที่เต็มไปด้วยความเป็นไปได้ ตั้งแต่การดึงอีเมลไปจนถึงการจัดการรายชื่อผู้ติดต่อและอื่น ๆ

ขั้นตอนที่ 1: ตั้งค่าไฟล์การกำหนดค่า

ขั้นตอนแรกในการรับ token คือการตั้งค่าไฟล์การกำหนดค่าที่เก็บรายละเอียดสำคัญเช่น Tenant ID, Client ID, และ Client Secret ของแอปพลิเคชันของคุณ ค่าพวกนี้คือข้อมูลรับรองของแอปพลิเคชันและทำหน้าที่เป็นตัวระบุเมื่อสื่อสารกับเซิร์ฟเวอร์ของ Microsoft

นี่คือสิ่งที่การกำหนดค่า JSON ของคุณอาจมีลักษณะดังนี้:

{
    "Instance": "https://login.microsoftonline.com/{0}",
    "ApiUrl": "https://graph.microsoft.com/.default",
    "TenantId": "YOUR_TENANT_ID_HERE",
    "ClientId": "YOUR_APP_ID_HERE",
    "ClientSecret": "YOUR_CLIENT_SECRET_HERE",
    "UserId": "YOUR_ID_HERE"
}

ขั้นตอนที่ 2: แมพ JSON การกำหนดค่าไปยังวัตถุ C#

ตอนนี้ เรามาเปลี่ยนการกำหนดค่านี้เป็นวัตถุ C# ที่แอปพลิเคชันของเราสามารถใช้ได้ เราจะอ่านไฟล์ JSON และแมพเนื้อหาของมันไปยังคลาส AuthenticationConfig เพื่อให้แน่ใจว่าแอปพลิเคชันของเรารู้ว่าต้องหาข้อมูลสำคัญที่ไหน

class AuthenticationConfig
{
    public string Instance { get; set; }
    public string ApiUrl { get; set; }
    public string TenantId { get; set; }
    public string ClientId { get; set; }
    public string UserId { get; set; }
    public string Authority => string.Format(CultureInfo.InvariantCulture, Instance, TenantId);
    public string ClientSecret { get; set; }
    
    public static AuthenticationConfig ReadFromJsonFile(string path)
    {
        var builder = new ConfigurationBuilder()
            .SetBasePath(Directory.GetCurrentDirectory())
            .AddJsonFile(path);

        var configuration = builder.Build();
        return configuration.Get<AuthenticationConfig>();
    }
}

ขั้นตอนที่ 3: รับ Access Token

ด้วยการกำหนดค่าในสถานที่ ตอนนี้ถึงเวลาที่จะรับ Access token เราจะดำเนินการสร้างคลาส GraphTokenProvider ที่จัดการกระบวนการตรวจสอบสิทธิ์โดยใช้ Microsoft Authentication Library (MSAL) คลาสนี้จะจัดการงานที่หนักหน่วง - สื่อสารกับ Microsoft Graph เพื่อรับ token ที่ทำให้แอปพลิเคชันของเราแข็งแกร่งขึ้น

class GraphTokenProvider : ITokenProvider
{
    private readonly IConfidentialClientApplication _app;
    private readonly string[] _scopes;
    private string? _token;
    
    public GraphTokenProvider(AuthenticationConfig config)
    {
        _app = ConfidentialClientApplicationBuilder.Create(config.ClientId)
            .WithClientSecret(config.ClientSecret)
            .WithAuthority(config.Authority)
            .Build();

        // ในหน่วยความจำ token caches (App และ User caches)
        _app.AddInMemoryTokenCache();
        
        _scopes = new[] { config.ApiUrl }; 
    }

    public void Dispose()
    {
        throw new NotImplementedException();
    }

    public OAuthToken GetAccessToken()
    {
        return GetAccessToken(false);
    }

    public OAuthToken GetAccessToken(bool ignoreExistingToken)
    {
        if (!ignoreExistingToken && _token != null)
        {
            return new OAuthToken(_token);
        }

        _token = GetAccessTokenAsync().GetAwaiter().GetResult();
        return new OAuthToken(_token);
    }
    
    private async Task<string?> GetAccessTokenAsync()
    {
        AuthenticationResult? result;
        
        try
        {
            result = await _app.AcquireTokenForClient(_scopes)
                .ExecuteAsync();
            
            Console.WriteLine($"Token ที่ได้รับจาก {result.AuthenticationResultMetadata.TokenSource} {Environment.NewLine}");
        }
        catch (MsalServiceException ex)
        {
            Console.WriteLine($"เกิดข้อผิดพลาดในการรับ Token:{Environment.NewLine}{ex}{Environment.NewLine}");
            result = null;
        }

        if (result == null) return null;
        _token = result.AccessToken;
        return result.AccessToken;
    }
}

ขั้นตอนที่ 4: เริ่มต้น GraphClient

สุดท้าย เราจะเริ่มต้น GraphClient โดยใช้ token ที่เราได้รับ คลาส GraphClientทำหน้าที่เป็นสะพานเชื่อมให้เราโต้ตอบกับ Microsoft Graph ได้อย่างราบรื่น

var config = AuthenticationConfig.ReadFromJsonFile("appsettings.json");
var tokenProvider = new GraphTokenProvider(config);

using var client = GraphClient.GetClient(tokenProvider, config.TenantId);
client.Resource = ResourceType.Users;
client.ResourceId = config.UserId;

รับโฟลเดอร์ Hierarchy และดึงโฟลเดอร์ตามชื่อ

เมื่อคุณได้รับการเข้าถึง Microsoft Graph แล้ว ถึงเวลาที่จะเริ่มสำรวจ Mailbox ในส่วนนี้ เราจะลงลึกไปในกระบวนการดึงและนำทางโครงสร้างโฟลเดอร์ของ Mailbox ซึ่งจะช่วยให้คุณเข้าถึงโฟลเดอร์เฉพาะตามชื่อได้

ขั้นตอนที่ 1: เข้าใจโครงสร้างโฟลเดอร์

การนำทางโครงสร้างโฟลเดอร์

Mailbox มีโครงสร้างแบบลำดับชั้น คล้ายกับต้นไม้ โฟลเดอร์รากแยกออกเป็นหลายโฟลเดอร์ย่อย แต่ละโฟลเดอร์มีชุดอีเมลของตัวเองและอาจมีโฟลเดอร์ย่อยเพิ่มเติม โครงสร้างที่ซ้อนกันนี้ช่วยให้จัดการได้อย่างเป็นระเบียบและนำทางอีเมลได้ง่าย

เรามากำหนดและใช้คลาส FolderNode เพื่อแสดงตัวแทนแต่ละโฟลเดอร์ในลำดับชั้น:

// แสดงถึงโหนดในลำดับชั้นของโฟลเดอร์
// ขยายคุณสมบัติของ FolderInfo และจัดเก็บคอลเลกชันของโฟลเดอร์ย่อย
class FolderNode
{
    // รับวัตถุ FolderInfo ที่แสดงถึงข้อมูลของโฟลเดอร์
    public FolderInfo Folder { get; }
    
    // รับคอลเลกชันของโฟลเดอร์ย่อยที่อยู่ภายในโฟลเดอร์ปัจจุบัน
    public List<FolderNode?> SubFolders { get; }

    // เริ่มต้นอินสแตนซ์ใหม่ของคลาส FolderNode ด้วยวัตถุ FolderInfo ที่ระบุ
    public FolderNode(FolderInfo folder)
    {
        Folder = folder;
        SubFolders = new List<FolderNode?>();
    }
    
    // พิมพ์โฟลเดอร์ทั้งหมดในลักษณะลำดับชั้นเริ่มต้นจากโหนดปัจจุบัน
    public void PrintHierarchy()
    {
        PrintFolderNode(this, 0);
    }

    private void PrintFolderNode(FolderNode node, int indentLevel)
    {
        // พิมพ์โหนดโฟลเดอร์ปัจจุบันด้วยการเยื้อง
        Console.WriteLine($"{new string(' ', indentLevel * 2)}{node}");

        // พิมพ์โฟลเดอร์ย่อยแบบเรียกซ้ำ
        foreach (var subFolder in node.SubFolders)
        {
            PrintFolderNode(subFolder, indentLevel + 1);
        }
    }

    // รับชื่อแสดงของโฟลเดอร์
    public override string ToString()
    {
        return $"{Folder.DisplayName} ({Folder.ContentCount})";
    }
}

ในการดึงโครงสร้างโฟลเดอร์ทั้งหมด เราจะสร้างคลาส FolderHierarchy ซึ่งใช้ GraphClient เพื่อแสดงรายการโฟลเดอร์ทั้งหมดแบบเรียกซ้ำ นี่คือวิธีการทำงาน:

static class FolderHierarchy
{
    // ดึงโฟลเดอร์ทั้งหมดใน Mailbox แบบเรียกซ้ำและส่งคืนคอลเลกชันลำดับชั้นของวัตถุ FolderNode
    public static List<FolderNode> Retrieve(IGraphClient client)
    {
        // ดึงโฟลเดอร์ราก
        var rootFolders = client.ListFolders();
        var allFolders = new List<FolderNode>();

        // ดึงโฟลเดอร์ย่อยแบบเรียกซ้ำ
        foreach (var folder in rootFolders)
        {
            var folderNode = new FolderNode(folder);
            RetrieveSubFolders(client, folderNode);
            allFolders.Add(folderNode);
        }

        return allFolders;
    }

    // ดึงโฟลเดอร์ย่อยแบบเรียกซ้ำและเพิ่มไปยัง SubFolders ของ FolderNode แม่
    private static void RetrieveSubFolders(IGraphClient client, FolderNode parentFolderNode)
    {
        if (parentFolderNode.Folder.HasSubFolders)
        {
            var subFolders = client.ListFolders(parentFolderNode.Folder.ItemId);
            
            foreach (var subFolder in subFolders)
            {
                var subFolderNode = new FolderNode(subFolder);
                RetrieveSubFolders(client, subFolderNode);
                parentFolderNode.SubFolders.Add(subFolderNode);
            }
        }
    }
}

ขั้นตอนที่ 2: ดึงโครงสร้างโฟลเดอร์

โดยใช้วิธี FolderHierarchy.Retrieve คุณสามารถเดินทางผ่าน Mailbox เพื่อค้นหาโครงสร้างโฟลเดอร์ได้อย่างง่ายดาย นี่คือวิธีที่คุณสามารถทำได้:

// ดึงโครงสร้างโฟลเดอร์จาก Mailbox
var folderNodes = FolderHierarchy.Retrieve(client);

// พิมพ์โครงสร้างโฟลเดอร์ในรูปแบบที่มีโครงสร้าง
foreach (var folderNode in folderNodes)
{
    folderNode.PrintHierarchy();
}

ขั้นตอนที่ 3: ดึงโฟลเดอร์ตามชื่อ

เมื่อคุณดึงโครงสร้างโฟลเดอร์ได้แล้ว คุณสามารถระบุโฟลเดอร์เฉพาะตามชื่อได้ ไม่ว่าคุณจะสนใจในการเข้าถึง Inbox หรือโฟลเดอร์ที่กำหนดเอง วิธีนี้จะช่วยให้คุณสามารถค้นหาได้อย่างรวดเร็ว:

// ระบุชื่อโฟลเดอร์ที่คุณกำลังมองหา
string targetFolderName = "Inbox";

// ค้นหาโฟลเดอร์เป้าหมายตามชื่อ
var targetFolder = folderNodes.FirstOrDefault(
    folderNode => folderNode.Folder.DisplayName.Equals(targetFolderName, StringComparison.OrdinalIgnoreCase))
    ?.Folder;

แสดงรายการข้อความในโฟลเดอร์ที่ระบุ

ด้วยโครงสร้างโฟลเดอร์ที่ดึงข้อมูลเรียบร้อยแล้ว ขั้นตอนถัดไปคือการเจาะลึกเข้าไปในเนื้อหาของโฟลเดอร์เฉพาะ นึกภาพว่าคุณได้เดินทางไปยัง Inbox ของคุณแล้ว ตอนนี้คุณต้องการดูข้อความทั้งหมดที่มันมีอยู่

ในส่วนนี้เราจะสำรวจวิธีการแสดงรายการข้อความภายในโฟลเดอร์เฉพาะโดยใช้ GraphClient และ Aspose.Email สำหรับ .NET

เมื่อคุณมีโฟลเดอร์แล้ว การแสดงรายการข้อความภายในจะเป็นเรื่องง่าย GraphClient มีวิธีการ ListMessages เพื่อดึงข้อความทั้งหมดในโฟลเดอร์ ซึ่งคุณสามารถประมวลผลหรือแสดงได้

นี่คือโค้ดเพื่อแสดงรายการข้อความจากโฟลเดอร์ที่ระบุ:

Console.WriteLine("แสดงรายการข้อความในโฟลเดอร์ที่ระบุ...");

// เรียกใช้วิธีของ client เพื่อแสดงรายการข้อความในโฟลเดอร์ที่เลือก
var messageInfoCollection = client.ListMessages(targetFolder.ItemId);

Console.WriteLine($"{targetFolderName}:");

// พิมพ์หัวเรื่องของข้อความ
foreach (var messageInfo in messageInfoCollection)
{
    Console.WriteLine($"     - {messageInfo.Subject}");
}

messageInfoCollection จะมีข้อมูลที่สำคัญเกี่ยวกับแต่ละอีเมล ข้อมูลนี้สามารถใช้เพื่อแสดงสรุป สร้างรายงาน หรือแม้กระทั่งกระตุ้นการแจ้งเตือนตามเกณฑ์เฉพาะ

บทสรุป

ในบทความนี้ เราได้สำรวจวิธีใช้พลังของ Microsoft Graph และ Aspose.Email สำหรับ .NET ไลบรารีในการประมวลผล Mailboxes อย่างมีประสิทธิภาพ นำทางโครงสร้างโฟลเดอร์ และแสดงรายการข้อความภายในโฟลเดอร์ที่เฉพาะเจาะจง ด้วยการทำตามขั้นตอนเหล่านี้ คุณสามารถสร้างแอปพลิเคชันที่แข็งแกร่งซึ่งมีปฏิสัมพันธ์กับข้อมูลอีเมลได้อย่างราบรื่น มอบฟังก์ชันการทำงานที่เพิ่มขึ้นและประสบการณ์ผู้ใช้ที่ดีขึ้น

แนวคิดในการปฏิบัติ

หากคุณต้องการดูแนวคิดเหล่านี้ในการปฏิบัติ คุณสามารถดาวน์โหลดตัวอย่างแอปพลิเคชันที่ใช้งานได้จริง แอปพลิเคชันนี้รวมถึงโค้ดต้นฉบับที่อธิบายไว้ในบทความนี้และแสดงวิธีการนำเสนอฟีเจอร์เหล่านี้ทีละขั้นตอน

ไปที่ GitHub repository ของเราเพื่อเข้าถึงแอปพลิเคชันตัวอย่าง: Aspose.Email สำหรับ .NET - ตัวอย่าง GraphApp

การประมวลผล Mailboxes ผ่าน Microsoft Graph มอบการเข้าถึงข้อมูลอีเมลและความสามารถในการจัดการที่ไม่มีใครเทียบได้ ด้วยเครื่องมือและเทคนิคที่ถูกต้อง คุณสามารถสร้างแอปพลิเคชันที่ซับซ้อนซึ่งให้ข้อมูลเชิงลึกที่มีความหมายและทำให้กระบวนการที่ซับซ้อนอัตโนมัติ ในที่สุดจะช่วยเพิ่มประสิทธิภาพและความพึงพอใจของผู้ใช้

ลองใช้งานฟรี

นอกจากนี้ Aspose.Email ยังมี เอกสาร ที่ครอบคลุม, API reference ที่กว้างขวาง และเครื่องมือออนไลน์ฟรีและ แอป ที่หลากหลายเพื่อปรับปรุงกระบวนการพัฒนาของคุณ นักพัฒนายังสามารถเข้าถึง ฟอรัมสนับสนุนฟรี สำหรับความช่วยเหลือและข้อมูลเชิงลึกจากชุมชน และติดตามเคล็ดลับและบทแนะนำล่าสุดผ่าน บล็อกของ Aspose

ดูเพิ่มเติม