0

MailKit 提供的代码示例表明访问 IMAP 邮箱需要与此类似的代码...

var at = "<<Access_Token>>";
using (var client = new ImapClient())
{
    client.Connect("imap-mail.outlook.com", 993, SecureSocketOptions.SslOnConnect);

    client.Authenticate("<<Email_Address>>", at);

    // do stuff...

    client.Disconnect(true);
}

现在,当将此代码与 GMail 和正确生成且未过期的访问令牌一起使用时,这是一种享受。

同样的代码,再一次,正确生成的访问令牌只会导致AuthenticationException: Invalid username or password.被抛出client.Authenticate在线。

现在我已经针对这个网站进行了测试,我知道电子邮件地址和访问令牌值是有效的。我在 Gmail 中做错了什么?

[编辑] 我发现,在这个 MSDN 页面上,建议......

您的应用程序/服务器在 AUTHENTICATE 命令中将访问令牌传递给我们的 IMAP 服务。我们接受一个 base64 编码的字符串,其中包含:

  • 用户名。
  • 直接 OAuth 2.0 请求的身份验证类型 Bearer。
  • MSA 授予的访问令牌。

例如,您的应用程序/服务器将对这个字符串进行 base-64 编码:

user={user@domain.com}^Aauth=Bearer {Access Token}^A^A

其中 {user@domain.com} 是用户帐户,{Access Token} 是 MSA 授予的访问令牌,^A 是 Ctrl-A 字符 (U+0001)。

但是,我尝试使用创建建议的字符串并将其作为“密码”值传递,client.Authenticate()但无济于事。

4

1 回答 1

0

作为 OAuth2.0 过程的一部分,您需要wl.imap,wl.offline_access根据https://technet.microsoft.com/en-ca/dn440163指定范围参数

可能还需要其他范围,例如wl.emailand wl.basic,但根据我自己对我阅读过的文档的理解,它们应该不是必需的。

于 2016-08-12T15:24:08.887 回答