Причина, по которой необходимы сны, заключается в том, что SMTP является «диалоговым». После того, как сервер получает строку, он что-то отвечает. Клиент отвечает, и сервер отвечает. Однако TCP не заботится о содержимом. (Особое значение здесь имеют разрывы строк.) TCP получает поток данных и место назначения. Он отсекает согласованное (на более низком уровне, чем ваше приложение, поэтому это вне вашего контроля) количество октетов данных и отправляет их. И повторять до готовности.
Проблема в том, что когда сервер получает TCP-сегмент с разрывом строки, шансы (negotiated_octet_count = 1) заключаются в том, что некоторое количество следующей строки будет включено. В этот момент сервер говорит: «Вы не даете мне говорить, так что это не разговор, и мы не собираемся продолжать».
Так вот почему ваша первая попытка не удалась. Причина, по которой ваша вторая попытка увенчалась успехом, заключается в том, что netcat не требует, чтобы каждый сегмент TCP был заполнен. Он работает с потоками, а не с файлами. Таким образом, netcat не работает до EOF. Он работает до тех пор, пока не закроется стандартный ввод (или не истечет время ожидания, если вы его укажете). И когда стандартный ввод «задерживает», он отправляет то, что у него есть. Это гарантирует, что ваш сервер получит сегмент TCP, который заканчивается разрывом строки. Вы, вероятно, обнаружите, что ваш сервер может обрабатывать спящий режим намного меньше 1 секунды. Я использую 0,05, но вы можете использовать 0,1, чтобы обеспечить некоторую безопасность.
здесь я привел пример, но я Я собираюсь повторить это, потому что ваше цитирование очень необычно для меня.
$ cat email_msg.txt
HELO localhost
MAIL FROM:<[email protected]>
RCPT TO:<[email protected]>
DATA
From: [IES] <[email protected]>
To: <[email protected]>
Date: Fri, 27 Oct 2017 06:14:11 +0000
Subject: Test Message
Hi there! This is supposed to be a real email...
Have a good day!
-- System
.
QUIT
$ function slowcat(){ cat "$1" | while read; do sleep .05; echo "$REPLY"; done; }
$ slowcat email_msg.txt | nc localhost 25
220 et3 ESMTP Exim 4.89 Fri, 27 Oct 2017 06:18:14 +0000
250 et3 Hello localhost [::1]
250 OK
250 Accepted
354 Enter message, ending with "." on a line by itself
250 OK id=1e7xyA-0000m6-VR
221 et3 closing connection
person
Bruno Bronosky
schedule
01.05.2018