3.6.4. Коды ответов SMTP

В спецификации SMTP требуется, чтобы сервер отвечал на каждую команду SMTP-клиента. МТА-сервер отвечает трехзначной комбинацией цифр, называемой кодом ответа. Вместе с кодом ответа, как правило, передается одна или несколько строк текстовой информации.

Каждая цифра в коде ответа имеет определенный смысл. Первая цифра означает, было ли выполнение команды успешно (2), неуспешно (5) или еще не закончилось (3). Как указано в приложении Е документа RFC 821, простой SMTP-клиент может анализировать только первую цифру в ответе сервера, и на основании ее продолжать свои действия. Вторая и третья цифры кода ответа разъясняют значение первой. Если вы разрабатываете SMTP-приложение, обязательно изучите конструкцию всех кодов SMTP-ответа. В табл. 3.11 приведены возможные значения кодов ответа SMTP, определенные в RFC 821.

Первая цифра в коде ответа SMTP

В спецификации SMTP для первой цифры кода ответа отведено пять возможных значений. Цифра 1 означает, что сервер МТА принял команду, от клиента требуется дополнительное подтверждение. Клиент обязан послать дополнительную информацию о том, продолжать или прервать выполнение запрошенной команды. Из табл. 3.11 видно, что SMTP не имеет в составе таких команд, то есть коды ответа, начинающиеся с единицы, отсутствуют. Это образец того, как разработчики, что называется, глядели в будущее. В настоящее время команд SMTP, которые бы потребовали дополнительного подтверждения, просто нет. Однако с самого начала разработчики ориентировались на то, что такие команды появятся, и зарезервировали для них коды, начинающиеся с цифры 1.

Коды ответа, начинающиеся с цифры 2, означают, что сервер МТА успешно завершил выполнение команды и ожидает появления новой. Код ответа, начинающийся на 3, означает, что команда начала выполняться, но серверу необходима дополнительная информация для ее завершения. Пример такого кода — 354. В ответ на него клиент МТА должен приступить к передаче почтового сообщения. Код, начинающийся с цифры 4, означает, что сервер не принял команду, и она соответственно не выполнена. Однако во всех ответах серии 400 предполагается, что ошибка временная, и клиент может попытаться ее исправить. Коды ответа серии 500 также сообщают, что команда не выполнена. Кроме того, клиент не должен пытаться повторить ту же команду еще раз, по крайней мере, в составе той же последовательности.

Вторая цифра кода ответа SMTP

Вторая цифра кода ответа обозначает категорию ошибки. Цифра 0, например, обозначает синтаксическую ошибку. Команда может быть слишком длинной, иметь неправильный аргумент или, наконец, отсутствовать в списке команд сервера.

Взглянем на сообщения с кодами 211 и 214 из табл. 3.11. Обратите внимание на то, что вторая цифра кода равна единице и оба они информационного характера. Взгляните на команды с кодами 220, 221 и 421. У всех них вторая цифра — двойка, и все они имеют дело с передачей данных или с коммуникационным каналом. Коды ответов, у которых вторая цифра равна пяти (250, 450 и 550), связаны непосредственно с почтовой системой. В настоящее время в SMTP не определены значения кодов, вторая цифра которых равна трем или четырем.

Третья цифра кода ответа SMTP

В спецификации SMTP указано, что каждая отдельная строка сообщения должна иметь собственную третью цифру в коде ответа. Рассмотрим, например, сообщения с кодами от 500 до 504. Каждое сообщение означает отдельную синтаксическую ошибку. Поскольку строки, описывающие различные виды ошибок, разные, то и коды ответа должны отличаться друг от друга. Каждое сообщение об ошибке имеет свой собственный порядковый номер в данной серии. Спецификация SMTP рекомендует, но не обязывает использовать строго заданные текстовые строки в ответах МТА-сервера.

Многострочный SMTP-ответ

Как уже отмечалось, ответ МТА-сервера может состоять из нескольких строк специального формата. Каждая строка (кроме последней) многострочного ответа начинается с кода ответа, дефиса (-), текста и комбинации CRLF. Последняя строка многострочного ответа начинается с кода ответа, за которым следует пробел:

123-Первая строка сообщения из нескольких строк

123-Код ответа, 123, не изменяется

123-1 интересный момент: сообщение может начинаться с цифры

123 Последняя строка начинается не с дефиса, а с пробела

Обратите внимание на то, что за кодом каждой строки, кроме последней, следует знак дефиса (-). Это необходимо, чтобы клиент МТА смог отличить строку-продолжение ответа от последней строки. За кодом ответа в последней строке всегда следует пробел.