SMTP-клиент MailKit завершается с ошибкой «Невозможно проанализировать код состояния, возвращаемый сервером», независимо от того, что я делаю

Я пытаюсь отлаживать сообщения, отправляемые SMTP-модулем MailKit в поддерживаемом мной продукте. Поэтому я составил быструю программу на C, которая, вероятно, является худшей реализацией SMTP из когда-либо существовавших (я не опытный программист), чтобы помочь мне анализировать сообщения, генерируемые моим приложением. Приложение прослушивает порт 25 и выполняет базовое рукопожатие SMTP (без аутентификации, без SSL), поэтому я дохожу до того момента, когда MailKit выгружает сообщение, чтобы я мог увидеть, как оно отформатировано.

Когда MailKit подключается, я отправляю обратно строку «220 test.com SMTP Server», после чего происходит следующее:

  1. MailKit отвечает «EHLO hostname.domain.com».
  2. Мое приложение возвращает "250 hostname.domain.com".
  3. MailKit отправляет моему приложению «ПОЧТУ ОТ:[email protected]»

Отсюда MailKit всегда вылетает с сообщением «Невозможно проанализировать код состояния, возвращаемый сервером». Я пробовал всевозможные ответы из всех руководств по SMTP, которые я мог найти. В момент отчаяния я настроил свой производственный почтовый сервер на прием ретрансляции без аутентификации для моей подсети и выполнил pcap. Я попытался реализовать на C точно такую ​​же строку, которую я получил из pcap из постфикса (в постфиксе электронная почта выходит нормально):

char *response = "250-server.test.com\n250-SIZE 104857600\n250-STARTTLS\n250-ENHANCEDSTATUSCODE\n250-8BITMIME\n250-DNS\n250-CHUNKING\r\n";

В этом случае MailKit никогда не отправляет мне ПОЧТУ ОТ... он просто очень долго ждет ответа, прежде чем истечет время ожидания.

Мой вопрос здесь... Я не смог найти в документации MailKit (и исходный код мне не очень помог)... Каков правильный формат ответа, который примет MailKit, чтобы он продолжил отправку RCPT TO и тело сообщения?

Ошибка исходит от MailKit.Net.Smtp.SmtpStream.ReadResponse.

Отправка электронной почты с помощью Python менее чем за 1 минуту
Отправка электронной почты с помощью Python менее чем за 1 минуту
Отправка электронной почты с помощью Python - это удобный способ автоматизировать процесс отправки электронных писем. Это может быть полезно для...
0
0
158
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Измените это:

char *response = "250-server.test.com\n250-SIZE 104857600\n250-STARTTLS\n250-ENHANCEDSTATUSCODE\n250-8BITMIME\n250-DNS\n250-CHUNKING\r\n";

к этому:

char *response = "250-server.test.com\n250-SIZE 104857600\n250-STARTTLS\n250-ENHANCEDSTATUSCODE\n250-8BITMIME\n250-DNS\n250 CHUNKING\r\n";

Символ - после кода состояния SMTP сообщает клиенту, что есть как минимум еще 1 строка ответа, но в вашем коде последняя строка ответа имеет -, поэтому SmtpClient MailKit продолжает ждать дополнительных данных.

Обновлять:

Если все, что вы хотите сделать, это проверить форматирование MIME, которое делает MimeKit/MailKit, сделайте это вместо того, чтобы пытаться написать свой собственный почтовый сервер:

var options = FormatOptions.Default.Clone();
options.NewLineFormat = NewLineFormat.Dos;

message.Prepare(EncodingConstraint.EightBit);
message.WriteTo(options, "fileName.txt");

Жизнь учит! Большое спасибо. Я попробую это завтра. Это не объясняет, почему он отключается после ответа на ПОЧТУ ОТ, но мне будет легче воспроизвести то, что я вижу в своем pcap, и посмотреть, смогу ли я воспроизвести то, что происходит. Большое спасибо! Я отчитаюсь.

Shiunbird 02.04.2023 20:55

Ваш сервер, вероятно, отвечает неверным кодом состояния для команды MAIL FROM.

jstedfast 02.04.2023 22:21

Кстати, если все, что вы хотите сделать, это проверить форматирование MIME, которое делает MailKit, просто напишите сообщение в файл и посмотрите на файл. Смотрите мой обновленный ответ, как это сделать.

jstedfast 02.04.2023 22:23

Великолепно! Спасибо! После этого мне удалось получить тело сообщения. Я до сих пор не знаю, почему он не будет делать это шаг за шагом, но сейчас это не имеет значения.

Shiunbird 03.04.2023 07:23

Другие вопросы по теме

Похожие вопросы

Процедура события Microsoft Access VBA при ошибке таймера
Необработанное исключение: System.FormatException: индекс (отсчитываемый от нуля) должен быть больше или равен нулю и меньше размера списка аргументов
Маскировка адреса электронной почты с помощью рег-выражения
Какой тип ввода используется для ввода, который принимает электронную почту или имя пользователя?
Ошибка «индексы списка должны быть целыми числами или срезами, а не строками» во время цикла
Как отправить электронное письмо с подтверждением после регистрационной формы в extjs
SendAsDeniedException.MapiExceptionSendAsDenied — невозможно отправить почту через Java — даже если SMTP включен в Outlook
Объект 'tuple' не имеет атрибута 'splitlines' при отправке уведомления по электронной почте в django
Laravel: динамический контент электронной почты в API
Laravel 5.2: ожидался код ответа 220, но получен код «500» с сообщением «500 Unrecognized command»