在无浏览器环境中获取 gmail 访问令牌并发送电子邮件

Getting gmail access token and sending email in a browserless environment

我想学习如何使用 Mailkit 发送电子邮件。 问题是我现在在我的 gmail 帐户中使用 2 因素身份验证,所以我不能使用简化的邮件发送选项。根据 Mailkit 文档 - 需要使用 Oath。

所以我在GoogleAPI注册了一个新的应用程序并得到了秘钥。然后我尝试像这样进行身份验证:

var secrets = new ClientSecrets
{
    ClientId = "xxxx",
    ClientSecret = "yyyy"
};

var scopes = new string[] { GmailService.Scope.MailGoogleCom };

var googleCredentials = await GoogleWebAuthorizationBroker.AuthorizeAsync(secrets, scopes, email, CancellationToken.None);
if (googleCredentials.Token.IsExpired(SystemClock.Default))
{
    await googleCredentials.RefreshTokenAsync(CancellationToken.None);
}

到达 AuthorizeAsync 行后 - 将打开一个新浏览器 window,我必须在其中输入我的凭据。如果我要 运行,这将不是问题此应用程序 Windows.. 但是,这是一个大问题。

我正在构建一个控制台 dotnet 核心应用程序,它旨在 运行 在 Linux 环境中,在 CLI 模式下。每次令牌过期时我都不能要求输入凭据..因为根本没有 GUI...

有没有一种方法可以让电子邮件发送 "just" 工作而无需在外部应用程序中额外登录?

我刚刚想到,注册一个具有简化登录选项的新电子邮件帐户并在我的应用程序中使用它可能会更容易,而不是试图让当前的 Gmail 帐户正常工作。所以,任何想法或有什么建议吗?

您可以使用具有全域授权 [3] 的服务帐户 [1] [2],这将授予您从您的域中模拟任何 gmail 帐户的权限。选择项目后,您可以在云平台创建服务账号。

获得服务帐号后,您可以创建一个p12文件,您可以使用该文件获取在Mailkit上发送电子邮件所需的令牌。这是 Mailkit 文档中解释的代码,用于实现服务帐户 [4]:

的使用
var certificate = new X509Certificate2 (@"C:\path\to\certificate.p12", "password", X509KeyStorageFlags.Exportable);
var credential = new ServiceAccountCredential (new ServiceAccountCredential
    .Initializer ("your-developer-id@developer.gserviceaccount.com") {
    // Note: other scopes can be found here: https://developers.google.com/gmail/api/auth/scopes
    Scopes = new[] { "https://mail.google.com/" },
    User = "user@gmail.com"
}.FromCertificate (certificate));

bool result = await credential.RequestAccessTokenAsync (CancellationToken.None);

// Note: result will be true if the access token was received successfully

using (var client = new ImapClient ()) {
    client.Connect ("imap.gmail.com", 993, true);

    var oauth2 = new SaslMechanismOAuth2 ("user@gmail.com", credential.Token.AccessToken);
    client.Authenticate (oauth2);
}

代码第一个函数的路径字符串是您的服务帐号中p12文件的文件路径,您可以从云平台下载。

编辑:

如果您不是 G Suite 管理员,解决方法是实施快速入门 [5] 中的授权流程,这只会在您第一次 [=38= 时在浏览器上提示同意屏幕] 它会创建一个令牌,您可以通过将令牌文件留在工作目录中来在代码的后续 运行 中使用该令牌。您必须检查如何使用 MailKit 库中的 gmail 服务或凭据对象。

[1] https://cloud.google.com/iam/docs/service-accounts

[2] https://cloud.google.com/iam/docs/understanding-service-accounts

[3] https://developers.google.com/admin-sdk/directory/v1/guides/delegation

[4]https://github.com/jstedfast/MailKit/blob/master/FAQ.md#q-how-can-i-log-in-to-a-gmail-account-using-oauth-20

[5]https://developers.google.com/gmail/api/quickstart/dotnet