Kết nối tới Exchange Server bằng EWS và IMAP
Để kết nối tới các máy chủ Exchange 2007, 2010 và 2013 bằng Exchange Web Service, Aspose.Email cung cấp IEWSClient giao diện triển khai EWSClient lớp. EWSClient.GetEWSClient phương pháp tạo và trả về một IEWSClient đối tượng được sử dụng tiếp để thực hiện các thao tác liên quan tới hộp thư Exchange và các thư mục khác. Bài viết này chỉ ra cách tạo các đối tượng của IEWSClient.
Kết nối tới Exchange Server bằng EWS
Đoạn mã sau cho bạn thấy cách thiết lập kết nối bằng 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;
}
Thêm Tiêu đề Tùy chỉnh vào Khởi tạo EWSClient
Trong các trường hợp cần tiêu đề cụ thể khi khởi tạo client, chẳng hạn tiêu đề X-AnchorMailbox trong EWS, sử dụng các phương thức overload sau để thêm tiêu đề tùy chỉnh khi tạo một thể hiện của IEWSClient:
-
IEWSClient GetEWSClient(string mailboxUri, ICredentials credentials, WebProxy proxy, Dictionary headers)
-
async Task GetEwsClientAsync(string mailboxUri, ICredentials credentials, WebProxy proxy, CancellationToken cancellationToken , Dictionary headers)
Mẫu mã dưới đây minh họa cách cấu hình và khởi tạo IEWSClient trong khi sử dụng các tiêu đề HTTP tùy chỉnh:
var headers = new Dictionary<string, string>();
headers.Add("X-AnchorMailbox", smtpExampleAddress);
IEWSClient client = EWSClient.GetEWSClient(HttpsExampleCom, new OAuthNetworkCredential("UserName", "Token"), null, headers);
Kết nối tới Exchange Server bằng IMAP
Microsoft Exchange Server hỗ trợ giao thức IMAP để truy cập các mục trong hộp thư. Sử dụng Aspose.Email ImapClient lớp để kết nối tới Exchange Server bằng giao thức IMAP. Để biết thêm thông tin về ImapClient lớp. Đầu tiên, hãy chắc chắn rằng dịch vụ IMAP đã được bật cho Exchange Server của bạn:
- Mở Bảng Điều Khiển.
- Đi tới Công cụ Quản trị, sau đó Dịch vụ.
- Kiểm tra trạng thái của dịch vụ Microsoft Exchange IMAP4.
- Nếu nó chưa chạy, hãy bật/bắt đầu nó.
Đoạn mã dưới đây cho bạn thấy cách kết nối và liệt kê các tin nhắn từ thư mục Inbox của Microsoft Exchange Server bằng giao thức 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();
Đoạn mã dưới đây cho bạn thấy cách sử dụng 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
}
Sau khi kết nối tới máy chủ Exchange bằng IMAP và nhận được IMapMessageInfoCollection, bạn có thể lấy MessageInfo đối tượng. Đoạn mã sau cho bạn thấy cách sử dụng số thứ tự của MessageInfo đối tượng để lưu một tin nhắn cụ thể.
// 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);
}
Đặt Giao thức Mã hóa Ưu tiên
EWS sử dụng giao thức truyền tải HTTPS cho các hoạt động được hỗ trợ. Mã hóa được cung cấp bởi các giao thức SSL/TLS. Những giao thức này được triển khai bởi .NET framework và có thể khác nhau tùy vào phiên bản .NET hiện tại.
Để đặt phiên bản SSL/TLS sử dụng đoạn mã sau:
var client = new ImapClient("some.host");
client.SupportedEncryption = EncryptionProtocols.Tls13;
hoặc
var client = new ImapClient("some.host");
client.SetSupportedEncryptionUnsafe(EncryptionProtocols.Tls13);
Lưu ý, nếu EncryptionProtocol được chỉ định không được hỗ trợ bởi phiên bản .NET hiện tại, thì SupportedEncryption thuộc tính hạ cấp giao thức mã hóa xuống mức được hỗ trợ và SetSupportedEncryptionUnsafe phương thức ném ra một ngoại lệ.
Kết nối tới Exchange Server bằng Xác thực Hiện đại
Xác thực Hiện đại hiện đã được bật mặc định cho tất cả các tenant Microsoft 365/Azure mới vì giao thức này an toàn hơn so với Basic Authentication đã lỗi thời.
Xác thực Hiện đại dựa trên Active Directory Authentication Library và OAuth 2.0. Nó sử dụng token có thời hạn, và các ứng dụng không lưu trữ thông tin xác thực người dùng.
Cài đặt Tiền đề
Để sử dụng Xác thực Hiện đại, đảm bảo rằng nó được bật. Tuy nhiên, đối với các tenant được tạo trước ngày 1 tháng 8 năm 2017, xác thực hiện đại được tắt mặc định. Trong Trung tâm quản trị Microsoft 365, vào Settings > Org Settings > Modern Authentication. Trong Modern authentication flyout xuất hiện, bạn có thể xác định các giao thức không còn yêu cầu Basic authentication. Đối với các tenant Microsoft365 mới trong Azure, Basic Authentication bị tắt mặc định cho tất cả các ứng dụng. Do đó, văn bản sẽ được hiển thị trong phần này.
Tổ chức của bạn đã bật các cài đặt bảo mật mặc định, nghĩa là xác thực hiện đại cho Exchange Online là bắt buộc và các kết nối xác thực cơ bản bị chặn. > Bạn phải tắt các cài đặt bảo mật mặc định trong cổng Azure trước khi có thể thay đổi bất kỳ cài đặt nào ở đây.
Bạn có thể bật hỗ trợ Basic Auth cho tenant từ Azure cổng, vào Azure Active Directory > Properties > Manage Security defaults > Enable Security defaults > No. Để biết thêm thông tin, xem Bài viết Tài liệu Microsoft.
Đăng ký Ứng dụng với Azure Active Directory
Cần thực hiện đăng ký ứng dụng với Azure Active Directory. Có hai loại quyền có thể được sử dụng để truy cập hộp thư với ứng dụng của bạn. Chọn loại quyền cụ thể, tùy theo ứng dụng bạn đang tạo:
- Các ứng dụng sử dụng Quyền ủy quyền có người dùng đã đăng nhập. Nói cách khác, khi bạn kết nối tới dịch vụ, sẽ xuất hiện cửa sổ nhập tên người dùng và mật khẩu. Ứng dụng không bao giờ có quyền cao hơn người dùng đã đăng nhập.
- Các ứng dụng sử dụng Quyền ứng dụng chạy mà không có người dùng đăng nhập. Ví dụ, đây là các ứng dụng chạy như dịch vụ nền hoặc daemon. Chỉ quản trị viên mới có thể đồng ý với quyền ứng dụng.
Ngoài ra, tham khảo Bài viết Tài liệu Microsoft để biết thêm thông tin.
Quy trình đăng ký phụ thuộc vào loại quyền đã chọn. Để đăng ký ứng dụng của bạn, tham khảo Bài viết Tài liệu Microsoft.
Sử dụng Xác thực Hiện đại với EWSClient
Sau khi đăng ký ứng dụng, chúng ta có thể tập trung vào việc viết mã, bao gồm các phần sau:
- Lấy token ủy quyền.
- Sử dụng token để xác thực.
Lấy Token Ủy quyền
Để lấy token, chúng tôi sẽ sử dụng Microsoft Authentication Library (MSAL) cho .NET.
Các bước sau để lấy token ủy quyền.
- Thêm gói nuget Microsoft.Identity.Client chứa các tệp nhị phân của MSAL.NET.
- Tạo một lớp AccessParameters để lưu trữ thông tin xác thực.
- Tạo một phương thức nhận các tham số truy cập và sử dụng MSAL.NET để lấy token truy cập.
Các mẫu mã sau sẽ phụ thuộc vào loại xác thực đã chọn.
Lấy token bằng xác thực ủy quyền
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;
}
Lấy token bằng xác thực ứng dụng
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;
}
Xác thực bằng Token
Sau đó, khi chúng ta đã lấy được token thành công, hãy khởi tạo EwsClient.
Sử dụng token với xác thực ủy quyền
NetworkCredential credentials = new OAuthNetworkCredential(accessToken);
using var client = EWSClient.GetEWSClient("https://outlook.office365.com/EWS/Exchange.asmx", credentials);
Sử dụng token với xác thực ứng dụng
// 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);
Sử dụng Xác thực Hiện đại với các Client IMAP, POP hoặc SMTP
Truy cập IMAP, POP, SMTP qua quyền ứng dụng không được hỗ trợ. Nói cách khác, chỉ hỗ trợ xác thực ủy quyền.
Quy trình đăng ký Ứng dụng với Azure Active Directory được xác định ở trên.
Bật hoặc Tắt IMAP, POP, SMTP AUTH trong Trung tâm Quản trị Microsoft 365
- Mở Trung tâm quản trị Microsoft 365 và vào Users > Active users.
- Chọn người dùng, và trong flyout xuất hiện, nhấn Mail.
- Trong mục Email apps, nhấn Manage email apps.
- Xác nhận cài đặt IMAP, POP, Authenticated SMTP: bỏ chọn = tắt, chọn = bật.
- Nhấn Save changes.
Lấy Token Xác thực từ Máy chủ Token
Đảm bảo chỉ định đầy đủ các phạm vi, bao gồm URL tài nguyên Outlook.
IMAP: https://outlook.office.com/IMAP.AccessAsUser.All POP: https://outlook.office.com/POP.AccessAsUser.All SMTP: https://outlook.office.com/SMTP.Send
Để lấy token, chúng tôi sẽ sử dụng Microsoft Authentication Library (MSAL) cho .NET.
Các bước sau để lấy token ủy quyền.
- Thêm gói nuget Microsoft.Identity.Client chứa các tệp nhị phân của MSAL.NET.
- Tạo một lớp AccessParameters để lưu trữ thông tin xác thực.
- Tạo một phương thức nhận các tham số truy cập và sử dụng MSAL.NET để lấy token truy cập.
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;
}
Xác thực bằng Token
Sau đó, khi chúng ta đã lấy được token thành công, hãy khởi tạo ImapClient.
var imapClient = new ImapClient(
"outlook.office365.com",
993,
username,
accessToken,
true);
Tương tự, SmtpClient khởi tạo sẽ trông như sau.
var smtpClient = new SmtpClient(
"smtp.office365.com",
587,
username,
accessToken,
true);
Trả về ID Yêu cầu Client
Cái ReturnClientRequestId thuộc tính đã được thêm vào EWSClient để thuận tiện cho bạn chỉ định liệu ID yêu cầu của client có nên được trả về trong phản hồi từ các cuộc gọi Exchange Web Services (EWS) hay không. ID yêu cầu của client là một định danh duy nhất mà bạn có thể đặt cho mỗi yêu cầu EWS được gửi từ ứng dụng của mình. Bằng cách thiết lập ReturnClientRequestId đặt thuộc tính thành true, bạn chỉ định rằng muốn ID yêu cầu client được bao gồm trong phản hồi từ máy chủ EWS. Điều này hữu ích cho việc theo dõi và liên kết các yêu cầu và phản hồi trong các trường hợp có nhiều yêu cầu được thực hiện và xử lý bất đồng bộ.
Đoạn mã sau cho thấy cách sử dụng thuộc tính này:
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();
}
Thêm X-AnchorMailbox và Các Tiêu đề Khác vào Yêu cầu EWS
API Aspose.Email cho phép thêm tiêu đề vào các yêu cầu Exchange. Điều này có thể được dùng để thêm tiêu đề vào các yêu cầu EWS cho các tiêu đề khác nhau với các mục đích khác nhau. Một ví dụ là thêm tiêu đề X-AnchorMailbox được dùng để quản lý các vấn đề throttling trên máy chủ Exchange. The AddHeader phương thức của IEWSClient được sử dụng để thêm tiêu đề vào các yêu cầu EWS như trong đoạn mã sau.
Bỏ qua hoặc Vượt qua Chứng chỉ SSL Không hợp lệ hoặc Đã hết hạn
Aspose.Email có thể xử lý chứng chỉ SSL trên Exchange Server bằng cả hai ExchangeClient và EWSClient lớp. Nếu chứng chỉ SSL đã hết hạn hoặc trở nên không hợp lệ, Aspose.Email sẽ ném ra một ngoại lệ do chứng chỉ SSL không hợp lệ. Tránh các lỗi chứng chỉ SSL này bằng cách bỏ qua chúng bằng phương pháp được sử dụng trong đoạn mã dưới đây. Đăng ký trình xử lý callback trong hàm main() hoặc init() của bạn và thêm phương pháp dưới đây như là thành viên của lớp.