Microsoft Graph ile Microsoft 365 Veri Erişimi ve Yönetimi

Aspose.Email Graph Client ile Microsoft 365 Veri Erişimini ve Yönetimini Optimize Edin

Microsoft Graph Microsoft 365 verilerine erişmek için bir REST API’dir. Aspose.Email for .NET’teki Graph Client uygulaması, API’miz üzerinden Microsoft Graph’e erişimi sağlar. Aşağıdaki örneklerde, belirteci sağlayarak bir MS Graph Client örneği oluşturacağız. Ardından, klasörleri yönetmek, güncellemek, kopyalamak ve silmek için ana yöntemleri inceleyeceğiz. Mesajlar, içerikleri ve ekleri de MS Graph Client’ımızla erişilebilir veya değiştirilebilir. Kategorileri, kuralları, not defterlerini ve geçersiz kılmaları yönetmek, Aspose.Email tarafından sunulan Microsoft Graph Client’ın genişletilmiş bir özelliğidir.

.NET içinde MSAL kullanarak IGraphClient ile Kimlik Doğrulama ve İstek

Microsoft Graph hizmetleriyle etkileşim kurmak için bir IGraphClient nesnesi. Kimlik doğrulandıktan sonra bu istemci, çeşitli hizmet istekleri yapmanıza olanak tanır. GetClient metod, bu da IGraphClient, bir ITokenProvider uygulamasını ilk parametre olarak. Bu ITokenProvider gerekli kimlik doğrulama belirtecini sağlamaktan sorumludur. Belirteci elde etmek için, şunu kullanacağız Microsoft Kimlik Doğrulama Kütüphanesi (MSAL) .NET için.

Kimlik doğrulama sürecini nasıl kuracağınız aşağıdadır:

Adım 1: Kimlik Doğrulamayı Ayarlama

Aşağıdaki adımlar, bir yetkilendirme belirteci almanın nasıl yapılacağını gösterecek:

  1. AccessParameters Sınıfını Oluşturun.

    Kimlik bilgilerinizi saklamak için bir AccessParameters sınıfı tanımlayı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";
}
  1. Şunu ekleyin MSAL.NET Paketi**.

    Şunu kurun Microsoft.Identity.Client Kimlik doğrulama için gerekli MSAL.NET ikili dosyalarını içeren NuGet paketi.

  2. ITokenProvider Arayüzünü Uygulayın.

    Bir oluştur GraphTokenProvider arayüzü uygulayan sınıf ITokenProvider arayüz. Bu sınıf, bir erişim belirteci almak için MSAL.NET kütüphanesini kullanacaktır.

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

Adım 2: ITokenProvider Örneği Oluştur

Tanımlamadan sonra GraphTokenProvider sınıfı, bir örnek oluşturabilirsiniz AccessParameters ve bunu şunu örneklemek için kullanın 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);

Adım 3: IGraphClient ile İstekler Yap

Son olarak, şunu kullanın GraphTokenProvider kimlik doğrulamalı bir şey oluşturmak için IGraphClient ve hizmet istekleri yapmaya başlayabilirsiniz.

using var client = GraphClient.GetClient(tokenProvider, accessParams.TenantId);

client.Resource = ResourceType.Users;
client.ResourceId = accessParams.UserId;

Bu adımlar tamamlandığında, sizin IGraphClient şimdi kimlik doğrulamalı isteklerle Microsoft Graph hizmetleriyle etkileşime hazır.

GCC High Uç Noktalarına Bağlanma

Bu GraphClient şunu kullanarak GCC High uç noktalarına bağlanmayı destekler EndPoint özelliği. Aşağıdaki kod örneği, klasörleri listelemek ve mesajları almak için GraphClient’ı GCC High uç noktasına bağlamak üzere nasıl yapılandıracağınızı gösterir.

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 ile Klasörleri Yönet

Klasörleri Listele

