SMTP и OAuth 2

поддерживает ли .NET аутентификацию SMTP по протоколу OAuth? В принципе, я хотел бы иметь возможность отправлять электронные письма от пользователей, используя токены доступа OAuth. Однако я не смог найти поддержку для этого в .NET framework.

Google предоставляет некоторые образцы для этого в других средах, но не .Сеть.

1 ответов


Система.Сеть.Почта не поддерживает OAuth или OAuth2. Однако, вы можете использовать MailKit(Примечание: поддерживает только OAuth2)SmtpClient для отправки сообщений, пока у вас есть токен доступа OAuth пользователя (MailKit не имеет кода, который будет получать токен OAuth, но он может использовать его, если он у вас есть).

первое, что вам нужно сделать, это следовать инструкции Google для получения учетных данных OAuth 2.0 для вашего приложение.

как только вы это сделаете, самый простой способ получить маркер доступа-использовать Google Google.Апис.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));

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

// 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, SecureSocketOptions.StartTls);

    // use the access token
    var oauth2 = new SaslMechanismOAuth2 ("username@gmail.com", credential.Token.AccessToken);
    client.Authenticate (oauth2);

    client.Send (message);

    client.Disconnect (true);
}