دسترسی به داده‌ها و مدیریت Microsoft 365 با Microsoft Graph

بهینه‌سازی دسترسی و مدیریت داده‌های Microsoft 365 با Aspose.Email Graph Client

Microsoft Graph یک API REST برای دسترسی به داده‌های Microsoft 365 است. پیاده‌سازی Graph Client در Aspose.Email برای .NET امکان دسترسی به Microsoft Graph از طریق API ما را فراهم می‌کند. در مثال‌های زیر، یک نمونه از MS Graph Client را ایجاد می‌کنیم و توکن را فراهم می‌سازیم. سپس، متدهای اصلی برای مدیریت پوشه‌ها، به‌روزرسانی، کپی و حذف آن‌ها را بررسی می‌کنیم. پیام‌ها، محتوای آنها و پیوست‌ها نیز می‌توانند با MS Graph Client ما دسترسی یا تغییر یابند. مدیریت دسته‌بندی‌ها، قوانین، دفترچه‌ها و بازنویسی‌ها یک ویژگی پیشرفته از Microsoft Graph Client توسط Aspose.Email است.

احراز هویت و درخواست با IGraphClient با استفاده از MSAL در .NET

برای تعامل با سرویس‌های Microsoft Graph، نیاز دارید یک IGraphClient شی. پس از احراز هویت، این کلاینت به شما اجازه می‌دهد درخواست‌های مختلف سرویس را انجام دهید. GetClient متد که IGraphClient، نیاز به یک ITokenProvider پیاده‌سازی به عنوان اولین پارامتر آن استفاده خواهیم کرد. این ITokenProvider مسئول ارائه توکن احراز هویت مورد نیاز است. برای دریافت توکن، ما از کتابخانه احراز هویت مایکروسافت (MSAL) برای .NET.

نحوه تنظیم فرآیند احراز هویت به این شکل است:

مرحله ۱: تنظیم احراز هویت

مراحل زیر به شما نشان می‌دهد چگونه یک توکن احراز هویت دریافت کنید:

  1. ایجاد کلاس AccessParameters.

    کلاس AccessParameters را تعریف کنید تا اعتبارنامه‌های خود را ذخیره کنید.

public class AccessParameters
{
    public string TenantId { get; init; }
    public string ClientId { get; init; }
    public string ClientSecret { get; init; }
    public string UserId { get; init; }
    public Uri Authority => new ($"https://login.microsoftonline.com/{TenantId}");
    public string ApiUrl => "https://graph.microsoft.com/.default";
}
  1. افزودن پکیج MSAL.NET.

    نصب کنید Microsoft.Identity.Client پکیج NuGet که شامل باینری‌های MSAL.NET مورد نیاز برای احراز هویت است.

  2. پیاده‌سازی رابط ITokenProvider.

    ایجاد یک GraphTokenProvider کلاسی که پیاده‌سازی می‌کند ITokenProvider رابط. این کلاس از کتابخانه MSAL.NET برای دریافت توکن دسترسی استفاده خواهد کرد.

using Microsoft.Identity.Client;
using Microsoft.Identity.Web;
using Aspose.Email.Clients;

public class GraphTokenProvider : ITokenProvider
{
    private readonly IConfidentialClientApplication _app;
    private readonly string[] _scopes;
    private string? _token;

