MailKit C # SmtpClient.Connect() для smtp.Office365.com выдача исключения: «Удаленный сертификат недействителен в соответствии с процедурой проверки».

#c# #smtp #office365 #mailkit

#c# #smtp #office365 #mailkit

Вопрос:

Я использую MailKit (версия 1.18.0) и получаю ошибку ниже при подключении к SMTP Office 365.

 SmtpClient client = new SmtpClient();
  

Метод подключения:

 client.Connect("smtp.Office365.com", 587, true);
  

Сообщение об ошибке: «Не удалось установить квитанцию из-за неожиданного формата пакета»

Я искал в Интернете этот сценарий и обнаружил, что для немногих людей он разрешился с помощью значения useSSL false . Затем я попытался передать false для useSSL, но получил ошибку недопустимого удаленного сертификата.

 client.Connect("smtp.Office365.com", 587, false);
  

Сообщение об ошибке: «Удаленный сертификат недействителен в соответствии с процедурой проверки».

После повторного исследования было обнаружено, что мы должны попробовать другой метод перегрузки для подключения с запуском TLS.

 client.Connect("smtp.Office365.com", 587, SecureSocketOptions.StartTls);
  

Сообщение об ошибке: «Удаленный сертификат недействителен в соответствии с процедурой проверки».

Если я запускаю приведенный ниже powershell с того же сервера, он работает нормально. Он отправляет электронную почту без проблем.

 $emailFrom = "from@example.com"
$emailto = "to@example.com"
$Subject = "Test SMTP"
$Body = "Test from Server"
$SMTPServer = "smtp.office365.com"
$SMTPClient = New-Object Net.Mail.SMTPClient($SMTPServer, 587)
$SMTPClient.enablessl = $true
$SMTPClient.Credentials = New-Object System.Net.NetworkCredential("username", "password")
$SMTPClient.Send($EmailFrom, $EmailTo, $Subject, $Body)
  

Я также пробовал описанные выше действия на порту 25, но получил те же проблемы. Эта проблема возникает только для smtp.Office365.com хост, использующий MailKit.
Любая помощь или предложения будут с благодарностью приняты.

Ответ №1:

Используйте следующий код:

 client.ServerCertificateValidationCallback = (s, c, ch, e) => true;
client.Connect("smtp.Office365.com", 587, SecureSocketOptions.StartTls);
  

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

1. Спасибо. Не могли бы вы уточнить это. Также, если бы вы могли сказать, в каком сценарии мы должны это использовать? Я использовал client. ServerCertificateValidationCallback код перед клиентом. Connect(«smtp.Office365.com «, 587, false); и это сработало без проблем.

2. false Параметр тот же, что и при использовании SecureSocketOptions.StartTlsWhenAvailable .

3. Целесообразно ли использовать client.ServerCertificateValidationCallback = (s, c, ch, e) => true; в среде Prod? Я имею в виду, что мы пропускаем этап проверки сертификата сервера.

4. Нет, это не рекомендуется. Например, MailKit 2.11.1 жестко кодирует последнюю информацию о сертификате для почтовых серверов office365, и поэтому использование client.ServerCertificateValidationCallback = (s, c, ch, e) => true; больше не требуется.

Ответ №2:

Он также работает с использованием приведенного ниже кода.

 client.ServerCertificateValidationCallback = (s, c, ch, e) => true;
client.Connect("smtp.Office365.com", 587, false);