C#でメールボックスを管理するためのMicrosoft Graph

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.ReadMail.ReadWriteUser.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: アクセストークンを取得する

構成が整ったので、アクセストークンを取得する準備が整いました。GraphTokenProviderクラスを実装して、Microsoft Authentication Library (MSAL)を使って認証プロセスを処理します。このクラスが、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: 名前でフォルダを取得する

フォルダ階層を取得したら、特定の名前のフォルダを見つけることができます。受信トレイや任意のカスタムフォルダにアクセスする場合でも、このメソッドを使用すると迅速に見つけることができます:

// 探しているフォルダ名を指定
string targetFolderName = "受信トレイ";

// 名前でターゲットフォルダを取得
var targetFolder = folderNodes.FirstOrDefault(
    folderNode => folderNode.Folder.DisplayName.Equals(targetFolderName, StringComparison.OrdinalIgnoreCase))
    ?.Folder;

指定されたフォルダ内のメッセージをリスト表示する

フォルダ階層を正常に取得した後、次に特定のフォルダ内のコンテンツに飛び込みます。受信トレイに移動したと想像してみてください。今、そこにあるすべてのメッセージを表示したいと思います。

このセクションでは、特定のフォルダ内のメッセージをリスト表示する方法を探ります。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のブログを通じて最新のヒントやチュートリアルを受け取ることができます。

関連情報