使用 mailkit 从 Exchange Online 检索邮件并作为应用程序进行身份验证

Retrieving mails from Exchange online using mailkit and authenticate as appl

提问人:MrCalvin 提问时间:11/16/2023 更新时间:11/17/2023 访问量:20

问:

我正在尝试使用 MailKit 连接到 Exchange Online。

我作为应用程序进行身份验证(使用 appl.id 和 secret)。

我已经有检索令牌的代码(使用图形 API)I already have the code to retrieve the token (using Graph API)

但是如何使用令牌对 MailKit imapClient 进行身份验证呢?

如果我想对 HttpClient 进行身份验证,请使用:

_HttpClient.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", AccessToken);

如果我想使用基本身份验证对 MailKit imapClient 进行身份验证,似乎我可以这样做:

using (var imapClient = new ImapClient())
{
      imapClient.Connect("outlook.office365.com", 993, SecureSocketOptions.SslOnConnect);
      imapClient.Authenticate("username", "password");
      ...
}
C# Mailkit 在线交换

评论


答:

0赞 mainframe007 11/17/2023 #1

我最近为这种情况设置了一个应用程序。以下是我使用 appId、Client Secret 和 TenantId 连接到 Exchange 服务的代码。我还需要添加您需要使用 Microsoft Exchange Web 服务来访问 Microsoft Graph API(应用程序 ID 和客户端密码在云中添加的位置),因为据我所知,MailKit 不支持它。需要从 NuGet 添加 Microsoft.Exchange.WebServices dll。

    //Set up auth data
var cca = ConfidentialClientApplicationBuilder
    .Create("<ApplicationId>")
    .WithClientSecret("<ClientSecret>")
    .WithTenantId("<TenantId>")
    .Build();
var ewsScopes = new string[] { "https://outlook.office365.com/.default" };
ExchangeService _ewsClient;
//Aquire Auth token
Task<AuthenticationResult> tsk = cca.AcquireTokenForClient(ewsScopes).ExecuteAsync();
tsk.Wait();
AuthenticationResult authResult = tsk.Result;

//Configure the ExchangeService with the access token.
_ewsClient = new ExchangeService();
_ewsClient.Url = new Uri("https://outlook.office365.com/EWS/Exchange.asmx");
_ewsClient.Credentials = new OAuthCredentials(authResult.AccessToken);
_ewsClient.ImpersonatedUserId =
    new ImpersonatedUserId(ConnectingIdType.SmtpAddress, "<EmailAddressOfAccount>");
//Include x-anchormailbox header
_ewsClient.HttpHeaders.Add("X-AnchorMailbox", "<EmailAddressOfAccount>");

评论

0赞 MrCalvin 11/17/2023
但是如何将此令牌与 ImapClient 一起使用呢?生成令牌没有问题。