Достъп и управление на данни в Microsoft 365 с Microsoft Graph

Contents
[ ]

Оптимизирайте достъпа и управлението на данни в Microsoft 365 с Aspose.Email Graph Client

Microsoft Graph е REST API за достъп до данните на 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 отговаря за предоставянето на необходимия токен за автентификация. За да получим токена, ще използваме Microsoft Authentication Library (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 клас, можете да създадете инстанция на 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

List Folders

С извикване на 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. Изтриване метод се използва за изтриване на метод по 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)

Управление на съобщения с 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 клас. builder.IsRead.Equals(false) задава условието за филтриране на непрочетени съобщения.
  4. Извикайте ListMessages метод върху клиентския обект, указващ папката (Inbox) и броя елементи на страница (PageInfo(itemsPerPage)) като параметри. Също така предава обекта за заявка, за да приложи филтър за непрочетени съобщения. Върнатият обект 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 клиент

Управление на календарни събития

Aspose.Email предлага API за достъп, управление и взаимодействие с календарни събития. За тези цели предоставя следните методи в IGraphClient интерфейс:

  • ListCalendars() – Извлича колекция от информация за календари.
  • ListCalendarItems(string id) – Извлича колекция от календарни елементи, свързани с указаното 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 контакти, свързани с указаното ID на папка.
  • 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);

Управление на override

За управление на override с 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);