首页 > 解决方案 > 尝试从 C# 应用程序连接到 Gmail 时出现身份验证错误,但没有安全警报电子邮件

问题描述

我正在构建一个原型网站来展示客户,并且需要连接到 Gmail 以访问电子邮件。为简单起见(因为这是一个原型),我尝试使用我创建的一次性 Gmail 帐户的电子邮件和密码进行连接。当我们(希望)获得完整应用程序的协议时,全面的安全性将在稍后到来。

我正在使用Mailkit,代码如下...

  ImapClient client = new();
  await client.ConnectAsync("imap.gmail.com", 993, SecureSocketOptions.SslOnConnect);
  await client.AuthenticateAsync(userName, password);

我第一次在本地计算机上尝试此操作时,身份验证失败,并且向 Gmail 帐户发送了一封“安全警报”电子邮件,说有新设备尝试登录。它让我可以选择检查活动,并且确认新设备实际上是我。

之后,我可以毫无问题地从本地机器运行代码。

另一位开发人员刚刚检查了我的更改并在他的机器上进行了尝试,并得到了身份验证失败的异常。可以理解,因为他的设备以前没有用于此目的。但是,这一次,Gmail 帐户没有收到“安全警报”电子邮件,因此他无法告诉 Google 他的设备是值得信任的。

然后我将该站点部署到测试服务器,并遇到了同样的问题。

任何人知道为什么我们没有收到其他开发者机器或测试服务器的“安全警报”电子邮件吗?更重要的是,知道我们如何告诉 Google 信任这两种设备吗?在这个阶段,我没有资源将 OAuth 添加到这个原型中。

Imap 日志如下所示。

谢谢

地图日志

Connected to imaps://imap.gmail.com:993/
S: * OK Gimap ready for requests from 185.160.182.96 n14mb29765764wrp
C: A00000000 CAPABILITY
S: * CAPABILITY IMAP4rev1 UNSELECT IDLE NAMESPACE QUOTA ID XLIST CHILDREN X-GM-EXT-1 XYZZY SASL-IR AUTH=XOAUTH2 AUTH=PLAIN AUTH=PLAIN-CLIENTTOKEN AUTH=OAUTHBEARER AUTH=XOAUTH
S: A00000000 OK Thats all she wrote! n14mb29765764wrp
C: A00000001 AUTHENTICATE PLAIN AG5vd2l0c21pbmUyMDIwQGdtYWlsLmNvbQBIZXl5b3VBbmRtZTEy
S: * NO [WEBALERT https://accounts.google.com/signin/continue?sarp=1&scc=1&plt=AKgnsbsNd6RU3LIlgDfhmL9Y7ywYhtagFig_xfuSJCUHD9Eg3XqN8DKlDk3G8jmj2w5viIm5PDC3BS4SVy7iFMB6g1244cnQt1E60EdOTSEpnqDzL6FH2L-ReOAyZ3qkSXZQZs2pIfL2] Web login required.
S: A00000001 NO [ALERT] Please log in via your web browser: https://support.google.com/mail/accounts/answer/78754 (Failure)

标签: gmailgmail-imapmailkit

解决方案


Gmail 具有此安全功能,它要求您先通过机器上的网络浏览器登录,然后才能通过 IMAP 连接。

您可以通过转到 gmail 设置并创建应用专用密码供您的应用使用来解决此问题。

此外,MailKits 常见问题解答中有一个关于更改哪些设置以允许“不太安全的应用程序”进行身份验证的部分。不确定您是否执行了这些步骤。

您还可以提交 MailKit 的功能请求以添加对 Gmail 的 [WEBALERT ...] 响应代码的支持吗?快速浏览一下,我认为这可能是 MailKit 可以解析并发出事件的东西(在这种情况下它不会对您的应用程序有太大帮助,但无论如何可能有用吗?)


推荐阅读