
это вполне возможно? И почему бы не использовать в качестве флага окончания
письма такую комбинацию байтов, которая не сможет встретиться в письме и не
иметь подобной проблемы вообще? Выбор флага из «нормальных»,
«печатаемых» символов не сложно понять – это сделано для того, чтобы
пользователи могли писать письма с помощью своего терминала (без всяких
почтовых клиентов, которые при формировании письма вставят в него
произвольные байты), на котором необходимо набрать с клавиатуры флаг
окончания письма. Как бороться с ситуацией, когда в теле письма встретится
точка, единственная в строке? Для этого в стандарте предусмотрен очень
простой механизм экранирования – если в тексте письма встречается
комбинация байтов {CR LF .} то после {.} ставится еще одна {.} и тогда в том
случае, если единственная в строке точка встречается в тесте письма, она
передается как CR LF . . CR LF, что не приводит к тому, что сервер воспринимает
данную комбинацию символов как признак окончания письма. Когда сервер
получает письмо, в котором встречается комбинация {CR LF .}, он отбрасывает
СЛЕДУЮЩУЮ точку, если же ее нет, то в таком случае далее будет идти CR LF и
сервер рассматривает это как признак окончания письма, вообще говоря,
ситуаций, когда в письме следует комбинация байтов {CR LF . произвольный
байт} быть не может, после точки может следовать только либо {.} либо {CR
LF}. Вспомним, подобный способ экранирования применялся в протоколе SLIP.
Итак, клиент начал почтовую транзакцию командой MAIL, продолжил ее
одной или несколькими командами RCPT, затем дал команду DATA и передал
серверу письмо, которое закончил комбинацией {CR LF . CR LF}. Что происходит
дальше? Дальше клиент может начать еще одну транзакцию, снова подав
команду MAIL.
Рассмотрим теперь некоторые другие команды протокола SMTP. Начнем с
команды QUIT. Данная команда передается клиентом без аргументов и
призывает сервер разорвать соединение с клиентом. Данная команда
передается тогда, когда клиент больше не имеет потребности иметь соединение
с сервером, клиент не должен разрывать соединение посылкой сегмента TCP с
флагами FIN, ACK, вместо этого он должен послать серверу SMTP команду QUIT
и после этого сервер разрывает соединение.
Следующая важная команда – RSET. Данная команда может быть передана
клиентом в процессе почтовой транзакции и является способом прервать
текущую транзакцию (Reset) и вернуться в исходное состояние, когда клиент
может начинать новую почтовую транзакцию командой MAIL. Пример
использования данной команды:
Клиент отправляет команду:
MAIL FROM:author@next.ru<CR><LF>
После этого клиент передумал отправлять письмо от данного имени и
хочет передать письмо от другого имени. Клиент не имеет права дать новую
команду MAIL, она не может перегрузить предыдущую поданную команду MAIL.
Вместо этого клиент должен передать команду
RSET<CR><LF>
После этого клиент может передавать новую команду MAIL, так как все
предыдущие команды в рамках данной транзакции отменены. Рассматриваем
еще один пример использования данной команды, пусть клиент уже передал
серверу следующие команды:
MAIL FROM:author@next.ru<CR><LF>
RCPT TO:user@mail.ru<CR><LF>
После этого клиент передумал посылать письмо данному пользователю, но
как мы знаем использование второй команды RCPT приводит к тому, что письмо