2014-06-12 4 views
11

.NET prend-il en charge l'authentification SMTP via le protocole OAuth? Fondamentalement, je voudrais être en mesure d'envoyer des courriels sur les utilisateurs des utilisateurs en utilisant des jetons d'accès OAuth. Cependant, je n'ai pas trouvé de support pour cela dans le framework .NET.SMTP et OAuth 2

Google fournit certains samples pour cela dans d'autres environnements, mais pas .NET.

Répondre

9

System.Net.Mail ne prend pas en charge OAuth ou OAuth2. Cependant, vous pouvez utiliser MailKit (note: ne supporte que OAuth2) SmtpClient pour envoyer des messages aussi longtemps que vous avez le jeton d'accès OAuth de l'utilisateur (MailKit n'a pas de code qui va chercher le jeton OAuth, mais il peut l'utiliser si vous avez il).

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

Une fois que vous avez fait cela, la meilleure façon d'obtenir un jeton d'accès est d'utiliser la bibliothèque de Google Google.Apis.Auth:

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

bool result = await credential.RequestAccessTokenAsync (CancellationToken.None); 

// Note: result will be true if the access token was received successfully 

Maintenant que vous avez un jeton d'accès (credential.Token.AccessToken), vous pouvez l'utiliser avec MailKit comme si c'était le mot de passe:

using (var client = new SmtpClient()) { 
    client.Connect ("smtp.gmail.com", 587, SecureSocketOptions.StartTls); 

    // use the access token 
    var oauth2 = new SaslMechanismOAuth2 ("[email protected]", credential.Token.AccessToken); 
    client.Authenticate (oauth2); 

    client.Send (message); 

    client.Disconnect (true); 
} 
+1

Monsieur, cette bibliothèque a sauvé ma journée et a fonctionné comme un charme! Merci d'avoir partagé. – user3288287

+0

Pas de problème, content que ça a marché pour vous! – jstedfast

+0

@jstedfast: Parfait. Pouvez-vous me dire comment ajouter des pièces jointes avec l'email en utilisant mailkit? –