Что можно сделать, чтобы предотвратить этот сбой SMTP MailKit?

#c# #wpf #smtp #mailkit

Вопрос:

Я использую рекомендуемый класс MailKit.Net.Smtp в своем приложении WPF C#, в котором пользователь(клиент) отправляет файл журнала из и в выделенный Gmail, нажав кнопку. Но когда я попробовал на компьютере друга, я получил исключение. (Я сталкиваюсь с этим и этим вопросом, но в моем случае я не знаю, как использовать его для C#)

Код, который я использую:

         using (var client = new SmtpClient())
        {
            try
            {
                
                client.SslProtocols = SslProtocols.Ssl3 | SslProtocols.Tls | SslProtocols.Tls11 | SslProtocols.Tls12;
                client.Connect("smtp.gmail.com", 465, true);

                client.AuthenticationMechanisms.Remove("XOAUTH2");

                
                 client.Authenticate(login, password);
                 client.Send(message);

            }

            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
                throw;
            }
            finally
            {
                client.DisconnectAsync(true);
                client.Dispose();
            }
           
        }
 

И вот исключение зарегистрировано:

 Warning: 534: 5.7.14 <https://accounts.google.com/signin/continue?sarp=1amp;scc=1amp;plt=AKgnsbt
5.7.14 M0QLqwGEsymkDwo_w1PdtomM64NjeHlfRTxHSCRLrHD4dWryXDkqTLOTTdXp3j_w0jh5x
5.7.14 23oVaJfk24KAG9mFqOrGF1US1WDZx2PRou0xeN9x9s3iRl9Ash2T54rY_wMpsVtw>
5.7.14 Please log in via your web browser and then try again.
5.7.14  Learn more at
5.7.14  https://support.google.com/mail/answer/78754 t17sm1641881ljt.1 - gsmtp: MailKit.Security.AuthenticationException: 534: 5.7.14 <https://accounts.google.com/signin/continue?sarp=1amp;scc=1amp;plt=AKgnsbt
5.7.14 M0QLqwGEsymkDwo_w1PdtomM64NjeHlfRTxHSCRLrHD4dWryXDkqTLOTTdXp3j_w0jh5x
5.7.14 23oVaJfk24KAG9mFqOrGF1US1WDZx2PRou0xeN9x9s3iRl9Ash2T54rY_wMpsVtw>
5.7.14 Please log in via your web browser and then try again.
5.7.14  Learn more at
5.7.14  https://support.google.com/mail/answer/78754 t17sm1641881ljt.1 - gsmtp ---> MailKit.Net.Smtp.SmtpCommandException: 5.7.14 <https://accounts.google.com/signin/continue?sarp=1amp;scc=1amp;plt=AKgnsbt
5.7.14 M0QLqwGEsymkDwo_w1PdtomM64NjeHlfRTxHSCRLrHD4dWryXDkqTLOTTdXp3j_w0jh5x
5.7.14 23oVaJfk24KAG9mFqOrGF1US1WDZx2PRou0xeN9x9s3iRl9Ash2T54rY_wMpsVtw>
5.7.14 Please log in via your web browser and then try again.
5.7.14  Learn more at
5.7.14  https://support.google.com/mail/answer/78754 t17sm1641881ljt.1 - gsmtp
   --- End of inner exception stack trace ---
   at MailKit.Net.Smtp.SmtpClient.<AuthenticateAsync>d__87.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at MailKit.Net.Smtp.SmtpClient.Authenticate(Encoding encoding, ICredentials credentials, CancellationToken cancellationToken)
   at MailKit.MailService.Authenticate(Encoding encoding, String userName, String password, CancellationToken cancellationToken)
   at Cont.MainWindow.SendEmailFromClient() 6/28/2021 9:40:27 PM
 

Теперь мое приложение WPF может быть запущено в другой части мира, и мне нужно получить файл журнала и исправить эту ошибку при отправке. Я уже включил «Разрешить менее безопасные приложения» и смог получать электронные письма со своего компьютера. Но почему-то этого недостаточно.

Ответ №1:

Сообщение об ошибке с сервера в журналах сообщает вам точно, что вам нужно сделать. Вам необходимо войти в Google Mail с компьютера, с которого вы подключаетесь к протоколу SMTP (в данном случае с компьютера вашего друга).

Это мера предосторожности Google, и она не позволит вам пройти аутентификацию на SMTP-сервере до тех пор, пока вы не войдете в систему через веб-браузер.

Возможно, вы сможете обойти эту проблему, используя пароль для конкретного приложения. Где-то в настройках почты Google вы можете сгенерировать пароли для конкретных приложений для этой цели.

Комментарии:

1. Спасибо вам за ответ. Но если я отправлю свое приложение клиенту, я не хочу, чтобы он входил в систему электронной почты через браузер. Логин и пароль встроены в код. На самом деле я нажал accounts.google.com/DisplayUnlockCaptcha с моего компьютера и позвонил своему другу, чтобы снова запустить программу, и она сработала. Поэтому он ничего не делал с помощью браузера, но я нажал на accounts.google.com/DisplayUnlockCaptcha с моего компьютера. Но я хотел бы устранить эту проблему для других клиентов.

2. Вот почему я предложил пароли для конкретных приложений-я считаю, что они позволяют обойти необходимость входа в систему через веб — браузер.

3. Спасибо, я постараюсь!