Microsoft Graph でメールメッセージと添付ファイルを管理する

Aspose.Email IGraphClient Microsoft Graph を介してメール メッセージとその添付ファイルを管理するための幅広いメソッドを提供します。

利用可能な操作:

  • メッセージの一覧表示

  • メッセージのフィルタリングとページング

  • メッセージ内容の取得

  • メッセージの作成と送信(ドラフトやEMLを含む)

  • メッセージのコピーと移動

  • 添付ファイルの管理(作成、取得、削除、一覧表示)

メッセージ一覧

「受信トレイ」のようなフォルダーからメッセージを取得するには、以下を使用します ListMessages メソッド。

  1. 使用してフォルダーの一覧を取得する client.ListFolders().
  2. 各フォルダーをループ処理します。
  3. フォルダーの表示名が "Inbox" か確認します。
  4. それが受信トレイであれば、次を使用してメッセージを一覧表示します。 client.ListMessages(folder.ItemId).
  5. 受信トレイ内の各メッセージをループ処理します。
  6. 各メッセージの件名をコンソールに出力します。
var folders = client.ListFolders();

foreach (var folder in folders)
{
    if (folder.DisplayName.Equals("Inbox"))
    {
        // list messages in inbox
        var inboxMessages = client.ListMessages(folder.ItemId);

        foreach (var messageInfo in inboxMessages)
        {
            Console.WriteLine(messageInfo.Subject);
        }
    }
}

Microsoft Graph を使用した非同期メッセージ一覧

以下のコードサンプルは、受信トレイフォルダーにアクセスし、メールメッセージのページを取得する方法を示します。 ListMessagesAsync、そして件名を出力します:

var folders = await client.ListFoldersAsync();
foreach (var folder in folders)
{
    Console.WriteLine(folder.DisplayName);
}

var folderId = folders.Find(x => x.DisplayName == "Inbox").ItemId;
var msgsPage = await client.ListMessagesAsync(folderId, new PageInfo(15) { PageOffset = 0 }, null);
var msgs = msgsPage.Items;
foreach (var msg in msgs)
{
    Console.WriteLine(msg.Subject);
}

送信日付でメッセージをフィルタ

この OrderBy ライブラリコレクションのメソッドにより、送信日付に基づいて異なるソート順(昇順・降順)でメッセージを取得できます。以下のコードサンプルは、送信日付でメッセージを並べ替える方法を示しています。

  1. Graph Client を初期化する

  2. クエリビルダーを作成する

  3. メッセージを日付で並べ替える:

  • 降順

    • 使用する builder.SentDate.OrderBy(false) 順序を降順に設定します。
    • 呼び出す client.ListMessages() 受信トレイから上限 10 件のメッセージを取得するには、次のクエリを使用します。 builder.GetQuery().
    • 取得したメッセージを messages 変数に格納します。
  • 昇順

    • 呼び出しで順序を昇順に設定します。 builder.SentDate.OrderBy(true).
    • 使用する client.ListMessages() 再度受信トレイからメッセージを取得しますが、今度は昇順です。
    • これらのメッセージを messages 変数に格納します。
IGraphClient client = GraphClient.GetClient(provider, TenantId);

var builder = new GraphQueryBuilder();

// create orderby messages query 'DESC'
builder.SentDate.OrderBy(false);
var messagePageInfo = client.ListMessages(KnownFolders.Inbox, new PageInfo(10), builder.GetQuery());
var messages = messagePageInfo.Items;

builder.Clear();

// create orderby messages query 'ASC'
builder.SentDate.OrderBy(true);
messagePageInfo = client.ListMessages(KnownFolders.Inbox, new PageInfo(10), builder.GetQuery());
messages = messagePageInfo.Items;

ページングとフィルタリングによるメッセージ一覧

大規模なメールボックスを扱う際はページングを使用してください。以下の例は、未読メッセージを 10 件ずつのページで取得し、処理後に既読にマークします:

  1. クライアントを初期化します。
  2. ページあたりの表示項目数を設定します(例: 10)。
  3. 未読メッセージだけを取得するフィルタを作成します。 GraphQueryBuilder クラス。 builder.IsRead.Equals(false) 未読メッセージのフィルタ条件を設定しています。
  4. 呼び出す ListMessages クライアントオブジェクトのメソッドで、フォルダー(Inbox)とページあたりのアイテム数(PageInfo(itemsPerPage))をパラメータとして指定します。また、未読メッセージフィルタを適用するためにクエリオブジェクトも渡します。返された PageInfo オブジェクト(pageInfo)には、現在のページの取得メッセージが Items プロパティに含まれます。
  5. 最後のページに達するまで(pageInfo.LastPage が false)ループを作成します。取得したメッセージは、次を使用して既存のメッセージリストに追加されます。 messages.AddRange(pageInfo.Items).