    public GraphTokenProvider(AccessParameters accessParams)
    {
        _app = ConfidentialClientApplicationBuilder.Create(accessParams.ClientId)
            .WithClientSecret(accessParams.ClientSecret)
            .WithAuthority(accessParams.Authority)
            .Build();

        _app.AddInMemoryTokenCache();

        _scopes = new[] { accessParams.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 acquired");
        }
        catch (MsalServiceException ex) when (ex.Message.Contains("AADSTS70011"))
        {
            Console.WriteLine("Scope provided is not supported");
            result = null;
        }

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

مرحله ۲: ایجاد یک نمونه ITokenProvider

پس از تعریف GraphTokenProvider کلاس، می‌توانید یک نمونه از AccessParameters و از آن برای نمونه‌سازی GraphTokenProvider.

var accessParams = new AccessParameters()
{
    TenantId = "Your Tenant ID",
    ClientId = "Your Client ID",
    ClientSecret = "Your Client Secret",
    UserId = "User's Object ID"
};

var tokenProvider = new GraphTokenProvider(accessParams);

مرحله ۳: ارسال درخواست‌ها با IGraphClient

سرانجام، از GraphTokenProvider برای ایجاد یک احراز هویت شده IGraphClient و شروع به ارسال درخواست‌های سرویس کنید.

using var client = GraphClient.GetClient(tokenProvider, accessParams.TenantId);

client.Resource = ResourceType.Users;
client.ResourceId = accessParams.UserId;

با تکمیل این مراحل، IGraphClient اکنون آماده تعامل با سرویس‌های Microsoft Graph با استفاده از درخواست‌های احراز هویت شده است.

اتصال به نقطه‌پایان‌های GCC High

این GraphClient از اتصال به نقطه‌پایان‌های GCC High با استفاده از EndPoint ویژگی. نمونه کد زیر نشان می‌دهد چگونه GraphClient را برای اتصال به نقطه‌پایان GCC High به منظور فهرست کردن پوشه‌ها و بازیابی پیام‌ها پیکربندی کنید.

client.EndPoint = "https://graph.microsoft.us";

var folders = client.ListFolders();
string folderId = folders.Find(x => x.DisplayName == "Inbox").ItemId;
var msgs = client.ListMessages(folderId);

مدیریت پوشه‌ها با IGraphClient

لیست پوشه‌ها

با فراخوانی ListFolders متد از MS Graph Client، امکان دریافت لیست پوشه‌ها وجود دارد. هر پوشه مجموعه‌ای از پارامترها مانند DisplayName دارد که می‌توان در FolderInfo نوع.

var folders = client.ListFolders();

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

به‌روزرسانی پوشه‌ها

برای ایجاد پوشه با MS Graph Client، استفاده کنید CreateFolder متد. شما یک FolderInfo شیء و امکان دسترسی به DisplayName، ItemId، HasSubFolders و سایر ویژگی‌ها.

var folderInfo = client.CreateFolder("FolderName");
folderInfo.DisplayName = "FolderAnotherName";
client.UpdateFolder(folderInfo);

کپی پوشه‌ها

CopyFolder این متد کلیدی برای کپی‌کردن شیء پوشه با MS Graph است.

var folderInfo1 = client.CreateFolder("Folder1");
var folderInfo2 = client.CreateFolder("Folder2");
    
// copy Folder2 to Folder1
client.CopyFolder(folderInfo1.ItemId, folderInfo2.ItemId);

انتقال و حذف پوشه‌ها

استفاده کنید MoveFolder این متد برای جابجایی پوشه استفاده می‌شود؛ مقادیر newParentId و itemId را می‌پذیرد. حذف این متد برای حذف یک متد بر اساس شناسه استفاده می‌شود.

var folderInfo1 = client.CreateFolder("Folder1");
var folderInfo2 = client.CreateFolder("Folder2");
    
// move Folder2 to Folder1
client.MoveFolder(folderInfo1.ItemId, folderInfo2.ItemId);
    
// delete Folder1
client.Delete(folderInfo1.ItemId)

مدیریت پیام‌ها با IGraphClient

MS Graph Client که در Aspose.Email برای .NET پیاده‌سازی شده، مجموعه‌ای از متدها برای مدیریت پیام‌ها و پیوست‌ها ارائه می‌دهد:

لیست پیام‌ها

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

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

این OrderBy متد از مجموعه کتابخانه به شما امکان می‌دهد پیام‌ها را با ترتیب‌های مختلف مرتب‌سازی (صعودی و نزولی) بر اساس تاریخ ارسال بازیابی کنید. نمونه کد زیر نشان می‌دهد چگونه پیام‌ها را بر حسب تاریخ ارسال مرتب کنید:

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;

سردرگیری پیام‌ها با پشتیبانی از صفحه‌بندی

API امکان صفحه‌بندی و فیلتر کردن پیام‌ها را هنگام فهرست کردن آنها فراهم می‌کند. این ویژگی به‌ویژه برای صندوق‌های پستی با حجم بالای پیام‌ها مفید است، زیرا صرفه‌جویی در زمان با بازیابی فقط اطلاعات خلاصه مورد نیاز می‌کند.

نمونه کد و مراحل زیر نشان می‌دهند چگونه پیام‌ها را از پوشه Inbox با استفاده از ویژگی‌های صفحه‌بندی و فیلتر بازیابی کنید.

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

دریافت پیام‌ها

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

ایجاد پیام‌ها

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

ارسال پیام‌ها

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

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

// 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 آسان است. نمونه کد زیر نشان می‌دهد چگونه یک پیام ایمیل ایجاد و با استفاده از 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);

کپی پیام‌ها


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

انتقال پیام‌ها

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

مدیریت پیوست‌ها


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

مدیریت موارد Outlook با Graph Client

مدیریت رویدادهای تقویم

Aspose.Email APIهایی را برای دسترسی، مدیریت و تعامل با رویدادهای تقویم فراهم می‌کند. برای این منظور، روش‌های زیر را در IGraphClient رابط:

  • ListCalendars() - مجموعه‌ای از اطلاعات تقویم‌ها را بازیابی می‌کند.
  • ListCalendarItems(string id) - مجموعه‌ای از آیتم‌های تقویم مرتبط با شناسه تقویم مشخص‌شده را بازیابی می‌کند.
  • FetchCalendarItem(string id) - یک آیتم تقویم خاص را بر اساس شناسه ارائه‌شده بازیابی می‌کند.
  • CreateCalendarItem(string calId, MapiCalendar mapiCalendar) - یک آیتم تقویم جدید در تقویم مشخص‌شده ایجاد می‌کند.
  • UpdateCalendarItem(MapiCalendar mapiCalendar) - یک آیتم تقویم موجود را به‌روز می‌کند.
  • UpdateCalendarItem(MapiCalendar mapiCalendar, UpdateSettings updateSettings) - یک آیتم تقویم موجود را با تنظیمات به‌روزرسانی مشخص به‌روز می‌کند.

نمونه کد زیر نشان می‌دهد چگونه می‌توان با رویدادهای تقویم در یک کلاینت Microsoft Graph API با استفاده از روش‌های ارائه‌شده توسط Aspose.Email تعامل کرد:


// List Calendars
CalendarInfoCollection calendars = graphClient.ListCalendars();

// List Calendar Items
MapiCalendarCollection calendarItems = graphClient.ListCalendarItems("calendarId");

// Fetch Calendar Item
MapiCalendar calendarItem = graphClient.FetchCalendarItem("calendarItemId");

// Create Calendar Item
MapiCalendar newCalendarItem = new MapiCalendar(
    location: "Conference Room",
    summary: "Team Meeting",
    description: "Discuss project status and updates.",
    startDate: startDate,
    endDate: endDate
);

MapiCalendar createdCalendarItem = graphClient.CreateCalendarItem("calendarId", newCalendarItem);

// Update Calendar Item
createdCalendarItem.Location = "Zoom Meeting";
MapiCalendar updatedCalendarItem = graphClient.UpdateCalendarItem(createdCalendarItem);

مدیریت دسته‌بندها

برای مدیریت دسته‌بندها با MS Graph توسط Aspose.Email برای .NET، از روش‌های زیر استفاده کنید:

// create a custom category with Orange color
var category = client.CreateCategory("My custom category", CategoryPreset.Preset1);

// fetch a category
var fetchedCategory = client.FetchCategory(category.Id);

// update category (change color to brown)
fetchedCategory.Preset = CategoryPreset.Preset2;
var updatedCategory = client.UpdateCategory(fetchedCategory);

// list available categories
var categories = client.ListCategories();

foreach (var cat in categories)
{
    Console.WriteLine(cat.DisplayName);
}

// delete a category
client.Delete(fetchedCategory.Id);

مدیریت مخاطبان

Aspose.Email APIهایی را برای دسترسی، مدیریت و تعامل با آیتم‌های مخاطب فراهم می‌کند. برای این منظور، روش‌های زیر را در IGraphClient رابط:

  • ListContacts(string id) - مجموعه‌ای از مخاطبان MAPI مرتبط با شناسه پوشه مشخص‌شده را بازیابی می‌کند.
  • FetchContact(string id) - یک مخاطب خاص را بر اساس شناسه آیتم ارائه‌شده بازیابی می‌کند.
  • CreateContact(string folderId, MapiContact contact) - یک مخاطب جدید در پوشه مشخص‌شده ایجاد می‌کند.
  • UpdateContact(MapiContact contact) - یک مخاطب موجود را به‌روزرسانی می‌کند.

نمونه کد زیر نشان می‌دهد چگونه می‌توان با مخاطبان در یک کلاینت Microsoft Graph API با استفاده از روش‌های ارائه‌شده توسط Aspose.Email تعامل کرد:

// List Contacts
MapiContactCollection contacts = graphClient.ListContacts("contactFolderId");

// Fetch Contact
MapiContact contact = graphClient.FetchContact("contactId");

// Create Contact
MapiContact newContact = new MapiContact("Jane Smith", "jane.smith@example.com", "XYZ Corporation", "777-888-999");

MapiContact createdContact = graphClient.CreateContact("contactFolderId", newContact);

// Update Contact
createdContact.Telephones.PrimaryTelephoneNumber = "888-888-999";

MapiContact updatedContact = graphClient.UpdateContact(createdContact);

مدیریت نادیده‌گیری‌ها

برای مدیریت نادیده‌گیری‌ها (overrides) با MS Graph توسط Aspose.Email برای .NET، از روش‌های زیر استفاده کنید:

// Create an user's override
var userOverride = client.CreateOrUpdateOverride
    (new MailAddress("JohnBrown@someorg.com", "JohnBrown"), ClassificationType.Focused);

// list the overrides
var overrides = client.ListOverrides();

// update override
userOverride.Sender.DisplayName = "John Brown";
var updatedOverride = client.UpdateOverride(userOverride);

// delete override
client.Delete(updatedOverride.Id);

مدیریت قوانین

برای مدیریت قوانین با MS Graph توسط Aspose.Email برای .NET، از روش‌های زیر استفاده کنید:

// Create a rule
var rule = PrepareRule("user@someorg.com", "User");
var createdRule = client.CreateRule(rule);

// List all rules defined for Inbox
var rules = client.ListRules();

// Fetch a rule
var fetchedRule = client.FetchRule(createdRule.RuleId);

// Update a rule
fetchedRule.DisplayName = "Renamed rule";
fetchedRule.IsEnabled = false;
var updatedRule = client.UpdateRule(createdRule);

// Delete a rule
client.Delete(updatedRule.RuleId);
InboxRule PrepareRule(string email, string displayName)
{
    var rule = new InboxRule()
    {
        DisplayName = "My rule",
        Priority = 1,
        IsEnabled = true,
        Conditions = new RulePredicates(),
        Actions = new RuleActions()
    };

    rule.Conditions.ContainsSenderStrings = new StringCollection { displayName };
    rule.Actions.ForwardToRecipients = new MailAddressCollection
        { new MailAddress(email, displayName, true) };
    rule.Actions.StopProcessingRules = true;

    return rule;
}

مدیریت دفترچه‌ها

برای مدیریت دفترچه‌ها با MS Graph توسط Aspose.Email برای .NET، از روش‌های زیر استفاده کنید:

// create a OneNote notebook
var newNotebook = new Notebook()
{
    DisplayName = "My Notebook"
};
var createdNotebook = client.CreateNotebook(newNotebook);

// fetch a notebook
var fetchedNotebook = client.FetchNotebook(createdNotebook.Id);

// list the notebooks
var notebooks = client.ListNotebooks();

مدیریت وظایف در Microsoft Graph

Aspose.Email به توسعه‌دهندگان APIهایی برای دسترسی، مدیریت و تعامل با وظایف و فهرست‌های وظیفه کاربران ارائه می‌دهد با استفاده از متدهای زیر IGraphClient رابط:

نمونه کد زیر نشان می‌دهد چگونه فهرست‌های وظیفه را مدیریت کنید:

// List Task Lists
var taskLists = graphClient.ListTaskLists();

foreach (var tList in taskLists)
{
    Console.WriteLine($"Task List: {tList.DisplayName}");
}

// Get Task List
var taskList = graphClient.GetTaskList("taskListId");

// Delete Task List
graphClient.DeleteTaskList("taskListId");

نمونه کد زیر نشان می‌دهد چگونه وظایف را مدیریت کنید:

// List Tasks in a Task List
MapiTaskCollection tasks = graphClient.ListTasks("taskListId");

// Fetch Task
MapiTask task = graphClient.FetchTask("taskId");

// Create Task
var newTask = new MapiTask
{
    Subject = "New Task",
    DueDate = new DateTime(2023, 12, 31),
    Status = MapiTaskStatus.NotStarted
};

MapiTask createdTask = graphClient.CreateTask(newTask, "taskListUri");

// Update Task
createdTask.Subject = "Updated Task Subject";
MapiTask updatedTask = graphClient.UpdateTask(createdTask);

// Update Task with UpdateSettings
var updateSettings = new UpdateSettings { SkipAttachments  = true };
MapiTask updatedTaskWithSettings = graphClient.UpdateTask(createdTask, updateSettings);