如何使用MailKit发送电子邮件?

根据新的谷歌政治https://googleonlinesecurity.blogspot.de/2014/04/new-security-measures-will-affect-older.html我无法发送电子邮件。 对于不使用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的说明获取应用程序的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); } 

测试以下代码并为我工作:

  // 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); }