//  reading unread messages with paging
using var client = GraphClient.GetClient(tokenProvider, config.Tenant);

// paging option
var itemsPerPage = 10;
// create unread messages filter
GraphQueryBuilder builder = new GraphQueryBuilder();
builder.IsRead.Equals(false);
var query = builder.GetQuery();

// list messages
var pageInfo = client.ListMessages(KnownFolders.Inbox, new PageInfo(itemsPerPage), query);
var  messages = pageInfo.Items;

while (!pageInfo.LastPage)
{
    pageInfo = client.ListMessages(KnownFolders.Inbox, pageInfo.NextPage, query);
    messages.AddRange(pageInfo.Items);
}

// set messages state as read
foreach (var message in messages)
{
    client.SetRead(message.ItemId);
}

メッセージを取得する

特定のメッセージの全内容を取得します。以下のコードサンプルは、受信トレイの最新メッセージを取得して表示または処理する方法を示しています:

  1. 呼び出す client.ListFolders() メールボックス内のすべての利用可能なフォルダーを取得し、folders 変数に格納します。
  2. foreach ループを使用して、folders コレクション内の各フォルダーを反復処理します。
  3. ループ内で、フォルダーの表示名が "Inbox" と等しいか確認します。
  4. フォルダーが受信トレイの場合、次を使用してメッセージを取得します。 client.ListMessages() フォルダーの ItemId を使用して。
  5. inboxMessages.Count が 0 より大きいことを確認して、受信トレイにメッセージがあるかチェックします。
  6. メッセージがある場合、最初のメッセージを次で取得します。 client.FetchMessage() 最初のメッセージの ItemId を使用して。
  7. 取得したメッセージの HTML 本文を出力します。
var folders = client.ListFolders();

foreach (var folder in folders)
{
    if (folder.DisplayName.Equals("Inbox"))
    {
        // list messages in inbox
        var inboxMessages = client.ListMessages(folder.ItemId);

        if (inboxMessages.Count > 0)
        {
            // fetch the first message in inbox
            var msg = client.FetchMessage(inboxMessages[0].ItemId);
            
            Console.WriteLine(msg.BodyHtml);
        }
        
    }
}

OData を使用した Microsoft Graph クエリ

Aspose.Email for .NET は Microsoft Graph 用の OData クエリサポート を提供します。これにより、フォルダー、メッセージ、連絡先、カレンダー項目などの Graph リソースを操作する際に、高度なフィルタリング、ソート、選択、ページング、展開を適用できます。Aspose.Email.Clients.Graph.ODataQueryBuilder クラスは、クエリ文字列を手動で構築する代わりに、構造化された方法で OData クエリ パラメータを作成するために構築されています。この方法で、必要なフィールドのみを取得できます(Select)を効率化します。フィルタリング(Filter)とソート(OrderBy)でデータを整理します。ページングも実装できます(Top, Skip)は大規模データセット向けで、関連エンティティを展開します(Expand)を1回の呼び出しで取得し、集計や全文検索を高度なシナリオ向けに有効にします。

以下は一覧です。 GraphClient オプションの ** をサポートするメソッドODataQueryBuilder** パラメータ:**

  • ListFolders
  • ListMessages
  • ListContacts
  • ListCalendarItems
  • ListAttachments
  • ListCategories
  • ListOverrides
  • ListRules
  • ListTaskLists
  • ListTasks
  • ListNotebooks

以下のコードサンプルは、** の使用方法を示します。ODataQueryBuilderフォルダーを一覧表示し、フィルタリング、ソート、ページングされたメールメッセージをメールボックスから取得する

var accessParameters = Settings.User1;

var provider = new AzureConfidentialTokenProvider(
    accessParameters.TenantId,
    accessParameters.ClientId,
    accessParameters.ClientSecret);

var client = GraphClient.GetClient(provider, accessParameters.TenantId);

client.Resource = Aspose.Email.Clients.Graph.ResourceType.Users;
client.ResourceId = accessParameters.Username;
client.EndPoint = "https://graph.microsoft.com";

// Example 1: List folders ordered by name
var builder = new ODataQueryBuilder { OrderBy = "name asc" };
var folders = client.ListFolders(builder);

foreach (var folder in folders)
{
    Console.WriteLine(folder.DisplayName);
}

// Example 2: Retrieve filtered and paged messages from Inbox
var folderId = folders.Find(x => x.DisplayName == "Inbox").ItemId;

builder = new ODataQueryBuilder
{
    Filter = "startswith(name,'A')",
    OrderBy = "name asc",
    Top = 10,
    Skip = 5,
    Select = new[] { "name", "age" },
    Expand = new[] { "children", "parents" },
    Count = true,
    Search = "\"John Doe\"",
    Format = "json"
};

var msgs = client.ListMessages(folderId, builder);

