如何使用 MailKit 发送电子邮件?
How to send email by using MailKit?
根据新的 google 政策 https://googleonlinesecurity.blogspot.de/2014/04/new-security-measures-will-affect-older.html 我无法发送电子邮件。 "Less secure apps" 被考虑用于 google 不使用 OAuth 2.0 的应用程序。
我想用MailKit来解决这个问题
var message = new MimeMessage();
message.From.Add(new MailboxAddress("Joey Tribbiani", "noreply@localhost.com"));
message.To.Add(new MailboxAddress("Mrs. Chanandler Bong", "mymail@gmail.com"));
message.Subject = "How you doin'?";
message.Body = new TextPart("plain"){ Text = @"Hey" };
using (var client = new SmtpClient())
{
client.Connect("smtp.gmail.com", 587);
////Note: only needed if the SMTP server requires authentication
client.Authenticate("mymail@gmail.com", "mypassword");
client.Send(message);
client.Disconnect(true);
}
但是我有 An exception of type 'MailKit.Security.AuthenticationException' occurred in MailKit.dll but was not handled in user code.Additional information: Authentication failed.
我不想更改我的安全设置。因为我希望一切都是安全的。这就是为什么我开始使用 MailKit 而不是 System.Net.Mail
我该如何解决?
您需要做的第一件事是按照 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));
//You can also use FromPrivateKey(privateKey) where privateKey
// is the value of the field 'private_key' in your serviceName.json file
bool result = await credential.RequestAccessTokenAsync (cancel.Token);
// 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);
// use the OAuth2.0 access token obtained above
var oauth2 = new SaslMechanismOAuth2 ("mymail@gmail.com", credential.Token.AccessToken);
client.Authenticate (oauth2);
client.Send (message);
client.Disconnect (true);
}
更新:
以上解决方案适用于 Google 所指的 "Service Accounts",用于服务器到服务器的通信,但如果您希望 OAuth2 支持标准 Phone 或桌面应用程序,例如,您需要按照我在这里写的说明进行操作:https://github.com/jstedfast/MailKit/blob/master/GMailOAuth2.md
测试了以下代码并适用于我:
// STEP 1: Navigate to this page https://www.google.com/settings/security/lesssecureapps & set to "Turn On"
var message = new MimeMessage();
message.From.Add(new MailboxAddress("Joey Tribbiani", "YOU_FROM_ADDRESS@gmail.com"));
message.To.Add(new MailboxAddress("Mrs. Chanandler Bong", "YOU_TO_ADDRESS@gmail.com"));
message.Subject = "How you doin'?";
message.Body = new TextPart("plain")
{
Text = @"Hey Chandler,I just wanted to let you know that Monica and I were going to go play some paintball, you in?-- Joey"
};
using (var client = new SmtpClient())
{
client.Connect("smtp.gmail.com", 587);
// Note: since we don't have an OAuth2 token, disable
// the XOAUTH2 authentication mechanism.
client.AuthenticationMechanisms.Remove("XOAUTH2");
// Note: only needed if the SMTP server requires authentication
client.Authenticate("YOUR_GMAIL_NAME", "YOUR_PASSWORD");
client.Send(message);
client.Disconnect(true);
}
根据新的 google 政策 https://googleonlinesecurity.blogspot.de/2014/04/new-security-measures-will-affect-older.html 我无法发送电子邮件。 "Less secure apps" 被考虑用于 google 不使用 OAuth 2.0 的应用程序。
我想用MailKit来解决这个问题
var message = new MimeMessage();
message.From.Add(new MailboxAddress("Joey Tribbiani", "noreply@localhost.com"));
message.To.Add(new MailboxAddress("Mrs. Chanandler Bong", "mymail@gmail.com"));
message.Subject = "How you doin'?";
message.Body = new TextPart("plain"){ Text = @"Hey" };
using (var client = new SmtpClient())
{
client.Connect("smtp.gmail.com", 587);
////Note: only needed if the SMTP server requires authentication
client.Authenticate("mymail@gmail.com", "mypassword");
client.Send(message);
client.Disconnect(true);
}
但是我有 An exception of type 'MailKit.Security.AuthenticationException' occurred in MailKit.dll but was not handled in user code.Additional information: Authentication failed.
我不想更改我的安全设置。因为我希望一切都是安全的。这就是为什么我开始使用 MailKit 而不是 System.Net.Mail
我该如何解决?
您需要做的第一件事是按照 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));
//You can also use FromPrivateKey(privateKey) where privateKey
// is the value of the field 'private_key' in your serviceName.json file
bool result = await credential.RequestAccessTokenAsync (cancel.Token);
// 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);
// use the OAuth2.0 access token obtained above
var oauth2 = new SaslMechanismOAuth2 ("mymail@gmail.com", credential.Token.AccessToken);
client.Authenticate (oauth2);
client.Send (message);
client.Disconnect (true);
}
更新:
以上解决方案适用于 Google 所指的 "Service Accounts",用于服务器到服务器的通信,但如果您希望 OAuth2 支持标准 Phone 或桌面应用程序,例如,您需要按照我在这里写的说明进行操作:https://github.com/jstedfast/MailKit/blob/master/GMailOAuth2.md
测试了以下代码并适用于我:
// STEP 1: Navigate to this page https://www.google.com/settings/security/lesssecureapps & set to "Turn On"
var message = new MimeMessage();
message.From.Add(new MailboxAddress("Joey Tribbiani", "YOU_FROM_ADDRESS@gmail.com"));
message.To.Add(new MailboxAddress("Mrs. Chanandler Bong", "YOU_TO_ADDRESS@gmail.com"));
message.Subject = "How you doin'?";
message.Body = new TextPart("plain")
{
Text = @"Hey Chandler,I just wanted to let you know that Monica and I were going to go play some paintball, you in?-- Joey"
};
using (var client = new SmtpClient())
{
client.Connect("smtp.gmail.com", 587);
// Note: since we don't have an OAuth2 token, disable
// the XOAUTH2 authentication mechanism.
client.AuthenticationMechanisms.Remove("XOAUTH2");
// Note: only needed if the SMTP server requires authentication
client.Authenticate("YOUR_GMAIL_NAME", "YOUR_PASSWORD");
client.Send(message);
client.Disconnect(true);
}