Çağırarak ListFolders MS Graph Client’tan yöntem, klasör listesini almayı mümkün kılar. Her klasör, DisplayName gibi bir dizi parametreye sahiptir ve bu değerler şu şekilde okunabilir: FolderInfo tip.

var folders = client.ListFolders();

foreach (var folder in folders)
{
    Console.WriteLine(folder.DisplayName);
}

Klasörleri Güncelle

MS Graph Client ile klasör oluşturmak için şunu kullanın CreateFolder yöntem. Bir FolderInfo nesne ve DisplayName, ItemId, HasSubFolders ve diğer özelliklere erişim imkanı.

var folderInfo = client.CreateFolder("FolderName");
folderInfo.DisplayName = "FolderAnotherName";
client.UpdateFolder(folderInfo);

Klasörleri Kopyala

CopyFolder yöntem, MS Graph ile klasör nesnesini kopyalamak için temel yöntemdir.

var folderInfo1 = client.CreateFolder("Folder1");
var folderInfo2 = client.CreateFolder("Folder2");
    
// copy Folder2 to Folder1
client.CopyFolder(folderInfo1.ItemId, folderInfo2.ItemId);

Klasörleri Taşı ve Sil

Kullan MoveFolder yöntem, klasörü taşımak için kullanılır, newParentId ve itemId parametrelerini kabul eder. Delete yöntem, kimliğiyle bir yöntemi silmek için kullanılır.

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 ile Mesajları Yönet

Aspose.Email for .NET’te uygulanan MS Graph Client, mesajları ve ekleri yönetmek için bir dizi yöntem sunar:

Mesajları Listele

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

Gönderim Tarihine Göre Mesajları Filtrele

Bu OrderBy Kütüphane koleksiyonundaki yöntem, gönderim tarihine göre farklı sıralama düzenleri (artan ve azalan) ile mesajları almanıza olanak tanır. Aşağıdaki kod örneği, mesajları gönderim tarihine göre nasıl sıralayacağınızı gösterir:

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;

Sayfalama Desteğiyle Mesajları Listele

API, mesajları listelerken sayfalama ve filtreleme yapmayı sağlar. Bu, çok sayıda mesaj içeren posta kutuları için özellikle yararlıdır, çünkü yalnızca gerekli özet bilgileri alarak zaman tasarrufu sağlar.

Aşağıdaki kod örneği ve adımlar, sayfalama ve filtreleme özelliklerini kullanarak Inbox klasöründen mesajların nasıl alınacağını gösterir.

  1. İlk olarak, istemciyi başlatın.
  2. Ardından, sayfa başına gösterilecek öğe sayısını ayarlayın, örneğin 10.
  3. Yalnızca okunmamış mesajları almak için bir filtre oluşturun GraphQueryBuilder sınıfı. builder.IsRead.Equals(false) okunmamış mesajları filtreleme koşulunu ayarlamaktadır.
  4. Şuğu çağırın ListMessages İstemci nesnesindeki yöntem, klasörü (Inbox) ve sayfa başına öğe sayısını (PageInfo(itemsPerPage)) parametre olarak belirtir. Ayrıca okunmamış mesajları filtrelemek için sorgu nesnesini geçirir. Döndürülen PageInfo nesnesi (pageInfo), Items özelliğinde geçerli sayfa için alınan mesajları içerir.
  5. Son sayfaya ulaşılana kadar (pageInfo.LastPage false) döngü oluşturun. Alınan mesajlar, messages.AddRange(pageInfo.Items) kullanılarak mevcut mesajlar listesine eklenir.
//  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);
}

Mesajları Al

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

Mesajları Oluştur

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

Mesajları Gönder

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

Taslak Mesajları Gönder

// 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 Mesajlarını Gönder

MailMessage nesnesi kullanarak e-posta oluşturmak ve göndermek kolaydır. Aşağıdaki kod örneği, Graph API kullanarak bir e-posta mesajı nasıl oluşturup gönderileceğini gösterir:

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

