【问题标题】:SMTP and OAuth 2SMTP 和 OAuth 2
【发布时间】:2014-08-03 10:24:59
【问题描述】:

.NET 是否支持通过 OAuth 协议的 SMTP 身份验证?基本上,我希望能够使用 OAuth 访问令牌代表用户发送电子邮件。但是,我在 .NET 框架中找不到对此的支持。

Google 在其他环境中为此提供了一些 samples,但在 .NET 中没有。

【问题讨论】:

    标签: c# .net smtp oauth-2.0 sasl


    【解决方案1】:

    System.Net.Mail 不支持 OAuth 或 OAuth2。但是,您可以使用MailKit(注意:仅支持 OAuth2)SmtpClient 发送消息,只要您拥有用户的 OAuth 访问令牌(MailKit 没有获取 OAuth 令牌的代码,但它可以使用如果你有的话就给它)。

    您需要做的第一件事是关注Google's instructions 为您的应用程序获取 OAuth 2.0 凭据。

    完成此操作后,获取访问令牌的最简单方法是使用 Google 的 Google.Apis.Auth 库:

    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 = "username@gmail.com"
    }.FromCertificate (certificate));
    
    bool result = await credential.RequestAccessTokenAsync (CancellationToken.None);
    
    // Note: result will be true if the access token was received successfully
    

    现在您有了访问令牌 (credential.Token.AccessToken),您可以将它与 MailKit 一起使用,就像它是密码一样:

    using (var client = new SmtpClient ()) {
        client.Connect ("smtp.gmail.com", 587, SecureSocketOptions.StartTls);
    
        // use the access token
        var oauth2 = new SaslMechanismOAuth2 ("username@gmail.com", credential.Token.AccessToken);
        client.Authenticate (oauth2);
    
        client.Send (message);
    
        client.Disconnect (true);
    }
    

    【讨论】:

    • 先生,这个图书馆拯救了我的一天,并且像一个魅力一样工作!感谢分享。
    • 谢谢@jstedfast。代码是正确的。如果其他人正在尝试此操作并收到 Authentication Failed 错误,我的问题是 OAuth 中的“范围”。我只想发送邮件,所以我使用了“googleapis.com/auth/gmail.compose”,但使用 MailKit 进行身份验证需要您将其更改为“mail.google.com”(完整的 gmail 权限)。
    • 如何获得 Google 信任的 X509 证书?
    • 我刚刚遇到过,是的,谢谢!如果这超出了界限,我深表歉意,但是您是否知道如何做同样的事情,但是您可以下载 json 文件?按照此处显示的示例-stackoverflow.com/a/38403006/4662037-我可以尝试读取从与我在您的示例中使用的证书相同的位置获得的 json 密钥,但 Mailkit 会抛出带有消息“334:eyJzdGF0 ...”的 AuthenticationException
    • 我从 JSON 中得到了private_key,然后使用了FromPrivateKey 方法而不是FromCertificate。这为我提供了一个ServiceAccountCredential,我可以使用它来请求访问令牌,然后进行身份验证(同上)。但是,当使用我的令牌调用 Authenticate 方法时,Mailkit 会抛出 AuthenticationException。与此答案基本相同 - stackoverflow.com/a/38403006/4662037.
    【解决方案2】:

    只是添加到上面的答案。我还花了很多时间来找出在 .net 中使用 gmail oAuth2 和 mailkit 发送电子邮件的方法。当我使用它向我的应用程序用户发送电子邮件时。感谢 mailkit 开发者。

    现在我们需要:

    • 授权码
    • 客户 ID
    • 客户端密码
    • 刷新令牌
    • 访问令牌

    您可以通过创建项目直接从 google 控制台获取 Client Id 和 Client Secret。

    接下来,您可以在左上角设置按钮中使用您自己的 OAuth 凭据,从 Google Developers OAuth Playground 启用 gmail 应用程序。

    然后选择并授权 API https://mail.google.com/

    现在您可以通过这个 http POST 请求 https://developers.google.com/oauthplayground/refreshAccessToken 直接刷新令牌。你会在那里找到参数。

    现在您可以使用 MailKit 在您的 C# 代码中直接使用此代码:

    using (var client = new SmtpClient())
    {
        client.Connect("smtp.gmail.com", 587, SecureSocketOptions.StartTls);
        
        var oauth2 = new SaslMechanismOAuth2(GMailAccount, token.AccessToken);
        client.Authenticate(oauth2);
        
        await client.SendAsync(mailMessage);
        client.Disconnect(true);
    }
    

    现在您将能够从服务器端通过您的 gmail 帐户发送电子邮件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-07-16
      • 2011-05-13
      • 2013-06-05
      • 2011-06-22
      • 1970-01-01
      • 2014-08-01
      • 2021-08-11
      相关资源
      最近更新 更多