foreach (var msg in msgs)
{
    Console.WriteLine(msg.Subject);
}

メッセージ作成

使用する CreateMessage 新しいメッセージを特定のフォルダー(例:受信トレイ)に直接保存するメソッドです。以下の例は、構築方法を示します。 MapiMessage そしてそれをメールボックスに追加します。

var msg = new MapiMessage(OutlookMessageFormat.Unicode)
{
    Subject = "My message",
    Body = "Hi, it is my message"
};

msg.Recipients.Add("sam@to.com", "Sam", MapiRecipientType.MAPI_TO);

// create message in inbox
client.CreateMessage(KnownFolders.Inbox, msg);

メッセージの送信

この 送信 メソッド IGraphClient を使用してメールメッセージを直接送信できます。 MapiMessage オブジェクトです。この例では、シンプルなメッセージを作成し、送信者および受信者の詳細を設定して送信します。

// prepare the message
var msg = new MapiMessage(OutlookMessageFormat.Unicode)
{
    Subject = "My message",
    Body = "Hi, it is my message"
};

msg.Recipients.Add("sam@to.com", "Sam", MapiRecipientType.MAPI_TO);
msg.SetProperty(KnownPropertyList.SenderName, "John");
msg.SetProperty(KnownPropertyList.SentRepresentingEmailAddress, "John@from.com");

// send message
client.Send(msg);

下書きメッセージを送信する

メッセージを Drafts フォルダーに保存し、後で次を使用して送信できます。 IGraphClientこのアプローチにより、メッセージを作成し、送信前に確認または修正でき、準備ができたら送信できます。以下のコードサンプルは、メールを作成し、メタデータを追加し、下書きとして保存してから送信する方法を示しています。

  1. 作成する MapiMessage 件名、本文、受信者を設定して。
  2. メッセージプロパティで送信者情報を設定します。
  3. メッセージを Drafts フォルダーに保存するには、 CreateMessage.
  4. ドラフトの ItemId を渡して送信します。 Send() メソッド。
// prepare the message
var msg = new MapiMessage(OutlookMessageFormat.Unicode)
{
    Subject = "My message",
    Body = "Hi, it is my message"
};

msg.Recipients.Add("sam@to.com", "Sam", MapiRecipientType.MAPI_TO);
msg.SetProperty(KnownPropertyList.SenderName, "John");
msg.SetProperty(KnownPropertyList.SentRepresentingEmailAddress, "John@from.com");

// add message to Draft folder
var draftMessage = client.CreateMessage(KnownFolders.Drafts, msg);

// send a draft message
client.Send(draftMessage.ItemId);

EML メッセージを送信する

使用する MailMessage クラスを使用して EML 形式のメッセージを作成および送信します。以下のコードサンプルは、Graph API を使用してメールメッセージを作成および送信する方法を示しています。

// prepare the message
var eml = new MailMessage
{
    From = "from@domain.com",
    To = "to1@domain.com, to2@domain.com",
    Subject = "New message",
    HtmlBody = "<html><body>This is the HTML body</body></html>"
};

// send the message
graphClient.Send(eml);
graphClient.Create(KnownFolders.Inbox, eml);

メッセージのコピー

既存のメールメッセージの複製を作成するには、次を使用します。 CopyMessage メソッド( IGraphClient インターフェイス。


// copy message to Inbox folder
var copiedMsg = client.CopyMessage(KnownFolders.Inbox, msg.ItemId);

メッセージの移動

既存のメールメッセージを現在の場所から別のフォルダーへ移動するには、次を使用します。 MoveMessage メソッド( IGraphClient インターフェイス。

// move message to Inbox folder
var movedMsg = client.MoveMessage(KnownFolders.Inbox, msg.ItemId);

添付ファイルの管理

この IGraphClient Aspose.Email for .NET の機能により、メールの添付ファイルをプログラムで操作できます。これには、メッセージに関連付けられた添付ファイルの作成、取得、削除、一覧表示が含まれます。以下のコードサンプルは、Aspose.Email を使用して Microsoft Graph API 経由で Outlook メッセージの添付ファイルの全ライフサイクル管理を示しています。必要に応じて、添付ファイルの内容やメタデータをカスタマイズできます。


// create an attachment
var attachment = new MapiAttachment();
attachment.SetProperty(KnownPropertyList.DisplayName, "My Attachment");
attachment.SetProperty(KnownPropertyList.AttachDataBinary, new byte[1024]);

// add an attachment to message
var createdAttachment = client.CreateAttachment(messageInfo.ItemId, attachment);

// fetch a message attachment
var fetchedAttachment = client.FetchAttachment(createdAttachment.ItemId);

// delete a message attachment 
client.DeleteAttachment(createdAttachment.ItemId);

// list the message attachments
var attachments = client.ListAttachments(messageInfo.ItemId);