Mesajları Kopyala


// copy message to Inbox folder
var copiedMsg = client.CopyMessage(KnownFolders.Inbox, msg.ItemId);

Mesajları Taşı

// move message to Inbox folder
var movedMsg = client.MoveMessage(KnownFolders.Inbox, msg.ItemId);

Ekleri Yönet


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

Graph İstemcisi ile Outlook Öğelerini Yönet

Takvim Etkinliklerini Yönet

Aspose.Email, takvim etkinliklerine erişmek, yönetmek ve onlarla etkileşimde bulunmak için API’ler sağlar. Bu amaçlar için şu yöntemleri sunar: IGraphClient arayüz:

  • ListCalendars() - Takvim bilgileri koleksiyonunu alır.
  • ListCalendarItems(string id) - Belirtilen takvim kimliğiyle ilişkili takvim öğeleri koleksiyonunu alır.
  • FetchCalendarItem(string id) - Sağlanan kimliğe göre belirli bir takvim öğesini alır.
  • CreateCalendarItem(string calId, MapiCalendar mapiCalendar) - Belirtilen takvimde yeni bir takvim öğesi oluşturur.
  • UpdateCalendarItem(MapiCalendar mapiCalendar) - Mevcut bir takvim öğesini günceller.
  • UpdateCalendarItem(MapiCalendar mapiCalendar, UpdateSettings updateSettings) - Belirtilen güncelleme ayarlarıyla mevcut bir takvim öğesini günceller.

Aşağıdaki kod örneği, Aspose.Email tarafından sağlanan yöntemleri kullanarak bir Microsoft Graph API istemcisinde takvim etkinlikleriyle nasıl etkileşim kurulacağını gösterir:


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

Kategorileri Yönet

Aspose.Email for .NET ile MS Graph kullanarak kategorileri yönetmek için aşağıdaki yöntemleri kullanın:

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

Kişileri Yönet

Aspose.Email, iletişim öğelerine erişmek, yönetmek ve onlarla etkileşimde bulunmak için API’ler sağlar. Bu amaçlar için aşağıdaki yöntemleri sunar: IGraphClient arayüz:

  • ListContacts(string id) - Belirtilen klasör kimliğiyle ilişkili MAPI kişileri koleksiyonunu alır.
  • FetchContact(string id) - Sağlanan öğe kimliğine göre belirli bir kişiyi alır.
  • CreateContact(string folderId, MapiContact contact) - Belirtilen klasörde yeni bir kişi oluşturur.
  • UpdateContact(MapiContact contact) - Mevcut bir kişiyi günceller.

Aşağıdaki kod örneği, Aspose.Email tarafından sağlanan yöntemleri kullanarak bir Microsoft Graph API istemcisinde kişilerle nasıl etkileşim kurulacağını gösterir:

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

Geçersiz Kılmaları Yönet

Aspose.Email for .NET ile MS Graph kullanarak geçersiz kılmaları yönetmek için aşağıdaki yöntemleri kullanın:

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

Kuralları Yönet

Aspose.Email for .NET ile MS Graph kullanarak kuralları yönetmek için aşağıdaki yöntemleri kullanın:

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

Not Defterlerini Yönet

Aspose.Email for .NET ile MS Graph kullanarak not defterlerini yönetmek için aşağıdaki yöntemleri kullanın:

// 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’te Görev Yönetimi

Aspose.Email, geliştiricilere kullanıcıların görevlerine ve görev listelerine erişmek, yönetmek ve etkileşimde bulunmak için aşağıdaki metodları sağlayan API’ler sunar IGraphClient arayüz:

Aşağıdaki kod örneği, görev listelerini nasıl yöneteceğinizi gösterir:

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

Aşağıdaki kod örneği, görevleri nasıl yöneteceğinizi gösterir:

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