התחברות ל-Exchange Server באמצעות EWS ו‑IMAP

כדי להתחבר ל‑Exchange servers 2007, 2010 ו‑2013 באמצעות Exchange Web Service, Aspose.Email מספקת את IEWSClient ממשק שמממש את EWSClient מחלקה. ה- EWSClient.GetEWSClient השיטה מאתחלת ומחזירה IEWSClient אובייקט המשמש להמשך ביצוע פעולות הקשורות לתיבת דואר Exchange ותיקיות נוספות. מאמר זה מציג כיצד לאתחל אובייקטים של IEWSClient.

התחברות ל‑Exchange Server באמצעות EWS

קטע הקוד הבא מראה כיצד ליצור חיבור באמצעות 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 ב‑EWS, השתמש בשיטות העומס הבאות כדי להוסיף כותרות מותאמות בעת יצירת מופע של IEWSClient:

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

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

דוגמת הקוד שלטה מראה כיצד להגדיר ולהתחיל את IEWSClient תוך שימוש בכותרות HTTP מותאמות אישית:

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

התחברות ל‑Exchange Server באמצעות IMAP

Microsoft Exchange Server תומך בפרוטוקול IMAP לשיגור פריטים בתיבה. השתמש ב‑Aspose.Email ImapClient מחלקה להתחברות ל‑Exchange Server באמצעות פרוטוקול IMAP. למידע נוסף על ה‑ ImapClient מחלקה. ראשית, ודא ששירותי IMAP מופעלים ב‑Exchange Server שלך:

  1. פתח את לוח הבקרה.
  2. גש לכלי הניהול, ואז לשירותים.
  3. בדוק את מצב שירות Microsoft Exchange IMAP4.
  4. אם הוא עדיין אינו פועל, אפשר/הפעל אותו.

קוד הדוגמה הבא מראה כיצד להתחבר ולרשום הודעות מתיקיית ה‑Inbox של Microsoft Exchange Server באמצעות פרוטוקול IMAP.

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

לאחר התחברות ל‑Exchange server באמצעות IMAP וקבלת ה‑ 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 Framework ועלולים להשתנות בהתאם לגרסה הנוכחית של .NET Framework.

כדי להגדיר גרסת SSL/TLS השתמש בקוד הבא:

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

או

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

הערה, אם ה‑EncryptionProtocol שצויין אינו נתמך על‑ידי גרסת .NET Framework הנוכחית, ה‑ SupportedEncryption המאפיין מוריד את פרוטוקול ההצפנה לרמה נתמכת ו‑ SetSupportedEncryptionUnsafe מתודה זורקת חריגה.

התחברות ל‑Exchange Server באמצעות אימות מודרני

אימות מודרני מופעל כעת כברירת מחדל עבור כל המטענים החדשים של Microsoft 365/Azure מכיוון שהפרוטוקול הזה בטוח יותר מאימות בסיסי שהופסק.

אימות מודרני מבוסס על Active Directory Authentication Library ו‑OAuth 2.0. הוא משתמש בטוקנים מוגבלים בזמן, והיישומים אינם שומרים פרטי גישה של משתמשים.

הגדרות דרישה מוקדמת

כדי להשתמש באימות מודרני, ודא שהוא מופעל. עם זאת, עבור מטענים שנוצרו לפני 1 באוגוסט 2017, האימות המודרני מושבת כברירת מחדל. ב‑ מרכז ניהול Microsoft 365, עבור ל‑Settings > Org Settings > Modern Authentication. בתיבה המרחפת Modern authentication שמופיעה, ניתן לזהות את הפרוטוקולים שאינם דורשים עוד אימות בסיסי. עבור מטעני Microsoft365 חדשים ב‑Azure, אימות בסיסי מושבת כברירת מחדל לכל היישומים. לכן, הטקסט יוצג בחלק זה.

לארגון שלך מופעלים ברירות אבטחה ברירת מחדל, מה שמשמעותו שהאימות המודרני ל‑Exchange Online נדרש, וחיבורים עם אימות בסיסי חסומים. > עליך לכבות את ברירות האבטחה בממשק Azure לפני שתוכל לשנות הגדרות כאן.

ניתן להפעיל תמיכת אימות בסיסי עבור המטען מ‑ Azure ב‑portal, עבור ל‑Azure Active Directory > Properties > Manage Security defaults > Enable Security defaults > No. למידע נוסף עיין ב‑ מאמר תיעוד של Microsoft.

רישום אפליקציה ב‑Azure Active Directory

