EWS와 IMAP을 사용하여 Exchange Server에 연결하기

Exchange Web Service를 사용하여 Exchange 서버 2007, 2010 및 2013에 연결하려면 Aspose.Email이 제공합니다. IEWSClient 다음 인터페이스를 구현합니다. EWSClient 클래스. EWSClient.GetEWSClient 메서드는 다음을 인스턴스화하고 반환합니다. IEWSClient Exchange 메일함 및 기타 폴더와 관련된 작업을 수행하는 데 사용되는 객체입니다. 이 문서는 다음 객체를 인스턴스화하는 방법을 보여줍니다. IEWSClient.

EWS를 사용하여 Exchange Server에 연결

다음 코드 스니펫은 Exchange Web Service(EWS)를 사용하여 연결을 설정하는 방법을 보여줍니다.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
private static IEWSClient GetExchangeEWSClient()
{
    const string mailboxUri = "https://outlook.office365.com/ews/exchange.asmx";
    const string domain = @"";
    const string username = @"username@ASE305.onmicrosoft.com";
    const string password = @"password";
    NetworkCredential credentials = new NetworkCredential(username, password, domain);
    IEWSClient client = EWSClient.GetEWSClient(mailboxUri, credentials);
    return client;
}

EWSClient 초기화에 사용자 정의 헤더 추가

클라이언트 초기화 시 X-AnchorMailbox 헤더와 같이 특정 헤더가 필요한 경우, 인스턴스를 만들 때 다음과 같은 오버로드 메서드를 사용하여 사용자 정의 헤더를 추가합니다. IEWSClient:

  • IEWSClient GetEWSClient(string mailboxUri, ICredentials credentials, WebProxy proxy, Dictionary headers)

  • async Task GetEwsClientAsync(string mailboxUri, ICredentials credentials, WebProxy proxy, CancellationToken cancellationToken , Dictionary headers)

아래 코드 샘플은 사용자 정의 HTTP 헤더를 활용하여 IEWSClient를 구성하고 초기화하는 방법을 보여줍니다.

var headers = new Dictionary<string, string>();
headers.Add("X-AnchorMailbox", smtpExampleAddress);
IEWSClient client = EWSClient.GetEWSClient(HttpsExampleCom, new OAuthNetworkCredential("UserName", "Token"), null, headers);

IMAP을 사용하여 Exchange Server에 연결

Microsoft Exchange Server는 사서함 항목에 접근하기 위해 IMAP 프로토콜을 지원합니다. Aspose.Email을 사용하세요 ImapClient IMAP 프로토콜을 사용하여 Exchange Server에 연결하는 클래스입니다. 자세한 내용은 ImapClient 클래스. 먼저 Exchange Server에서 IMAP 서비스가 활성화되어 있는지 확인하십시오:

  1. 제어판을 엽니다.
  2. 관리자 도구로 이동한 다음 서비스로 이동합니다.
  3. Microsoft Exchange IMAP4 서비스 상태를 확인합니다.
  4. 이미 실행 중이 아니라면 활성화/시작하십시오.

다음 코드 스니펫은 IMAP 프로토콜을 사용하여 Microsoft Exchange Server의 받은 편지함 폴더에 연결하고 메시지를 나열하는 방법을 보여줍니다.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
// Connect to Exchange Server using ImapClient class
ImapClient imapClient = new ImapClient("ex07sp1", "Administrator", "Evaluation1");
imapClient.SecurityOptions = SecurityOptions.Auto;

// Select the Inbox folder
imapClient.SelectFolder(ImapFolderInfo.InBox);

// Get the list of messages
ImapMessageInfoCollection msgCollection = imapClient.ListMessages();
foreach (ImapMessageInfo msgInfo in msgCollection)
{
    Console.WriteLine(msgInfo.Subject);
}
// Disconnect from the server
imapClient.Dispose();

다음 코드 스니펫은 SSL을 사용하는 방법을 보여줍니다.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
public static void Run()
{            
    // Connect to Exchange Server using ImapClient class
    ImapClient imapClient = new ImapClient("ex07sp1", 993, "Administrator", "Evaluation1", new RemoteCertificateValidationCallback(RemoteCertificateValidationHandler));
    imapClient.SecurityOptions = SecurityOptions.SSLExplicit;

    // Select the Inbox folder
    imapClient.SelectFolder(ImapFolderInfo.InBox);

    // Get the list of messages
    ImapMessageInfoCollection msgCollection = imapClient.ListMessages();
    foreach (ImapMessageInfo msgInfo in msgCollection)
    {
        Console.WriteLine(msgInfo.Subject);
    }
    // Disconnect from the server
    imapClient.Dispose();   
}

