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:

  1. 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";
}
  1. Lägg till MSAL.NET‑paket.

    Installera Microsoft.Identity.Client NuGet‑paket som innehåller de MSAL.NET‑binärer som behövs för autentisering.

  2. Implementera ITokenProvider‑gränssnittet.

    Skapa en GraphTokenProvider klass 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

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.

  1. Först initierar du klienten.
  2. Ställ sedan in antalet objekt som ska visas per sida, till exempel 10.
  3. 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.
  4. 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.
  5. 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:

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