В RFC 821 говорится, что команда сброса (RSET
) может быть отправлена после команды DATA
и отправлены некоторые почтовые данные:
Однако чем отличается почтовый клиент, отправляющий команду RSET
после DATA
, и сообщение, содержащее слово «RSET» в отдельной строке?
Я также проверил RFC 5321 и не вижу ничего, что могло бы смягчить или избежать этого. Он действительно говорит об экранировании почтовой строки, которая начинается с «.», Но не «RSET».
Клиент не может прекратить передачу почтовых данных с точкой в строке сам по себе, или сервер отправит частично полученное письмо.
Я полагаю, что есть что-то, что я пропустил в RFC, иначе я не могу избавиться от мысли, что либо во многих реализациях существует вектор атаки внедрения команды SMTP, либо никто никогда не сможет отправить письмо с «RSET» в отдельной строке (Думаю, люди заметили бы).
Я считаю, что ключевое слово здесь - после. Команда DATA
выполняется до тех пор, пока она не завершится с одиночным .
в строке.
Достаточно справедливо, за исключением того, что в RFC для RSET
указано, что «Все сохраненные данные об отправителе, получателях и почте должны быть отброшены». Если RSET
не может использоваться между DATA
и .
, а .
завершит почтовую транзакцию и отправит почту, в какой ситуации RSET
когда-либо будет иметь почтовые данные, которые нужно отбросить?
Вероятно, поэтому этот отрывок был удален из 5321. Вы заметите, что 5321 косвенно заменяет 821 (через 2821).
@tripleee - RFC 5321 § 4.1.1.5 (RSET) заявляет, что «любые сохраненные отправитель, получатели и почтовые данные ДОЛЖНЫ быть отброшены», чтобы они, по крайней мере, там остались. См. Также мой ответ.
В RFC 5321 § 4.1.1.5 (RSET) указано, что «любые сохраненные данные об отправителе, получателях и почте ДОЛЖНЫ быть отброшены». Это относится к командам MAIL FROM
, RCPT TO
и, предположительно, DATA
.
Однако после приема .
, следующего за DATA
, сообщение «ДОЛЖНО» быть доставлено (что может привести к сбою, но не к частичному отказу, см. § 4.1.1.4). Это очищает буфер от всего, что должен делать RSET
.
Это означает, что RSET
просто вызывает ответ 250 OK
от принимающего сервера (keep-alive, очень похоже на NOOP
) и подтверждает отправителю, что действительно нет сохраненного отправителя или получателя в очереди для следующего сообщения.
Я не знаю, как прервать команду DATA
для выдачи RSET
. Единственный известный мне способ сделать это - разорвать соединение и установить новое - и, чтобы быть в безопасности в случае какой-то нечетной возможности возобновления, я бы выпустил RSET
сразу после EHLO
или HELO
(который В спецификации указано, что это NOOP
). Если бы такой способ был, он должен быть в RFC 5321 § 4.1.1.4, § 4.1.1.5 и / или § 3.3.
Правильный. После запуска команды
DATA
вы не можете прервать ее, кроме как разорвать соединение.