下面的 MailKit 和 Google API C# 代码是为了在我的 Win10 桌面应用程序中验证 gmail 访问令牌而编写的。但是,对 client.AuthenticateAsync 的调用通常(但并非总是)失败,并指示用户 ID 和密码不正确。
我将失败尝试期间的客户端凭据与成功尝试期间的客户端凭据进行了比较,它们是相同的。我还检查了我正在使用的 gmail 帐户,看看它是否希望我验证是否确实是我在尝试身份验证,但它说一切正常。使用不同的凭据集以及不同的 Gmail 电子邮件帐户也会发生相同的行为。
我还编写了一个不使用 MailKit 或 Google API 的 Chilkat 软件版本。它使用完全相同的凭据和访问令牌,并且永远不会失败,即使 MailKit/Google API 版本抱怨用户 ID 和密码错误也是如此。我想使用 MailKit,因为它是免费的,而 Chilkat 不是。
无论我尝试过哪个版本的 .NET(4.8.1、6 和 8),MailKit 版本都遇到相同的问题,但 Chilkat 版本始终适用于所有这些版本。任何想法/建议将不胜感激。
static async System.Threading.Tasks.Task Main(string[] args)
{
string from = $"[email protected]";
string path = @"ClientCredentials.json";
string[] scopes = new[] { "https://mail.google.com/" };
string accessToken = @"";
try
{
var credential = await GoogleWebAuthorizationBroker.AuthorizeAsync(
GoogleClientSecrets.FromFile(path).Secrets,
scopes,
mailbox,
CancellationToken.None,
new FileDataStore(Directory.GetCurrentDirectory(), true));
using (var client = new SmtpClient())
{
client.Connect("smtp.gmail.com", 465, true);
var oauth2 = new SaslMechanismOAuth2(from, credential.Token.AccessToken);
accessToken = credential.Token.AccessToken;
await client.AuthenticateAsync(oauth2);
if (!client.IsAuthenticated)
{
// Refresh the access token
if (credential.Token.IsStale)
{
await credential.RefreshTokenAsync(CancellationToken.None);
accessToken = credential.Token.AccessToken;
oauth2 = new SaslMechanismOAuth2(from, accessToken);
await client.AuthenticateAsync(oauth2);
}
}
client.Disconnect(true);
}
}
catch (Exception ex)
{
Console.WriteLine($"An error occurred: {ex.Message}\n{ex.StackTrace}");
}
}
用户名和密码不被接受
这是当您尝试连接到 Google 的 SMPT 服务器并尝试使用用户实际的 google 密码时的标准错误消息。
截至 2022 年 5 月 30 日,谷歌已删除了不太安全的应用程序选项。无法打开它,因为它不再存在。
你有两个选择