Серверу SMTP требуется безопасное соединение или клиент не прошел проверку подлинности. Ответ сервера был: 5.7.57 SMTP; ошибка Office 365

#c# #email #model-view-controller #office365

#c# #Адрес электронной почты #модель-представление-контроллер #office365

Вопрос:

Попытка отправить электронное письмо через MVC 5 C #. Этот вновь созданный адрес электронной почты находится на сервере Office 365. Пробовал множество онлайн-решений, но безрезультатно. Я получаю следующее сообщение об ошибке: SMTP-серверу требуется безопасное соединение или клиент не прошел проверку подлинности. Ответ сервера был: 5.7.57 SMTP; Клиент не прошел проверку подлинности для отправки анонимной почты во время отправки почты ИЗ [LO3P265CA0018.GBRP265.PROD.OUTLOOK.COM]’. Мой код выглядит следующим образом:

   public void ConcernConfirmEmail(Appointments a, EmailConfig ec)
        {
            Dictionary<string, string> tokens = new Dictionary<string, string>();
            tokens.Add("Name", a.sirenDetail.FirstName);
            tokens.Add("Time", a.start.ToString("HH:mm"));
            tokens.Add("Date", a.start.ToString("dd/MM/yyyy"));
            tokens.Add("Location", a.site.SiteDescription);

            using (SmtpClient client = new SmtpClient()
            {
                Host = "smtp.office365.com",
                Port = 587,
                UseDefaultCredentials = false,
                DeliveryMethod = SmtpDeliveryMethod.Network,
                Credentials = new NetworkCredential(ec.EmailUser, ec.EmailPassword), 
                TargetName = "STARTTLS/smtp.office365.com",
                EnableSsl = true
            })
            {
                MailMessage message = new MailMessage()
                {
                    From = new MailAddress("emailadress@myorg.net"),
                    Subject = "Subject",
                    Sender = new MailAddress("emailadress214@myorg.net", "password"),
                    Body = PopulateTemplate(tokens, GetTemplate("ConfirmTemplate.html")),
                    IsBodyHtml = true,
                    BodyEncoding = System.Text.Encoding.UTF8,
                    SubjectEncoding = System.Text.Encoding.UTF8,
                };
                message.To.Add(a.sirenDetail.EmailAddress.ToString());
                client.Send(message);
            }

        }
 

Ответ №1:

Согласно официальной документации Microsoft, SmtpClass уже давно устарел, Microsoft рекомендует разработчикам использовать новые реализации Smtp с открытым исходным кодом, такие как MailKit.

При использовании MailKit с проверкой подлинности по имени пользователя и паролю необходимо настроить механизм проверки подлинности на использование NTLM.

Вот рабочий пример:

  public async Task Send(string emailTo, string subject, MimeMessage mimeMessage, MessagePriority messagePriority = MessagePriority.Urgent)
        {
            MimeMessage mailMessage = mimeMessage;
            mailMessage.Subject = subject;
            mailMessage.Priority = messagePriority;

            if (emailTo.Contains(';'))
            {
                foreach (var address in emailTo.Split(';'))
                {
                    mailMessage.To.Add(new MailboxAddress("", address));
                }
            }
            else
            {
                mailMessage.To.Add(new MailboxAddress("", emailTo));
            }

            mailMessage.From.Add(new MailboxAddress("Sender", _smtpCredentials.SenderAddress));

            using var smtpClient = new SmtpClient
            {
                SslProtocols = SslProtocols.Tls,
                CheckCertificateRevocation = false,
                ServerCertificateValidationCallback = (s, c, h, e) => true,
            };

            await smtpClient.ConnectAsync(_smtpCredentials.Server, _smtpCredentials.Port, SecureSocketOptions.StartTlsWhenAvailable);
            await smtpClient.AuthenticateAsync(new SaslMechanismNtlm(new NetworkCredential(_smtpCredentials.User, _smtpCredentials.Password)));

            try
            {
                await smtpClient.SendAsync(mailMessage);
            }
            catch (Exception ex)
            {

            }
            finally
            {
                if (smtpClient.IsConnected) await smtpClient.DisconnectAsync(true);
            }
        }
 

Самая важная строка здесь

 await smtpClient.AuthenticateAsync(new SaslMechanismNtlm(new NetworkCredential(_smtpCredentials.User, _smtpCredentials.Password)));
 

Это настройка NTLM в качестве механизма аутентификации для использования клиентом.

Но

Если вы не можете изменить библиотеку Smtp прямо сейчас, вы можете попробовать изменить свой код, чтобы он выглядел так, как imcurrent, использующийся в старых службах и работающий нормально:

 using (var smtpClient = new SmtpClient(smtpServer)
                {
                    UseDefaultCredentials = false,
                    DeliveryMethod = SmtpDeliveryMethod.Network,
                    Credentials = new NetworkCredential(user, password),
                    EnableSsl = false,
                    Port = 587
                })
 

Убедитесь, что изменение включено только для параметра EnableSsl, имеющего значение false, и не требуется для установки свойства TargetName.

Надеюсь, это поможет

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

1. Я также должен был убедиться, что аутентификация SMTP включена на уровне организации. Это было для конкретного почтового ящика, но этого, похоже, недостаточно. Как включить аутентификацию SMTP глобально для Office365: docs.microsoft.com/en-us/exchange /.