【发布时间】:2014-08-03 10:24:59
【问题描述】:
.NET 是否支持通过 OAuth 协议的 SMTP 身份验证?基本上,我希望能够使用 OAuth 访问令牌代表用户发送电子邮件。但是,我在 .NET 框架中找不到对此的支持。
Google 在其他环境中为此提供了一些 samples,但在 .NET 中没有。
【问题讨论】:
标签: c# .net smtp oauth-2.0 sasl
.NET 是否支持通过 OAuth 协议的 SMTP 身份验证?基本上,我希望能够使用 OAuth 访问令牌代表用户发送电子邮件。但是,我在 .NET 框架中找不到对此的支持。
Google 在其他环境中为此提供了一些 samples,但在 .NET 中没有。
【问题讨论】:
标签: c# .net smtp oauth-2.0 sasl
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);
}
【讨论】:
private_key,然后使用了FromPrivateKey 方法而不是FromCertificate。这为我提供了一个ServiceAccountCredential,我可以使用它来请求访问令牌,然后进行身份验证(同上)。但是,当使用我的令牌调用 Authenticate 方法时,Mailkit 会抛出 AuthenticationException。与此答案基本相同 - stackoverflow.com/a/38403006/4662037.
只是添加到上面的答案。我还花了很多时间来找出在 .net 中使用 gmail oAuth2 和 mailkit 发送电子邮件的方法。当我使用它向我的应用程序用户发送电子邮件时。感谢 mailkit 开发者。
现在我们需要:
您可以通过创建项目直接从 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 帐户发送电子邮件。
【讨论】: