Microsoft 365-datåtkomst och hantering med Microsoft Graph
Optimera åtkomst och hantering av Microsoft 365‑data med Aspose.Email Graph‑klient
Microsoft Graph är ett REST‑API för att komma åt Microsoft 365‑data. Implementeringen av Graph‑klienten i Aspose.Email för .NET möjliggör åtkomst till Microsoft Graph via vårt API. I exemplen nedan skapar vi en instans av MS Graph‑klienten och tillhandahåller token. Därefter granskar vi huvudmetoderna för att hantera mappar, uppdatera, kopiera och ta bort dem. Meddelanden, deras innehåll och bilagor kan också nås eller ändras med vår MS Graph‑klient. Hantering av kategorier, regler, anteckningsböcker och överstyrningar är en utökad funktion i Microsoft Graph‑klienten från Aspose.Email.
Autentisera och begär med IGraphClient med MSAL i .NET
För att interagera med Microsoft Graph‑tjänster måste du skapa en IGraphClient objekt. När du är autentiserad gör denna klient det möjligt att göra olika serviceförfrågningar. GetClient metod som skapar IGraphClient, kräver en ITokenProvider implementering som dess första parameter. Detta ITokenProvider är ansvarig för att tillhandahålla den nödvändiga autentiseringstoken. För att hämta token kommer vi att använda Microsoft Authentication Library (MSAL) för .NET.
Så här sätter du upp autentiseringsprocessen:
Steg 1: Ställa in autentisering
Följande steg guidar dig i hur du erhåller en auktoriseringstoken:
-
Skapa AccessParameters‑klassen.
Definiera en AccessParameters‑klass för att lagra dina autentiseringsuppgifter.
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";
}
-
Lägg till MSAL.NET‑paket.
Installera
Microsoft.Identity.ClientNuGet‑paket som innehåller de MSAL.NET‑binärer som behövs för autentisering. -
Implementera ITokenProvider‑gränssnittet.
Skapa en
GraphTokenProviderklass som implementerar ITokenProvider gränssnitt. Denna klass kommer att använda MSAL.NET‑biblioteket för att erhålla en access‑token.
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;
}
Steg 2: Skapa en ITokenProvider‑instans
Efter att ha definierat GraphTokenProvider klass, kan du skapa en instans av AccessParameters och använd den för att instansiera 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);
Steg 3: Gör förfrågningar med IGraphClient
Slutligen, använd GraphTokenProvider för att skapa en autentiserad IGraphClient och börja göra service‑förfrågningar.
using var client = GraphClient.GetClient(tokenProvider, accessParams.TenantId);
client.Resource = ResourceType.Users;
client.ResourceId = accessParams.UserId;
När dessa steg är slutförda, din IGraphClient är nu redo att interagera med Microsoft Graph‑tjänster med autentiserade förfrågningar.
Ansluta till GCC High‑endpointar
Den GraphClient stödjer anslutning till GCC‑High‑endpointar genom att använda EndPoint egenskap. Följande kodexempel visar hur man konfigurerar GraphClient för att ansluta till GCC‑High‑endpointen för att lista mappar och hämta meddelanden.
client.EndPoint = "https://graph.microsoft.us";
var folders = client.ListFolders();
string folderId = folders.Find(x => x.DisplayName == "Inbox").ItemId;
var msgs = client.ListMessages(folderId);
Hantera mappar med IGraphClient
Lista mappar
Genom att anropa ListFolders metod från MS Graph‑klienten, det är möjligt att hämta listan över mappar. Varje mapp har ett antal parametrar som DisplayName, som kan läsas i FolderInfo typ.
var folders = client.ListFolders();
foreach (var folder in folders)
{
Console.WriteLine(folder.DisplayName);
}
Uppdatera mappar
För att skapa en mapp med MS Graph‑klienten, använd CreateFolder metod. Du får en FolderInfo objektet och möjligheten att komma åt DisplayName, ItemId, HasSubFolders och andra egenskaper.
var folderInfo = client.CreateFolder("FolderName");
folderInfo.DisplayName = "FolderAnotherName";
client.UpdateFolder(folderInfo);
Kopiera mappar
CopyFolder metod är huvudmetoden för att kopiera mappobjektet med MS Graph.
var folderInfo1 = client.CreateFolder("Folder1");
var folderInfo2 = client.CreateFolder("Folder2");
// copy Folder2 to Folder1
client.CopyFolder(folderInfo1.ItemId, folderInfo2.ItemId);
Flytta och radera mappar
Använd MoveFolder metod används för att flytta mappen, den tar emot newParentId och itemId. Ta bort metod används för att radera en metod efter 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)
Hantera meddelanden med IGraphClient
MS Graph‑klienten, implementerad i Aspose.Email för .NET, erbjuder en uppsättning metoder för att hantera meddelanden och bilagor:
- Lista meddelanden
- Hämta meddelande
- Skapa meddelande
- Skicka meddelande
- KopieraMeddelande meddelande
- Flytta meddelande
- CreateAttachment
- FetchAttachment
- DeleteAttachment
- ListAttachments
Lista meddelanden
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);
}
}
}
Filtrera meddelanden efter skickningsdatum
Den OrderBy metod från biblioteksamlingen gör det möjligt att hämta meddelanden med olika sorteringsordrar (stigande och fallande) baserat på det datum de skickades. Följande kodexempel visar hur man sorterar meddelanden efter deras skickningsdatum:
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;
Iterera meddelanden med stöd för sidindelning
API‑et möjliggör sidindelning och filtrering av meddelanden när de listas. Det är särskilt hjälpsamt för brevlådor med stor mängd meddelanden, eftersom det sparar tid genom att bara hämta den nödvändiga sammanfattande informationen.
Kodexemplet och stegen nedan visar hur man hämtar meddelanden från inkorgsmappen med hjälp av sidindelning och filtreringsfunktioner.
- Först initierar du klienten.
- Ställ sedan in antalet objekt som ska visas per sida, till exempel 10.
- Skapa ett filter för att endast hämta olästa meddelanden med hjälp av GraphQueryBuilder klass. builder.IsRead.Equals(false) sätter villkoret för att filtrera olästa meddelanden.
- Anropa ListMessages metod på klientobjektet, där mappen (Inbox) och antalet objekt per sida (PageInfo(itemsPerPage)) specificeras som parametrar. Den skickar också med query‑objektet för att tillämpa filtrering av olästa meddelanden. Det returnerade PageInfo‑objektet (pageInfo) innehåller de hämtade meddelandena för den aktuella sidan i egenskapen Items.
- Skapa en loop som fortsätter tills sista sidan nås (pageInfo.LastPage är falskt). De hämtade meddelandena läggs till i den befintliga meddelandelistan med 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);
}
Hämta meddelanden
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);
}
}
}
Skapa meddelanden
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);
Skicka meddelanden
// 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);
Skicka utkastmeddelanden
// 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);
Skicka EML‑meddelanden
Att skapa och skicka e‑post är enkelt med MailMessage‑objektet. Följande kodexempel visar hur man skapar och skickar ett e‑postmeddelande med 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);
Kopiera meddelanden
// copy message to Inbox folder
var copiedMsg = client.CopyMessage(KnownFolders.Inbox, msg.ItemId);
Flytta meddelanden
// move message to Inbox folder
var movedMsg = client.MoveMessage(KnownFolders.Inbox, msg.ItemId);
Hantera bilagor
// 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);
Hantera Outlook‑objekt med Graph‑klient
Hantera kalenderhändelser
Aspose.Email tillhandahåller API:er för att komma åt, hantera och interagera med kalenderhändelser. För dessa ändamål erbjuder det följande metoder i IGraphClient gränssnitt:
- ListCalendars() – Hämtar en samling kalendrarinformation.
- ListCalendarItems(string id) – Hämtar en samling kalenderelement som är associerade med det angivna kalender‑ID‑t.
- FetchCalendarItem(string id) – Hämtar ett specifikt kalenderelement baserat på angivet ID.
- CreateCalendarItem(string calId, MapiCalendar mapiCalendar) – Skapar ett nytt kalenderelement i den angivna kalendern.
- UpdateCalendarItem(MapiCalendar mapiCalendar) – Uppdaterar ett befintligt kalenderelement.
- UpdateCalendarItem(MapiCalendar mapiCalendar, UpdateSettings updateSettings) – Uppdaterar ett befintligt kalenderelement med angivna uppdateringsinställningar.
Följande kodexempel visar hur man interagerar med kalenderhändelser i en Microsoft Graph API‑klient med hjälp av de metoder som tillhandahålls av 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);
Hantera kategorier
För att hantera kategorier med MS Graph via Aspose.Email för .NET, använd följande metoder:
// 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);
Hantera kontakter
Aspose.Email tillhandahåller API:er för att komma åt, hantera och interagera med kontaktposter. För dessa ändamål erbjuder det följande metoder i IGraphClient gränssnitt:
- ListContacts(string id) – Hämtar en samling MAPI‑kontakter som är associerade med det angivna mapp‑ID‑t.
- FetchContact(string id) – Hämtar en specifik kontakt baserat på angivet objekt-ID.
- CreateContact(string folderId, MapiContact contact) – Skapar en ny kontakt i den angivna mappen.
- UpdateContact(MapiContact contact) – Uppdaterar en befintlig kontakt.
Följande kodexempel visar hur man interagerar med kontakter i en Microsoft Graph API-klient med hjälp av de metoder som tillhandahålls av 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);
Hantera åsidosättningar
För att hantera åsidosättningar med MS Graph via Aspose.Email för .NET, använd följande metoder:
// 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);
Hantera regler
För att hantera regler med MS Graph via Aspose.Email för .NET, använd följande metoder:
// 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;
}
Hantera anteckningsböcker
För att hantera anteckningsböcker med MS Graph via Aspose.Email för .NET, använd följande metoder:
// 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();
Uppgiftshantering i Microsoft Graph
Aspose.Email ger utvecklare API:er för att komma åt, hantera och interagera med användares uppgifter och uppgiftslistor med hjälp av följande metoder i IGraphClient gränssnitt:
- ListTaskLists() - Hämtar en samling av uppgiftslisteinformation.
- GetTaskList(string id) - Hämtar en specifik uppgiftslista baserat på det angivna ID:t.
- DeleteTaskList(string id) - Raderar den angivna uppgiftslistan. -ListTasks(string id) - Hämtar en samling av uppgifter som är associerade med det angivna uppgiftslist‑ID‑t.
- FetchTask(string id) - Hämtar en specifik uppgift baserat på det angivna ID‑t.
- CreateTask(MapiTask task, string taskListUri) - Skapar en ny uppgift i den angivna uppgiftslistan.
- UpdateTask(MapiTask task) - Uppdaterar en befintlig uppgift med den medföljande informationen.
- UpdateTask(MapiTask task, UpdateSettings updateSettings) - Uppdaterar en befintlig uppgift med angivna uppdateringsinställningar.
Följande kodexempel visar hur du hanterar uppgiftslistor:
// 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");
Följande kodexempel visar hur du hanterar uppgifter:
// 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);