גישה וניהול נתונים ב-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: הגדרת האימות

הצעדים הבאים ידריכו אותך כיצד לקבל אסימון הרשאה:

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

שלב 2: צור מופע של ITokenProvider

לאחר שהגדרת את ה- GraphTokenProvider class, אתה יכול ליצור מופע של 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);

שלב 3: בצע בקשות עם 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. לאחר מכן, קבע את מספר הפריטים להצגה לכל דף, לדוגמה, 10.
  3. צור פילטר כדי לקבל רק הודעות שלא נקראו באמצעות ה- GraphQueryBuilder class. הביטוי builder.IsRead.Equals(false) מגדיר את התנאי לסינון הודעות שלא נקראו.
  4. הפעל את ListMessages מתודה באובייקט הלקוח, מציינת את התיקייה (Inbox) ואת מספר הפריטים לכל דף (PageInfo(itemsPerPage)) כפרמטרים. היא גם מעבירה את אובייקט השאילתה כדי להחיל פילטר של הודעות שלא נקראו. אובייקט PageInfo שהוחזר (pageInfo) מכיל את ההודעות שהתקבלו לדף הנוכחי במאפיין Items.
  5. צור לולאה שממשיכה עד שהדף האחרון מושג (pageInfo.LastPage הוא שקר). ההודעות שהתקבלו מתווספות לרשימת ההודעות הקיימת באמצעות 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 client באמצעות המתודות שמספקת 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 client באמצעות המתודות שמספקת 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);