مدیریت پیام‌های ایمیل و پیوست‌ها با 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. ایجاد Query Builder

  3. مرتب‌سازی پیام‌ها بر حسب تاریخ در:

  • ترتیب نزولی

    • استفاده کنید builder.SentDate.OrderBy(false) برای تنظیم ترتیب به نزولی.
    • فراخوانی کنید client.ListMessages() برای دریافت پیام‌ها از اینباکس با محدودیت ۱۰، با استفاده از پرس و جوی 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;

فهرست کردن پیام‌ها با صفحه‌بندی و فیلتر کردن

از صفحه‌بندی هنگام کار با صندوق‌های ایمیل بزرگ استفاده کنید. مثال زیر پیام‌های خوانده‌نشده را در صفحات ۱۰ تایی بازیابی می‌کند و پس از پردازش، آن‌ها را به‌عنوان خوانده‌شده نمایش می‌دهد:

  1. کلاینت را راه‌اندازی کنید.
  2. تعداد آیتم‌های نمایش داده‌شده در هر صفحه را تنظیم کنید، برای مثال، ۱۰.
  3. یک فیلتر ایجاد کنید تا فقط پیام‌های نخوانده را با استفاده از GraphQueryBuilder کلاس. builder.IsRead.Equals(false) شرط برای فیلتر کردن پیام‌های خوانده‌نشده را تنظیم می‌کند.
  4. متد را فراخوانی کنید ListMessages متد بر روی شیء کلاینت، پوشه (Inbox) و تعداد آیتم‌ها در هر صفحه (PageInfo(itemsPerPage)) را به‌عنوان پارامترها مشخص می‌کند. همچنین شیء query را برای اعمال فیلتر پیام‌های نخوانده ارسال می‌کند. شیء 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 روی هر پوشه در مجموعه پوشه‌ها تکرار کنید.
  3. درون حلقه، بررسی کنید آیا نام نمایشی پوشه برابر "Inbox" است.
  4. اگر پوشه InBox باشد، پیام‌ها را با استفاده از client.ListMessages() با ItemId پوشه.
  5. بررسی کنید آیا پیام‌هایی در اینباکس وجود دارد یا نه با تأیید اینکه مقدار inboxMessages.Count بزرگ‌تر از ۰ است.
  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);
        }
        
    }
}

پرس و جوهای Microsoft Graph با OData

Aspose.Email برای .NET پشتیبانی از پرس و جو OData را برای Microsoft Graph ارائه می‌دهد. این امکان به توسعه‌دهندگان می‌دهد تا فیلتر پیشرفته، مرتب‌سازی، انتخاب، صفحه‌بندی و گسترش را هنگام کار با منابع Graph مانند پوشه‌ها، پیام‌ها، مخاطبین، موارد تقویم و غیره اعمال کنند. Aspose.Email.Clients.Graph.ODataQueryBuilder کلاس برای ساخت پارامترهای پرس و جو OData به‌صورت ساختار یافته ساخته شده است به جای ساخت دستی رشته‌های پرس و جو. به این ترتیب، می‌توانید تنها فیلدهای لازم را بازیابی کنید (Select) برای بهینه‌سازی، از فیلتر کردن استفاده کنید (Filter) و مرتب‌سازی (OrderBy) برای سازماندهی داده‌ها. همچنین می‌توانید صفحه‌بندی را پیاده‌سازی کنید (Top, Skip) برای مجموعه داده‌های بزرگ، گسترش موجودیت‌های مرتبط (Expand) در یک درخواست، و امکان شمارش و جستجوی کامل متن را برای سناریوهای پیشرفته فعال می‌کند.

در زیر فهرست 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 روش برای ذخیره مستقیم یک پیام جدید در یک پوشه خاص، مانند InBox. مثال زیر نشان می‌دهد چگونه یک 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);

ارسال یک پیام پیش‌نویس

می‌توانید یک پیام را در پوشه پیش‌نویس‌ها ذخیره کنید و بعداً با استفاده از IGraphClient. این رویکرد به شما امکان می‌دهد یک پیام را آماده کنید، قبل از ارسال بررسی یا اصلاح کنید، و سپس هنگام آماده بودن آن را ارسال کنید. نمونه کد زیر نشان می‌دهد چگونه یک ایمیل ایجاد کنید، متادیتا اضافه کنید، آن را به‌عنوان پیش‌نویس ذخیره کنید و سپس ارسال کنید:

  1. ایجاد یک MapiMessage با موضوع، بدنه و گیرنده‌ها.
  2. جزئیات فرستنده را با استفاده از ویژگی‌های پیام تنظیم کنید.
  3. پیام را با استفاده از 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 برای .NET به شما امکان می‌دهد به‌صورت برنامه‌نویسی با پیوست‌های ایمیل کار کنید. این شامل ایجاد، بازیابی، حذف و فهرست‌گذاری پیوست‌های مرتبط با یک پیام می‌شود. نمونه کد زیر مدیریت کامل چرخه‌حیات پیوست برای پیام‌های Outlook از طریق Microsoft Graph API با استفاده از Aspose.Email را نشان می‌دهد. می‌توانید محتوای پیوست و فراداده‌های آن را بر حسب نیاز سفارشی کنید.


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