Selon la nouvelle politique de Google https://googleonlinesecurity.blogspot.de/2014/04/new-security-measures-will-affect-older.html Je ne peux pas envoyer d'e-mail. Les "applications moins sécurisées" sont considérées pour google l'application qui n'utilise pas OAuth 2.0.
Je souhaite 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", "[email protected]"));
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 souhaite pas modifier mes paramètres 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 que vous devez faire est de suivre les instructions de Google pour obtenir OAuth 2.0 informations d'identification pour votre application.
Une fois que vous avez fait cela, la façon la plus simple d'obtenir un jeton d'accès est d'utiliser la bibliothèque Google.Apis.Auth de Google:
var certificate = new X509Certificate2 (@"C:\path\to\certificate.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 (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
Maintenant que vous disposez d'un jeton d'accès (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);
}