Comment envoyer un email en utilisant MailKit?

Selon la nouvelle politique de Google, https://googleonlinesecurity.blogspot.de/2014/04/new-security-measures-will-affect-older.html Je ne peux pas envoyer de courrier électronique. Les “applications moins sécurisées” sont sockets en compte pour Google, l’application qui n’utilise pas OAuth 2.0.

J’aimerais utiliser MailKit pour résoudre ce problème

var message = new MimeMessage(); message.From.Add(new MailboxAddress("Joey Tribbiani", "[email protected]")); 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("[email protected]", "mypassword"); client.Send(message); client.Disconnect(true); } 

Mais j’ai An exception of type 'MailKit.Security.AuthenticationException' occurred in MailKit.dll but was not handled in user code.Additional information: Authentication failed.

Je ne veux pas changer mes parameters de sécurité. Parce que je veux que tout soit sécurisé. C’est pourquoi je commence à utiliser MailKit plutôt que System.Net.Mail

Comment puis-je le réparer?

La première chose à faire est de suivre les instructions de Google pour obtenir les informations d’identification OAuth 2.0 pour votre application.

Une fois cela fait, le moyen le plus simple d’obtenir un jeton d’access consiste à utiliser la bibliothèque Google.Apis.Auth de Google:

 var certificatee = new X509Certificate2 (@"C:\path\to\certificatee.p12", "password", X509KeyStorageFlags.Exportable); var credential = new ServiceAccountCredential (new ServiceAccountCredential .Initializer ("[email protected]") { // Note: other scopes can be found here: https://developers.google.com/gmail/api/auth/scopes Scopes = new[] { "https://mail.google.com/" }, User = "[email protected]" }.FromCertificate (certificatee)); //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 

Maintenant que vous avez un jeton d’access ( credential.Token.AccessToken ), vous pouvez l’utiliser avec MailKit comme s’il s’agissait du mot de passe:

 using (var client = new SmtpClient ()) { client.Connect ("smtp.gmail.com", 587); // use the OAuth2.0 access token obtained above var oauth2 = new SaslMechanismOAuth2 ("[email protected]", credential.Token.AccessToken); client.Authenticate (oauth2); client.Send (message); client.Disconnect (true); } 

Testé le code suivant et fonctionne pour moi:

  // 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", "[email protected]")); message.To.Add(new MailboxAddress("Mrs. Chanandler Bong", "[email protected]")); 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); }