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

时间:2019-07-04 14:57:07

标签: .net .net-core gmail-api mailkit

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

因此,我在Google API中注册了一个新应用程序并获得了密钥。然后,我尝试像这样进行身份验证:

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行时-将打开一个新的浏览器窗口,我必须在该窗口中输入我的凭据。如果我要在Windows上运行此应用程序,这将不是问题。一个大问题。

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

有没有一种方法可以使电子邮件发送“正常”的工作而无需在外部应用程序中进行其他登录?

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

1 个答案:

答案 0 :(得分:0)

您可以将服务帐户[1] [2]与域范围内的授权[3]结合使用,这将授予您访问权限,以模拟来自您域的任何Gmail帐户。选择项目后,您可以在Cloud Platform上创建服务帐户。

获得服务帐户后,您可以创建一个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文件的文件路径,您可以从Cloud Platform下载该文件。

编辑:

一种解决方法,如果您不是G Suite管理员,将按照快速入门[5]中的说明实施授权流程,这只会在您首次运行浏览器时在浏览器上提示您同意屏幕,创建一个令牌,将令牌文件留在工作目录中,即可在以后的代码运行中使用。您将必须检查如何使用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