Как отправить электронную почту с помощью MailKit?

В соответствии с новой политикой google https://googleonlinesecurity.blogspot.de/2014/04/new-security-measures-will-affect-older.html Я не могу отправить электронное письмо. "Менее безопасные приложения" считаются для Google приложений, которые не используют OAuth 2.0.

Я хотел бы использовать MailKit для решения этой проблемы

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

Но у меня есть An exception of type 'MailKit.Security.AuthenticationException' occurred in MailKit.dll but was not handled in user code.Additional information: Authentication failed.

Я не хочу менять свои настройки безопасности. Потому что я хочу, чтобы все было безопасно. Поэтому я начинаю использовать MailKit, а не System.Net.Mail

Как я могу это исправить?

Ответ 1

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

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

//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

Теперь, когда у вас есть токен доступа (credential.Token.AccessToken), вы можете использовать его с MailKit, как если бы это был пароль:

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

Ответ 2

Протестированный следующий код и работает для меня:

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

Ответ 3

У меня похожий вопрос. Я использовал код, подобный Феликсу, но отправитель всегда приходит с моей электронной почты, хотя я изменил message.from.add(...) на другой адрес электронной почты. Кто-нибудь может помочь определить проблему?

public IActionResult Contact()
        {

            ViewData["Message"] = "Your contact page.";
            //Instantiate mimemessage class
            var message = new MimeMessage();
            //From address
            message.From.Add(new MailboxAddress("wang yafeng", "[email protected]"));
            //To address
            message.To.Add(new MailboxAddress("tanqiyang",[email protected]));
            //Subject
            message.Subject = "I learnt to send an email using aspnetcore";
            //Body
            message.Body = new TextPart("plain")
            {
                Text = "I am using mailkit nuget pacakge to send email easily"
            };

            //configure and send email
            using (var client = new SmtpClient())
            {
                client.Connect("smtp.gmail.com", 587, false);
                client.AuthenticationMechanisms.Remove("XOAUTH2");
                client.Authenticate("YOUR_GMAIL_NAME", "YOUR_PASSWORD");

                client.Send(message);
                client.Disconnect(true);
            }
            return View();
        }