首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用Xoauth2对Gmail smtp进行身份验证。结果用户名和密码不被接受

使用Xoauth2对Gmail smtp进行身份验证。结果用户名和密码不被接受
EN

Stack Overflow用户
提问于 2022-06-14 08:53:01
回答 1查看 666关注 0票数 0

由于最近删除了不太安全的应用程序,并且不想沿着应用程序密码的路线走。我一直试图在smtp服务器上启用Xoauth2,作为我的用户更安全、可持续的授权方法。

我创建了一个简单的控制台应用程序来测试这一点。

  1. 使用邮包
  2. 连接到googles smtp服务器
  3. 使用xoauth2。
  4. 在google云控制台上创建安装的应用程序。

授权似乎有效,我将获得一个访问令牌。问题是smtp服务器将不接受它,也可能是我如何应用它。

代码语言:javascript
运行
复制
using Google.Apis.Auth.OAuth2;
using Google.Apis.Util.Store;
using MailKit.Net.Smtp;
using MailKit.Security;
using MimeKit;


var path = @"C:\YouTube\dev\credentials.json";
var scopes = new[] { "email" };
var userName = "test2";

var credential = GoogleWebAuthorizationBroker.AuthorizeAsync(GoogleClientSecrets.FromFile(path).Secrets,
    scopes,
    userName,
    CancellationToken.None,
    new FileDataStore(Directory.GetCurrentDirectory(), true)).Result;

credential.GetAccessTokenForRequestAsync();

var message = new EmailMessage()
{
    From = "xxx@gmail.com",
    To = "xxx@gmail.com",
    MessageText = "test",
    Subject = "test"
};

try
{
    using (var client = new SmtpClient())
    {
        client.Connect("smtp.gmail.com", 465, true);
        
        var oauth2 = new SaslMechanismOAuth2 ("xxx@gmail.com", credential.Token.AccessToken);
        await client.AuthenticateAsync (oauth2, CancellationToken.None);
        
        client.Send(message.GetMessage());
        client.Disconnect(true);
    }

   
}
catch (Exception ex)
{
    int i = 1;  // throws MailKit.Security.AuthenticationException here
}


public class EmailMessage
{
    public string To { get; set; }
    public string From { get; set; }
    public string Subject { get; set; }
    public string MessageText { get; set; }

    public MimeMessage GetMessage()
    {
        var body = MessageText;
        var message = new MimeMessage();
        message.From.Add(new MailboxAddress("test", From));
        message.To.Add(new MailboxAddress("test", To));
        message.Subject = Subject;
        message.Body = new TextPart("plain") { Text = body };
        return message;
    }
}

完整的错误消息如下所示。

MailKit.Security.AuthenticationException: 535: 5.7.8用户名和密码不被接受。了解更多信息: 5.7.8 da26-20020a056402177a00b004315050d7dfsm6610655edb.81 - gsmtp at MailKit.Net.Smtp.SmtpClient.AuthenticateAsync(SaslMechanism MailKit.Net.Smtp.SmtpClient.AuthenticateAsync(SaslMechanism,Boolean,CancellationToken cancellationToken at Program.$(String[] args) in C:\YouTube\dev\Gmail\Code\SMTPTesting\SmtpTest\SmtpTestXoauth2\Program.cs:line 38

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-06-14 08:57:18

在与此斗争了一段时间后,它就接合了。

标准的电子邮件范围不正确。带有smtp服务器的XOauth2只有两个作用域。

最后一个显然只适用于工作区。

修复

我唯一需要在代码中修改的是

代码语言:javascript
运行
复制
var scopes = new[] { "email" };

代码语言:javascript
运行
复制
var scopes = new[] { "https://mail.google.com/" };

更多信息可以在这里找到Oauth2范围

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72614113

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档