Truy cập và Quản lý Dữ liệu Microsoft 365 với Microsoft Graph
Tối ưu hóa truy cập và quản lý dữ liệu Microsoft 365 với Aspose.Email Graph Client
Microsoft Graph là một API REST để truy cập dữ liệu Microsoft 365. Việc triển khai Graph Client trong Aspose.Email cho .NET cho phép truy cập Microsoft Graph từ API của chúng tôi. Trong các ví dụ dưới đây, chúng ta sẽ tạo một thể hiện của MS Graph Client, cung cấp token. Sau đó, chúng ta sẽ xem xét các phương pháp chính để quản lý thư mục, cập nhật, sao chép và xóa chúng. Tin nhắn, nội dung và tệp đính kèm cũng có thể được truy cập hoặc thay đổi bằng MS Graph Client của chúng tôi. Quản lý danh mục, quy tắc, sổ ghi chú và ghi đè là tính năng mở rộng của Microsoft Graph Client bởi Aspose.Email.
Xác thực và Yêu cầu với IGraphClient bằng MSAL trong .NET
Để tương tác với các dịch vụ Microsoft Graph, bạn cần tạo một IGraphClient đối tượng. Khi đã xác thực, client này cho phép bạn thực hiện nhiều yêu cầu dịch vụ. The GetClient phương thức, tạo ra IGraphClient, yêu cầu một ITokenProvider cài đặt làm tham số đầu tiên. Điều này ITokenProvider chịu trách nhiệm cung cấp token xác thực cần thiết. Để lấy token, chúng ta sẽ sử dụng Thư viện Xác thực Microsoft (MSAL) cho .NET.
Đây là cách thiết lập quá trình xác thực:
Bước 1: Thiết lập xác thực
Các bước sau sẽ hướng dẫn bạn cách lấy token ủy quyền:
-
Tạo lớp AccessParameters.
Định nghĩa lớp AccessParameters để lưu trữ thông tin xác thực của bạn.
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";
}
-
Thêm Gói MSAL.NET**.
Cài đặt
Microsoft.Identity.ClientGói NuGet, chứa các binary MSAL.NET cần thiết cho xác thực. -
Triển khai giao diện ITokenProvider.
Tạo một
GraphTokenProviderlớp thực hiện ITokenProvider giao diện. Lớp này sẽ sử dụng thư viện MSAL.NET để lấy token truy cập.
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;
}
Bước 2: Tạo một Thể hiện ITokenProvider
Sau khi định nghĩa GraphTokenProvider lớp, bạn có thể tạo một thể hiện của AccessParameters và dùng nó để khởi tạo 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);
Bước 3: Thực hiện Yêu cầu với IGraphClient
Cuối cùng, sử dụng GraphTokenProvider để tạo một xác thực IGraphClient và bắt đầu thực hiện các yêu cầu dịch vụ.
using var client = GraphClient.GetClient(tokenProvider, accessParams.TenantId);
client.Resource = ResourceType.Users;
client.ResourceId = accessParams.UserId;
Với các bước này đã hoàn thành, của bạn IGraphClient đã sẵn sàng tương tác với các dịch vụ Microsoft Graph bằng các yêu cầu đã xác thực.
Kết nối tới các Endpoint GCC High
Cái GraphClient hỗ trợ kết nối tới các endpoint GCC High bằng cách sử dụng EndPoint thuộc tính. Mẫu mã sau đây trình bày cách cấu hình GraphClient để kết nối tới endpoint GCC High để liệt kê thư mục và lấy tin nhắn.
client.EndPoint = "https://graph.microsoft.us";
var folders = client.ListFolders();
string folderId = folders.Find(x => x.DisplayName == "Inbox").ItemId;
var msgs = client.ListMessages(folderId);
Quản lý Thư mục với IGraphClient
Liệt kê thư mục
Bằng cách gọi ListFolders phương thức từ MS Graph Client, có thể lấy danh sách các thư mục. Mỗi thư mục có một tập các tham số như DisplayName, có thể đọc trong FolderInfo kiểu.
var folders = client.ListFolders();
foreach (var folder in folders)
{
Console.WriteLine(folder.DisplayName);
}
Cập nhật Thư mục
Để tạo thư mục với MS Graph Client, sử dụng CreateFolder phương thức. Bạn sẽ nhận được một FolderInfo đối tượng và khả năng truy cập DisplayName, ItemId, HasSubFolders và các thuộc tính khác.
var folderInfo = client.CreateFolder("FolderName");
folderInfo.DisplayName = "FolderAnotherName";
client.UpdateFolder(folderInfo);
Sao chép Thư mục
CopyFolder phương thức này là phương thức chính để sao chép đối tượng thư mục với MS Graph.
var folderInfo1 = client.CreateFolder("Folder1");
var folderInfo2 = client.CreateFolder("Folder2");
// copy Folder2 to Folder1
client.CopyFolder(folderInfo1.ItemId, folderInfo2.ItemId);
Di chuyển và Xóa Thư mục
Sử dụng MoveFolder phương thức này được dùng để di chuyển thư mục, nó chấp nhận newParentId và itemId. Xóa phương thức này được dùng để xóa một phương thức theo id.
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)
Quản lý Tin nhắn với IGraphClient
MS Graph Client, được triển khai trong Aspose.Email cho .NET, cung cấp một tập hợp các phương thức để quản lý tin nhắn và tệp đính kèm:
- List messages
- Fetch message
- Create message
- Gửi message
- CopyMessage message
- Move message
- CreateAttachment
- FetchAttachment
- DeleteAttachment
- ListAttachments
Liệt kê Tin nhắn
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);
}
}
}
Lọc Tin nhắn theo Ngày Gửi
Cái OrderBy phương thức từ bộ sưu tập thư viện cho phép bạn lấy tin nhắn với các thứ tự sắp xếp khác nhau (tăng dần và giảm dần) dựa trên ngày gửi. Mẫu mã sau đây cho thấy cách sắp xếp tin nhắn theo ngày gửi của chúng:
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;
Liệt kê Tin nhắn với Hỗ trợ Phân trang
API cho phép phân trang và lọc các tin nhắn khi liệt kê chúng. Điều này đặc biệt hữu ích cho các hộp thư có số lượng tin nhắn lớn, vì nó tiết kiệm thời gian bằng cách chỉ lấy thông tin tóm tắt cần thiết.
Mẫu mã và các bước dưới đây trình bày cách lấy tin nhắn từ thư mục Inbox bằng tính năng phân trang và lọc.
- Đầu tiên, khởi tạo client.
- Sau đó, đặt số lượng mục hiển thị mỗi trang, ví dụ, 10.
- Tạo bộ lọc để chỉ lấy các tin nhắn chưa đọc bằng cách sử dụng GraphQueryBuilder lớp. builder.IsRead.Equals(false) đang đặt điều kiện để lọc các tin nhắn chưa đọc.
- Gọi ListMessages phương thức trên đối tượng client, chỉ định thư mục (Inbox) và số mục mỗi trang (PageInfo(itemsPerPage)) làm tham số. Nó cũng truyền đối tượng query để áp dụng bộ lọc tin nhắn chưa đọc. Đối tượng PageInfo trả về (pageInfo) chứa các tin nhắn đã lấy cho trang hiện tại trong thuộc tính Items.
- Tạo một vòng lặp tiếp tục cho đến khi trang cuối cùng được đạt (pageInfo.LastPage là false). Các tin nhắn đã lấy được thêm vào danh sách tin nhắn hiện có bằng cách dùng 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);
}
Lấy Tin nhắn
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);
}
}
}
Tạo Tin nhắn
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);
Gửi Tin nhắn
// 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);
Gửi Tin nhắn Nháp
// 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);
Gửi Tin nhắn EML
Tạo và gửi email rất dễ dàng khi sử dụng đối tượng MailMessage. Mẫu mã sau đây trình bày cách tạo và gửi một tin nhắn email bằng 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);
Sao chép Tin nhắn
// copy message to Inbox folder
var copiedMsg = client.CopyMessage(KnownFolders.Inbox, msg.ItemId);
Di chuyển Tin nhắn
// move message to Inbox folder
var movedMsg = client.MoveMessage(KnownFolders.Inbox, msg.ItemId);
Quản lý Đính kèm
// 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);
Quản lý Mục Outlook với Graph Client
Quản lý Sự kiện Lịch
Aspose.Email cung cấp các API để truy cập, quản lý và tương tác với các sự kiện lịch. Vì mục đích này, nó cung cấp các phương thức sau trong IGraphClient giao diện:
- ListCalendars() - Lấy một tập hợp thông tin lịch.
- ListCalendarItems(string id) - Lấy một tập hợp các mục lịch liên quan tới ID lịch được chỉ định.
- FetchCalendarItem(string id) - Lấy một mục lịch cụ thể dựa trên ID đã cung cấp.
- CreateCalendarItem(string calId, MapiCalendar mapiCalendar) - Tạo một mục lịch mới trong lịch được chỉ định.
- UpdateCalendarItem(MapiCalendar mapiCalendar) - Cập nhật một mục lịch hiện có.
- UpdateCalendarItem(MapiCalendar mapiCalendar, UpdateSettings updateSettings) - Cập nhật một mục lịch hiện có với các cài đặt cập nhật đã chỉ định.
Mẫu mã sau đây trình bày cách tương tác với các sự kiện lịch trong một client Microsoft Graph API bằng cách sử dụng các phương thức do Aspose.Email cung cấp:
// 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);
Quản lý Danh mục
Để quản lý danh mục với MS Graph bởi Aspose.Email cho .NET, sử dụng các phương thức sau:
// 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);
Quản lý Danh bạ
Aspose.Email cung cấp các API để truy cập, quản lý và tương tác với các mục danh bạ. Vì mục đích này, nó cung cấp các phương thức sau trong IGraphClient giao diện:
- ListContacts(string id) - Lấy một tập hợp các danh bạ MAPI liên quan tới ID thư mục được chỉ định.
- FetchContact(string id) - Lấy một danh bạ cụ thể dựa trên ID mục đã cung cấp.
- CreateContact(string folderId, MapiContact contact) - Tạo một danh bạ mới trong thư mục được chỉ định.
- UpdateContact(MapiContact contact) - Cập nhật một danh bạ hiện có.
Mẫu mã sau đây trình bày cách tương tác với danh bạ trong một client Microsoft Graph API bằng cách sử dụng các phương thức do Aspose.Email cung cấp:
// 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);
Quản lý Ghi đè
Để quản lý ghi đè với MS Graph bởi Aspose.Email cho .NET, sử dụng các phương thức sau:
// 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);
Quản lý Quy tắc
Để quản lý quy tắc với MS Graph bởi Aspose.Email cho .NET, sử dụng các phương thức sau:
// 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;
}
Quản lý Sổ ghi chú
Để quản lý sổ ghi chú với MS Graph bởi Aspose.Email cho .NET, sử dụng các phương thức sau:
// 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();
Quản lý Nhiệm vụ trong Microsoft Graph
Aspose.Email cung cấp cho các nhà phát triển API để truy cập, quản lý và tương tác với các tác vụ và danh sách tác vụ của người dùng bằng các phương thức sau của IGraphClient giao diện:
- ListTaskLists() - Lấy một bộ sưu tập thông tin danh sách nhiệm vụ.
- GetTaskList(string id) - Lấy một danh sách nhiệm vụ cụ thể dựa trên ID được cung cấp.
- DeleteTaskList(string id) - Xóa danh sách tác vụ đã chỉ định. -ListTasks(string id) - Lấy một tập hợp các nhiệm vụ liên quan đến ID danh sách nhiệm vụ được chỉ định.
- FetchTask(string id) - Lấy một nhiệm vụ cụ thể dựa trên ID được cung cấp.
- CreateTask(MapiTask task, string taskListUri) - Tạo một nhiệm vụ mới trong danh sách nhiệm vụ được chỉ định.
- UpdateTask(MapiTask task) - Cập nhật một nhiệm vụ hiện có với thông tin được cung cấp.
- UpdateTask(MapiTask task, UpdateSettings updateSettings) - Cập nhật một nhiệm vụ hiện có với các cài đặt cập nhật được chỉ định.
Đoạn mã mẫu sau minh họa cách quản lý danh sách tác vụ:
// 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");
Đoạn mã mẫu sau minh họa cách quản lý các tác vụ:
// 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);