Microsoft Graph to Manage Mailboxes in C#

Microsoft Graph API와 Aspose.Email for .NET 라이브러리를 통합한 이메일 애플리케이션은 개발자들이 메일박스 데이터에 쉽게 접근하고 조작할 수 있도록 합니다. 이 기사에서는 이 강력한 조합을 활용하여 메일박스를 처리하고 관리하는 방법을 탐구합니다.

Microsoft Graph 프레젠테이션

Microsoft Graph는 Microsoft가 제공하는 포괄적인 API 플랫폼으로, Microsoft 서비스와 데이터에 접근할 수 있는 통합 엔드포인트를 제공합니다. 이는 Outlook 메일박스, 일정, 연락처, OneDrive, Teams 등 Microsoft 365에서 사용할 수 있는 방대한 데이터에 접근하는 게이트웨이 역할을 합니다.

Microsoft Graph를 사용하면 개발자들은 Microsoft 클라우드 생태계 전반에서 사용자 데이터 및 통찰과 원활하게 상호작용하는 애플리케이션을 구축할 수 있습니다. 이는 RESTful API 및 SDK를 통해 쉽게 인증, 권한 부여 및 데이터를 쿼리하는 수단을 제공합니다.

Aspose.Email for .NET 라이브러리에 대하여

Aspose.Email for .NET은 개발자가 .NET 애플리케이션에서 이메일 파일 및 프로토콜을 작업할 수 있도록 지원하는 기능이 풍부한 라이브러리입니다. 이는 MSG, EML 및 MBOX와 같은 다양한 형식으로 이메일 메시지를 생성, 조작 및 변환하기 위한 강력한 API 세트를 제공합니다. 또한, SMTP, POP3 및 IMAP과 같은 이메일 프로토콜을 지원하여 다재다능한 이메일 관리를 가능하게 합니다.

이 가이드에서는 Aspose.Email을 사용하여 Microsoft Graph와 상호작용하고 메일박스 데이터를 프로그래밍적으로 처리할 것입니다. GraphClient를 통해 Microsoft Graph와 인증하여 메일박스 작업을 효율적으로 수행할 수 있습니다.

라이브러리를 활용하려면 프로젝트에 통합해야 합니다. Aspose.Email for .NET을 얻는 가장 쉬운 방법은 NuGet 패키지 관리자를 사용하는 것입니다:

  • Visual Studio에서 프로젝트를 엽니다.
  • 도구 > NuGet 패키지 관리자 > 솔루션용 NuGet 패키지 관리로 이동합니다.
  • Aspose.Email을 검색합니다.
  • 패키지를 선택하고 설치를 클릭합니다.

또는 패키지 관리자 콘솔을 사용할 수 있습니다:

Install-Package Aspose.Email

최신 API 버전을 Aspose 웹사이트에서 직접 다운로드할 수도 있습니다.

Azure 포털에서 앱 구성하기

코드에 들어가기 전에, Microsoft Graph 접근을 활성화하기 위해 Azure 포털 내에서 애플리케이션을 구성하는 것이 중요합니다. 다음 단계에 따라 진행하세요:

  1. Azure Active Directory (AAD) 애플리케이션 생성:

    • Azure 포털로 이동합니다.
    • Azure Active Directory > 앱 등록으로 이동합니다.
    • 새 등록을 클릭하여 새 애플리케이션을 생성합니다.
    • 이름을 제공하고 필요 시 리디렉션 URI를 설정합니다.
    • 프로세스를 완료하기 위해 등록을 클릭합니다.
  2. API 권한 설정:

    • 등록된 앱에서 API 권한으로 이동합니다.
    • 권한 추가 > Microsoft Graph를 클릭합니다.
    • 서버 간 호출을 위한 응용 프로그램 권한을 선택합니다.
    • Mail.Read, Mail.ReadWrite, User.Read 등의 필요한 권한을 선택합니다.
    • 권한을 적용하기 위해 권한 추가를 클릭합니다.
  3. 클라이언트 비밀 생성:

    • 앱의 인증서 및 비밀로 이동합니다.
    • 새 클라이언트 비밀을 클릭하고 설명을 제공합니다.
    • 만료 기간을 설정한 후 추가를 클릭합니다.
    • 생성된 클라이언트 비밀 값을 기록해 두세요. 나중에 필요합니다.
  4. 구성 값 수집:

    • 앱의 개요 페이지와 비밀 섹션에서 테넌트 ID, 클라이언트 ID, 클라이언트 비밀을 얻습니다.
    • 이 값들은 Microsoft Graph와 인증하고 상호작용할 때 사용됩니다.

애플리케이션 구성이 완료되면 개발 작업을 진행할 준비가 된 것입니다.

액세스 토큰 얻기 및 GraphClient 초기화하기

메일박스 작업에 들어가기 전에, Microsoft Graph의 방대한 데이터 및 서비스 생태계에 대한 접근 권한을 확보해야 합니다. 이 접근은 OAuth 2.0 액세스 토큰을 통해 제공됩니다 - 이는 사용자가나 서비스의 대리로 Microsoft Graph와 상호작용하려는 애플리케이션을 인증하는 디지털 키입니다. 이를 통해 이메일을 가져오고, 연락처를 관리하며 다양한 가능성에 접근하는 안전한 통행증과 같습니다.

단계 1: 구성 파일 설정하기

토큰을 얻기 위한 첫 번째 단계는 애플리케이션의 테넌트 ID, 클라이언트 ID클라이언트 비밀과 같은 필수 세부 정보를 저장하는 구성 파일을 설정하는 것입니다. 이러한 값들은 애플리케이션의 인증 정보로, 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: 액세스 토큰 얻기

