web-dev-qa-db-fra.com

Comment envoyer des e-mails 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 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?

17
Anatoly

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);
}
13
jstedfast

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);
        }
22
Felix