我正在开发一个应用程序,旨在为我们的客户移动和分发传入的邮件。
当前版本在没有 OAuth2 的情况下运行,因此我的任务是开发一个在 C# 中与 OAuth2 配合使用的全新版本。
我对 C# 完全陌生(现在已经专业使用它大约 1.5 个月了),并且对 Outlook、Exchange 等的机制一无所知,所以我基本上是在旅途中学习所有内容。
介绍就这么多了 - 我一直在使用 Mailkit 并根据我发现的问题判断,我确实成功获得了访问令牌。
但是当我尝试连接时,下面的方法只会抛出
MailKit.Security.AuthenticationException: "LOGIN failed."
以下是应该获取邮箱中所有邮件的方法(我目前主要是在玩这个,以了解 Mailkit 的所有方法和机制,然后再实际开始最终应用程序并获取所有邮件)邮件似乎是一个足够简单的例子,可以让一切围绕它工作)
作为提示;我的公司使用 Exchange Online,如果这对我需要做的事情有任何影响
static async Task<List<string>> GetEmails(string accessToken)
{
var emails = new List<string>();
using (var client = new ImapClient())
{
await client.ConnectAsync("outlook.office365.com", 993, SecureSocketOptions.SslOnConnect);
await client.AuthenticateAsync("[my mail address]", accessToken);
MessageBox.Show("Test");
//var inbox = client.Inbox;
//inbox.Open(FolderAccess.ReadOnly);
//var uids = inbox.Search(SearchQuery.All);
//foreach (var uid in uids)
//{
// var message = inbox.GetMessage(uid);
// emails.Add(message.TextBody);
//}
await client.DisconnectAsync(true);
}
return emails;
}
如果有人能准确地告诉我出了什么问题,那就太好了,但根据我的研究,这可能是很多问题,而“登录失败”不一定是最能提供信息的异常。因此,我已经很高兴获得一些关于尝试或解决问题的提示或建议列表。
提前致谢!
如果你的OAuth2.0权限等在服务器上设置正确,那么问题就出在下面这行代码:
await client.AuthenticateAsync("[my mail address]", accessToken);
您在上面使用的通用
AuthenticateAsync(string username, string password)
方法不会尝试 OAUTH2.0 - 它只会尝试基于密码的身份验证机制(例如您的情况下的“LOGIN”)。
相反,你需要使用的是:
var oauth2 = new SaslMechanismOAuth2("[my mail address]", accessToken);
await client.AuthenticateAsync(oauth2);
这个
AuthenticateAsync(SaslMechanism)
方法现在将正确使用 XOAUTH2 SASL 机制来使用提供的身份验证令牌进行身份验证,并且应该可以工作(当然假设令牌有效)。