구성이 완료되면 액세스 토큰을 얻을 차례입니다. Microsoft Authentication Library (MSAL)를 사용하여 인증 프로세스를 처리하는 GraphTokenProvider 클래스를 구현할 것입니다. 이 클래스는 Microsoft Graph와 통신하여 애플리케이션에 권한을 부여하는 토큰을 얻는 과정을 처리합니다.

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();

        // 메모리 내 토큰 캐시 (앱 및 사용자 캐시)
        _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($"The token acquired from {result.AuthenticationResultMetadata.TokenSource} {Environment.NewLine}");
        }
        catch (MsalServiceException ex)
        {
            Console.WriteLine($"Error Acquiring Token:{Environment.NewLine}{ex}{Environment.NewLine}");
            result = null;
        }

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

단계 4: GraphClient 초기화하기

마지막으로, 획득한 토큰을 사용하여 GraphClient를 초기화합니다. 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;

폴더 계층 가져오기 및 이름으로 폴더 검색하기

Microsoft Graph에 대한 접근 권한을 얻은 후, 메일박스의 폴더를 탐색할 차례입니다. 이번 섹션에서는 메일박스의 폴더 계층을 검색하고 특정 폴더에 접근하는 방법을 다룹니다.

단계 1: 폴더 계층 이해하기

폴더 구조 탐색하기

메일박스는 나무처럼 계층적으로 구조화되어 있습니다. 루트 폴더는 여러 하위 폴더로 분기되며, 각 하위 폴더는 이메일 세트와 잠재적으로 더 많은 하위 폴더를 포함합니다. 이 중첩 구조는 이메일을 조직적으로 관리하고 쉽게 탐색할 수 있도록 합니다.

폴더 계층의 각 폴더를 나타내기 위해 FolderNode 클래스를 정의하고 사용해 보겠습니다:

// 폴더 계층의 노드를 나타내며,
// FolderInfo의 속성을 확장하고 하위 폴더 모음을 저장합니다.
class FolderNode
{
    // 현재 폴더 정보를 나타내는 FolderInfo 객체를 가져옵니다.
    public FolderInfo Folder { get; }
    
    // 현재 폴더에 포함된 하위 폴더의 컬렉션을 가져옵니다.
    public List<FolderNode?> SubFolders { get; }

    // 지정된 FolderInfo 객체로 FolderNode 클래스의 새 인스턴스를 초기화합니다.
    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
{
    // 메일박스의 모든 폴더를 재귀적으로 검색하고 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;
    }

    // 하위 폴더를 재귀적으로 검색하고 부모 FolderNode의 SubFolders 속성에 추가합니다.
    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 메서드를 사용하여 메일박스의 폴더 구조를 검색할 수 있습니다. 다음은 이를 수행하는 방법입니다:

// 메일박스에서 폴더 계층 검색
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 for .NET을 사용하여 특정 폴더 내의 메시지를 나열하는 방법을 살펴봅니다.

폴더를 확보한 후, 그 안의 메시지를 나열하는 것은 간단합니다. GraphClient는 폴더 내의 모든 메시지를 검색하는 ListMessages 메서드를 제공합니다. 이를 통해 메시지를 처리하거나 표시할 수 있습니다.

지정된 폴더의 메시지를 나열하는 코드는 다음과 같습니다:

Console.WriteLine("지정된 폴더의 메시지를 나열하는 중...");

// 선택한 폴더의 메시지를 나열하는 클라이언트 메서드를 호출합니다
var messageInfoCollection = client.ListMessages(targetFolder.ItemId);

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

// 메시지의 제목을 출력합니다
foreach (var messageInfo in messageInfoCollection)
{
    Console.WriteLine($"     - {messageInfo.Subject}");
}

messageInfoCollection은 각 이메일에 대한 필수 세부 정보를 포함합니다. 이 정보는 요약을 표시하거나, 보고서를 생성하거나, 특정 기준에 따라 알림을 트리거하는 데 사용될 수 있습니다.

결론

이번 기사에서는 Microsoft Graph와 Aspose.Email for .NET 라이브러리의 힘을 활용하여 메일박스를 효과적으로 처리하고, 폴더 계층을 탐색하며, 특정 폴더 내의 메시지를 나열하는 방법을 살펴보았습니다. 이 단계를 따르면 이메일 데이터와 원활하게 상호작용하는 강력한 애플리케이션을 구축할 수 있습니다.

실행 중인 개념

이 개념들이 실제로 어떻게 작동하는지 보고 싶다면, 작동하는 애플리케이션의 완전한 예제를 다운로드할 수 있습니다. 이 애플리케이션은 이 기사에서 설명한 소스 코드를 포함하고 있으며, 이러한 기능을 단계별로 구현하는 방법을 보여줍니다.

샘플 애플리케이션에 접근하려면 GitHub 저장소를 방문하세요: Aspose.Email for .NET - GraphApp 예제.

Microsoft Graph를 통한 메일박스 처리에서는 이메일 데이터 및 관리 기능에 대한 비할 데 없는 접근을 제공합니다. 올바른 도구와 기술을 사용하면 의미 있는 통찰을 제공하고 복잡한 작업을 자동화하는 정교한 애플리케이션을 구축할 수 있으며, 궁극적으로 생산성 및 사용자 만족도를 향상시킬 수 있습니다.

무료로 사용해 보세요

또한, Aspose.Email은 개발 프로세스를 향상시키기 위해 포괄적인 문서, 광범위한 API 참조, 다양한 무료 온라인 도구 및 을 제공합니다. 개발자는 커뮤니티 지원 및 통찰을 위한 무료 지원 포럼에도 접근할 수 있으며, Aspose 블로그를 통해 최신 팁 및 튜토리얼을 업데이트할 수 있습니다.

참고 자료