צריך לבצע רישום אפליקציה ב‑Azure Active Directory. קיימים שני סוגי הרשאות שניתן להשתמש בהם כדי לגשת לתיבות דואר עם האפליקציה שלך. בחר סוג הרשאה ספציפי בהתאם לאפליקציה שאתה יוצר:

  • אפליקציות המשתמשות בהרשאות מְפוּצָלות מחוברות למשתמש משולב. במילים אחרות, כאשר אתה מתחבר לשירות, חלון דו‑שיח מופיע לבקשת שם משתמש וסיסמה. אפליקציה לא יכולה לקבל יותר הרשאות מאשר למשתמש המחובר.
  • אפליקציות המשתמשות בהרשאות יישום פועלות ללא משתמש מחובר. לדוגמה, אפליקציות כאלה פועלות כשירותי רקע או דמויות. רק מנהל יכול לאשר הרשאות יישום.

בנוסף, עיין ב‑ מאמר תיעוד של Microsoft לעוד מידע.

הליך הרישום תלוי בסוג ההרשאה שנבחרה. כדי לרשום את האפליקציה שלך, עיין ב‑ מאמר תיעוד של Microsoft.

שימוש באימות מודרני עם EWSClient

לאחר רישום היישום, נוכל להתמקד בכתיבת הקוד, שיכלול את החלקים הבאים:

  • קבל את טוקן ההרשאה.
  • השתמש בטוקן לאימות.

קבלת טוקן הרשאה

כדי לקבל את הטוקן נשתמש ב‑ ספריית אימות של מייקרוסופט (MSAL) עבור .NET.

להלן השלבים לקבלת טוקן הרשאה.

  • הוסף את ה- חבילת NuGet Microsoft.Identity.Client שמכילה את הקבצים הבינריים של 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 מוגדר מעלה.

הפעל או השבת IMAP, POP, SMTP AUTH במרכז ניהול Microsoft 365

  • פתח את מרכז ניהול Microsoft 365 ולך אל Users > Active users.
  • בחר את המשתמש, ובתיבה המרחפת שמופיעה לחץ על Mail.
  • בקטע Email apps, לחץ על Manage email apps.
  • בדוק את הגדרת IMAP, POP, Authenticated SMTP: לא מסומן = מושבת, מסומן = מופעל.
  • לחץ על Save changes.

קבלת טוקן אימות משרת הטוקנים

ודא שאתה מציין את כל ההיקפים, כולל כתובות משאבי Outlook.

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

כדי לקבל את הטוקן נשתמש ב‑ ספריית אימות של מייקרוסופט (MSAL) עבור .NET.

להלן השלבים לקבלת טוקן הרשאה.

  • הוסף את ה- חבילת NuGet Microsoft.Identity.Client שמכילה את הקבצים הבינריים של 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);

החזרת מזהה בקשת הלקוח

ה ReturnClientRequestId נוסף נכס ל‑EWSClient לנוחיותך כדי לציין האם יש להחזיר את מזהה בקשת הלקוח בתשובה משיחות Exchange Web Services (EWS). מזהה בקשת הלקוח הוא מזהה ייחודי שניתן להגדיר עבור כל בקשת EWS שנשלחת מהיישום שלך. על‑ידי הגדרת the ReturnClientRequestId הגדרת המאפיין ל‑true מציינת שאתה רוצה שה‑client request ID ייכלל בתגובה מהשרת EWS. זה יכול להיות שימושי למעקב וקורלציה של בקשות ותשובות במקרים בהם נעשות מספר בקשות ומעובדות באופן אסינכרוני.

קטע הקוד הבא מראה כיצד ניתן להשתמש במאפיין:

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

הוסף X-AnchorMailbox וכותרות אחרות לבקשות EWS

ממשק ה‑API של Aspose.Email מאפשר הוספת כותרות לבקשות Exchange. ניתן להשתמש בזה כדי להוסיף כותרות לבקשות EWS למטרות שונות. דוגמה אחת היא הוספת כותרת X-AnchorMailbox המשמשת לניהול בעיות תזמון ב‑Exchange server. ה‑ AddHeader שיטה של IEWSClient משמש להוספת כותרות לבקשות EWS כפי שמוצג בקטע הקוד הבא.

התעלמות או עקיפה של תעודת SSL לא תקפה או שפג תוקפה

Aspose.Email יכול להתמודד עם תעודות SSL על שרת Exchange באמצעות שני ה‑ ExchangeClient ו EWSClient מחלקות. אם תעודת ה‑SSL פגה תוקפה או שהפכה ללא תקפה, Aspose.Email זורק חריגה עקב תעודת SSL לא תקפה. מנע שגיאות כאלה על‑ידי התעלמות מהן באמצעות המתודה המופיעה בקוד למטה. רשום את מנהל הקריאה חוזרת ב‑main() או ב‑init() והוסף את המתודה למטה כחבר במחלקה.