Я пытаюсь отлаживать сообщения, отправляемые SMTP-модулем MailKit в поддерживаемом мной продукте. Поэтому я составил быструю программу на C, которая, вероятно, является худшей реализацией SMTP из когда-либо существовавших (я не опытный программист), чтобы помочь мне анализировать сообщения, генерируемые моим приложением. Приложение прослушивает порт 25 и выполняет базовое рукопожатие SMTP (без аутентификации, без SSL), поэтому я дохожу до того момента, когда MailKit выгружает сообщение, чтобы я мог увидеть, как оно отформатировано.
Когда MailKit подключается, я отправляю обратно строку «220 test.com SMTP Server», после чего происходит следующее:
Отсюда 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.
Измените это:
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");
Ваш сервер, вероятно, отвечает неверным кодом состояния для команды MAIL FROM.
Кстати, если все, что вы хотите сделать, это проверить форматирование MIME, которое делает MailKit, просто напишите сообщение в файл и посмотрите на файл. Смотрите мой обновленный ответ, как это сделать.
Великолепно! Спасибо! После этого мне удалось получить тело сообщения. Я до сих пор не знаю, почему он не будет делать это шаг за шагом, но сейчас это не имеет значения.
Жизнь учит! Большое спасибо. Я попробую это завтра. Это не объясняет, почему он отключается после ответа на ПОЧТУ ОТ, но мне будет легче воспроизвести то, что я вижу в своем pcap, и посмотреть, смогу ли я воспроизвести то, что происходит. Большое спасибо! Я отчитаюсь.