Microsoft Graph를 이용한 Microsoft 365 데이터 접근 및 관리

Aspose.Email Graph Client로 Microsoft 365 데이터 접근 및 관리 최적화

Microsoft Graph Microsoft 365 데이터를 액세스하기 위한 REST API입니다. Aspose.Email for .NET의 Graph Client 구현을 통해 우리의 API에서 Microsoft Graph에 접근할 수 있습니다. 아래 예제에서는 토큰을 제공하여 MS Graph Client 인스턴스를 생성합니다. 그런 다음 폴더를 관리하고 업데이트, 복사, 삭제하는 주요 메서드를 살펴봅니다. 메시지와 그 내용 및 첨부 파일도 MS Graph Client를 사용해 액세스하거나 변경할 수 있습니다. 카테고리, 규칙, 노트북 및 오버라이드를 관리하는 기능은 Aspose.Email이 제공하는 Microsoft Graph Client의 확장 기능입니다.

MSAL을 사용하여 .NET에서 IGraphClient 인증 및 요청

Microsoft Graph 서비스와 상호 작용하려면, 를 생성해야 합니다. IGraphClient 객체. 인증이 완료되면 이 클라이언트를 사용하여 다양한 서비스 요청을 할 수 있습니다. 해당 GetClient 메서드는, 를 생성합니다 IGraphClient, 필요합니다 ITokenProvider 구현을 첫 번째 매개변수로 사용합니다. 이 ITokenProvider 필요한 인증 토큰을 제공하는 역할을 합니다. 토큰을 얻기 위해 우리는 Microsoft 인증 라이브러리 (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 속성. 다음 코드 샘플은 폴더 목록을 조회하고 메시지를 검색하기 위해 GCC High 엔드포인트에 연결하도록 GraphClient를 구성하는 방법을 보여줍니다.

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를 사용한 폴더 관리

폴더 목록

호출함으로써 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를 사용한 메시지 관리

.NET용 Aspose.Email에 구현된 MS Graph Client는 메시지와 첨부 파일을 관리하기 위한 다양한 메서드를 제공합니다:

메시지 목록

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

Graph 클라이언트를 이용한 Outlook 항목 관리

캘린더 이벤트 관리

Aspose.Email는 캘린더 이벤트에 접근, 관리 및 상호 작용하기 위한 API를 제공합니다. 이를 위해 다음 메서드를 제공합니다: IGraphClient 인터페이스:

  • ListCalendars() - 캘린더 정보 컬렉션을 검색합니다.
  • ListCalendarItems(string id) - 지정된 캘린더 ID와 연결된 캘린더 항목 컬렉션을 검색합니다.
  • FetchCalendarItem(string id) - 제공된 ID를 기반으로 특정 캘린더 항목을 검색합니다.
  • CreateCalendarItem(string calId, MapiCalendar mapiCalendar) - 지정된 캘린더에 새 캘린더 항목을 생성합니다.
  • UpdateCalendarItem(MapiCalendar mapiCalendar) - 기존 캘린더 항목을 업데이트합니다.
  • UpdateCalendarItem(MapiCalendar mapiCalendar, UpdateSettings updateSettings) - 지정된 업데이트 설정으로 기존 캘린더 항목을 업데이트합니다.

다음 코드 샘플은 Aspose.Email에서 제공하는 메서드를 사용하여 Microsoft Graph API 클라이언트에서 캘린더 이벤트와 상호 작용하는 방법을 보여줍니다:


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

카테고리 관리

.NET용 Aspose.Email의 MS Graph를 사용하여 카테고리를 관리하려면 다음 메서드를 사용하십시오:

// 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) - 지정된 폴더 ID와 연결된 MAPI 연락처 컬렉션을 검색합니다.
  • FetchContact(string id) - 제공된 항목 ID를 기반으로 특정 연락처를 검색합니다.
  • CreateContact(string folderId, MapiContact contact) - 지정된 폴더에 새 연락처를 생성합니다.
  • UpdateContact(MapiContact contact) - 기존 연락처를 업데이트합니다.

다음 코드 샘플은 Aspose.Email에서 제공하는 메서드를 사용하여 Microsoft Graph API 클라이언트에서 연락처와 상호 작용하는 방법을 보여줍니다:

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

오버라이드 관리

.NET용 Aspose.Email의 MS Graph를 사용하여 오버라이드를 관리하려면 다음 메서드를 사용하십시오:

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

규칙 관리

.NET용 Aspose.Email의 MS Graph를 사용하여 규칙을 관리하려면 다음 메서드를 사용하십시오:

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

노트북 관리

.NET용 Aspose.Email의 MS Graph를 사용하여 노트북을 관리하려면 다음 메서드를 사용하십시오:

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