17

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

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

4

2 回答 2

24

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

您需要做的第一件事是按照Google 的说明为您的应用程序获取 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);
}
于 2014-06-13T12:09:56.347 回答
1

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

现在我们需要:

  • 授权码
  • 客户编号
  • 客户秘密
  • 刷新令牌
  • 访问令牌

您可以通过创建项目直接从谷歌控制台获取客户端 ID 和客户端密码。

接下来,您可以通过在左上角设置按钮中使用您自己的 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 帐户从服务器端发送电子邮件。

于 2021-04-10T19:57:09.360 回答