// Certificate verification handler
private static bool RemoteCertificateValidationHandler(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
    return true; // ignore the checks and go ahead
}

IMAP을 사용하여 Exchange 서버에 연결하고 다음을 가져온 후 IMapMessageInfoCollection, 다음을 얻을 수 있습니다. MessageInfo 객체. 다음 코드 스니펫은 해당 순번을 사용하는 방법을 보여줍니다. MessageInfo 특정 메시지를 저장하기 위한 객체.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
// Select the Inbox folder
imapClient.SelectFolder(ImapFolderInfo.InBox);
// Get the list of messages
ImapMessageInfoCollection msgCollection = imapClient.ListMessages();
foreach (ImapMessageInfo msgInfo in msgCollection)
{
    // Fetch the message from inbox using its SequenceNumber from msgInfo
    MailMessage message = imapClient.FetchMessage(msgInfo.SequenceNumber);

    // Save the message to disc now
    message.Save(dataDir + msgInfo.SequenceNumber + "_out.msg", SaveOptions.DefaultMsgUnicode);
}

선호 암호화 프로토콜 설정

EWS는 지원되는 작업에 HTTPS 전송 프로토콜을 사용합니다. 암호화는 SSL/TLS 프로토콜에 의해 제공됩니다. 이러한 프로토콜은 .NET 프레임워크에 의해 구현되며 현재 .NET 프레임워크 버전에 따라 다를 수 있습니다.

SSL/TLS 버전을 설정하려면 다음 코드를 사용하세요:

var client = new ImapClient("some.host");
client.SupportedEncryption = EncryptionProtocols.Tls13;

또는

var client = new ImapClient("some.host");
client.SetSupportedEncryptionUnsafe(EncryptionProtocols.Tls13);

참고: 지정된 EncryptionProtocol이 현재 .NET 프레임워크 버전에서 지원되지 않을 경우, SupportedEncryption 속성은 암호화 프로토콜을 지원되는 수준으로 낮추고 SetSupportedEncryptionUnsafe 메서드가 예외를 발생시킵니다.

현대 인증을 사용하여 Exchange Server에 연결

Modern Authentication은 더 안전한 프로토콜이므로 신규 Microsoft 365/Azure 테넌트에 대해 기본적으로 활성화됩니다.

현대 인증은 Active Directory Authentication Library와 OAuth 2.0을 기반으로 합니다. 시간 제한이 있는 토큰을 사용하며, 애플리케이션은 사용자 자격 증명을 저장하지 않습니다.

전제 조건 설정

현대 인증을 사용하려면 활성화되어 있는지 확인하십시오. 그러나 2017년 8월 1일 이전에 생성된 테넌트는 기본적으로 현대 인증이 꺼져 있습니다. In the Microsoft 365 관리 센터, Settings > Org Settings > Modern Authentication 으로 이동합니다. 나타나는 Modern authentication flyout에서 더 이상 기본 인증이 필요하지 않은 프로토콜을 확인할 수 있습니다. Azure의 신규 Microsoft365 테넌트에서는 모든 애플리케이션에 대해 기본 인증이 기본적으로 비활성화됩니다. 따라서 이 섹션에 텍스트가 표시됩니다.

조직에 보안 기본값이 활성화되어 있어 Exchange Online에 현대 인증이 필요하고 기본 인증 연결이 차단됩니다. > 여기에서 설정을 변경하려면 Azure 포털에서 보안 기본값을 해제해야 합니다.

테넌트에 대한 기본 인증 지원은 다음에서 활성화할 수 있습니다. Azure 포털에서 Azure Active Directory > Properties > Manage Security defaults > Enable Security defaults > No 로 이동합니다. 자세한 내용은 다음을 참조하십시오. Microsoft 문서 기사.

Azure Active Directory를 통한 앱 등록

Azure Active Directory에서 앱 등록을 수행해야 합니다. 앱으로 사서함에 액세스할 때 사용할 수 있는 두 가지 권한 유형이 있습니다. 만들고자 하는 앱에 따라 특정 권한 유형을 선택하십시오:

  • Delegated permissions을 사용하는 앱은 로그인한 사용자가 존재합니다. 즉, 서비스에 연결할 때 사용자 이름과 비밀번호를 입력하는 대화 상자가 표시됩니다. 앱은 로그인한 사용자보다 더 많은 권한을 가질 수 없습니다.
  • Application permissions을 사용하는 앱은 로그인한 사용자가 없어도 실행됩니다. 예를 들어 백그라운드 서비스나 데몬으로 실행되는 앱이 이에 해당합니다. 관리자만이 애플리케이션 권한에 동의할 수 있습니다.

