.NET 是否支持通过 OAuth 协议进行 SMTP 身份验证?基本上,我希望能够使用 OAuth 访问令牌代表用户发送电子邮件。但是,我在 .NET 框架中找不到对此的支持。
Google在其他环境中为此提供了一些示例,但在 .NET 中没有。
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);
}
只是添加到上面的答案。我还花了很多时间来找出在 .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 帐户从服务器端发送电子邮件。