SMTP и OAuth 2

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

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

Ответ 1

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

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

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

Теперь, когда у вас есть токен доступа (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 ("[email protected]", credential.Token.AccessToken);
    client.Authenticate (oauth2);

    client.Send (message);

    client.Disconnect (true);
}