또한, 다음을 참조하십시오. Microsoft 문서 기사 자세한 내용은.

등록 절차는 선택한 권한 유형에 따라 달라집니다. 앱을 등록하려면 다음을 참조하십시오. Microsoft 문서 기사.

EWSClient와 현대 인증 사용

애플리케이션을 등록한 후, 코드를 작성하는 데 집중할 수 있으며 코드는 다음 부분으로 구성됩니다:

  • 인증 토큰을 가져옵니다.
  • 토큰을 사용해 인증합니다.

인증 토큰 받기

토큰을 얻기 위해 사용할 것입니다. .NET용 Microsoft Authentication Library (MSAL).

다음은 인증 토큰을 얻는 단계입니다.

  • 다음 추가 Microsoft.Identity.Client NuGet 패키지 MSAL.NET 바이너리를 포함하는.
  • 자격 증명을 저장하기 위한 AccessParameters 클래스를 생성합니다.
  • 액세스 매개변수를 받아 MSAL.NET을 사용해 액세스 토큰을 얻는 메서드를 생성합니다.

다음 코드 샘플은 선택한 인증 유형에 따라 달라집니다.

위임된 인증으로 토큰 받기

public class AccessParameters
{
    public string TenantId { get; set; }
    public string ClientId { get; set; }
    public string RedirectUri { get; set; } = "http://localhost";
    public string[] Scopes { get; set; } = { "https://outlook.office365.com/EWS.AccessAsUser.All" };
}

public static async Task<string> GetAccessToken(AccessParameters accessParameters)
{
    var pca = PublicClientApplicationBuilder
                            .Create(accessParameters.ClientId)
                            .WithTenantId(accessParameters.TenantId)
                            .WithRedirectUri(ccessParameters.RedirectUri)
                            .Build();

    var result = await pca.AcquireTokenInteractive(accessParameters.Scopes)
        .WithUseEmbeddedWebView(false)
        .ExecuteAsync();

    return result.AccessToken;
}

앱 인증으로 토큰 받기

public class AccessParameters
{
    public string TenantId { get; set; }
    public string ClientId { get; set; }
    public string ClientSecret { get; set; }
    public string[] Scopes { get; set; } = { "https://outlook.office365.com/.default" };
}

public static async Task<string> GetAccessToken(AccessParameters accessParameters)
{
    var cca = ConfidentialClientApplicationBuilder
        .Create(accessParameters.ClientId)
        .WithClientSecret(accessParameters.ClientSecret)
        .WithTenantId(accessParameters.TenantId)
        .Build();

    var result = await cca.AcquireTokenForClient(accessParameters.Scopes).ExecuteAsync();

    return result.AccessToken;
}

토큰으로 인증

그 후 토큰을 성공적으로 얻으면, 초기화해 보겠습니다. EwsClient.

위임된 인증으로 토큰 사용

NetworkCredential credentials = new OAuthNetworkCredential(accessToken);

using var client = EWSClient.GetEWSClient("https://outlook.office365.com/EWS/Exchange.asmx", credentials);

앱 인증으로 토큰 사용

// Use Microsoft365 username and access token
NetworkCredential credentials = new OAuthNetworkCredential(username, accessToken);

using var client = EWSClient.GetEWSClient("https://outlook.office365.com/EWS/Exchange.asmx", credentials);

IMAP, POP 또는 SMTP 클라이언트에 현대 인증 사용

애플리케이션 권한을 통한 IMAP, POP, SMTP 액세스는 지원되지 않습니다. 즉, 위임된 인증만 지원됩니다.

Azure Active Directory를 통한 앱 등록 절차가 정의됩니다 .

Microsoft 365 관리 센터에서 IMAP, POP, SMTP AUTH 활성화 또는 비활성화

  • 다음을 엽니다: Microsoft 365 관리 센터 Users > Active users 로 이동합니다.
  • 사용자를 선택하고 나타나는 플라이아웃에서 Mail을 클릭합니다.
  • Email apps 섹션에서 Manage email apps를 클릭합니다.
  • IMAP, POP, Authenticated SMTP 설정을 확인하십시오: 선택되지 않음 = 비활성, 선택됨 = 활성.
  • Save changes를 클릭하십시오.

토큰 서버에서 인증 토큰 가져오기

