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