Outlook 리소스 URL을 포함한 전체 범위를 지정해야 합니다.

IMAP: https://outlook.office.com/IMAP.AccessAsUser.All POP: https://outlook.office.com/POP.AccessAsUser.All SMTP: https://outlook.office.com/SMTP.Send

토큰을 얻기 위해 사용할 것입니다. .NET용 Microsoft Authentication Library (MSAL).

다음은 인증 토큰을 얻는 단계입니다.

  • 다음 추가 Microsoft.Identity.Client NuGet 패키지 MSAL.NET 바이너리를 포함하는.
  • 자격 증명을 저장하기 위한 AccessParameters 클래스를 생성합니다.
  • 액세스 매개변수를 받아 MSAL.NET을 사용해 액세스 토큰을 얻는 메서드를 생성합니다.
public class AccessParameters
{
    public string TenantId { get; set; }
    public string ClientId { get; set; }
    public string RedirectUri { get; set; } = "http://localhost";
    public string[] Scopes { get; set; } = { 
        "https://outlook.office.com/IMAP.AccessAsUser.All", 
        "https://outlook.office.com/SMTP.Send" };
}

public static async Task<string> GetAccessToken(AccessParameters accessParameters)
{
    var pca = PublicClientApplicationBuilder
                            .Create(accessParameters.ClientId)
                            .WithTenantId(accessParameters.TenantId)
                            .WithRedirectUri(ccessParameters.RedirectUri)
                            .Build();

    var result = await pca.AcquireTokenInteractive(accessParameters.Scopes)
        .WithUseEmbeddedWebView(false)
        .ExecuteAsync();

    return result.AccessToken;
}

토큰으로 인증

그 후 토큰을 성공적으로 얻으면, 초기화해 보겠습니다. ImapClient.

var imapClient = new ImapClient(
    "outlook.office365.com", 
    993, 
    username, 
    accessToken, 
    true);

마찬가지로, SmtpClient 초기화는 다음과 같이 보일 것입니다.

var smtpClient = new SmtpClient(
    "smtp.office365.com",
    587, 
    username,
    accessToken, 
    true);

클라이언트 요청 ID 반환

다음은 ReturnClientRequestId EWSClient에 편의를 위해 속성을 추가하여 클라이언트 요청 ID를 Exchange Web Services(EWS) 호출의 응답에 반환할지 여부를 지정할 수 있습니다. 클라이언트 요청 ID는 애플리케이션에서 전송하는 각 EWS 요청에 대해 설정할 수 있는 고유 식별자입니다. 설정하면 ReturnClientRequestId 속성을 true 로 설정하면, EWS 서버 응답에 클라이언트 요청 ID가 포함되도록 요청하는 것입니다. 이는 여러 요청이 비동기적으로 만들어지고 처리되는 시나리오에서 요청 및 응답을 추적하고 연관시키는 데 유용합니다.

다음 코드 스니펫은 해당 속성을 활용하는 방법을 보여줍니다.

using (IEWSClient client = TestUtil.CreateEWSClient(user))
{
   // Client will create random id and pass it to the server.
   // The server should include this id in request-id header of all responses.
   client.ReturnClientRequestId = true;
   
   client.LogFileName = "ews.log";
   client.GetMailboxInfo();
}

EWS 요청에 X-AnchorMailbox 및 기타 헤더 추가

Aspose.Email API는 Exchange 요청에 헤더를 추가할 수 있도록 합니다. 이는 다양한 목적에 사용할 수 있는 다양한 헤더를 EWS 요청에 추가하는 데 활용될 수 있습니다. 예를 들어, Exchange 서버의 제한 문제를 관리하는 데 사용되는 X-AnchorMailbox 헤더를 추가하는 경우가 있습니다. The AddHeader 메서드 IEWSClient 다음 코드 스니펫에 표시된 대로 EWS 요청에 헤더를 추가하는 데 사용됩니다.

잘못되었거나 만료된 SSL 인증서 무시 또는 우회

Aspose.Email는 Exchange Server에서 SSL 인증서를 양쪽 모두 사용하여 처리할 수 있습니다 ExchangeClientEWSClient 클래스. SSL 인증서가 만료되었거나 유효하지 않으면, Aspose.Email는 잘못된 SSL 인증서 때문에 예외를 발생시킵니다. 아래 코드에서 사용된 방법으로 이를 무시하여 SSL 인증서 오류를 방지하십시오. main() 또는 init() 메서드에 콜백 핸들러를 등록하고 아래 메서드를 클래스의 멤버로 추가하십시오.