Протокол POP3

Принципы работы
Протокол работы, основные команды
Пример сценария

Для небольших организаций невыгодно держать у себя систему для передачи сообщений (message transport system). Это связано с тем, что в небольших, не специализирующихся на компьютерных технологиях организациях, как правило, рабочие станции клиентов сети не имеют достаточно ресурсов (производительности или дискового пространства) для обеспечения работы полного SMTP-сервера. Кроме того, таким пользователям электронной почты может быть просто невыгодно держать персональный компьютер постоянно подключенным к Internet.

Для решения этой проблемы был разработан почтовый протокол для работы в офисе — POP (Post Office Protocol). Его наиболее распространенный вариант — РОРЗ (Протокол почтового отделения версия 3). Этот протокол позволяет рабочим станциям динамически получать доступ к своим почтовым ящикам, расположенным на сервере, предназначенном для обслуживания электронной почты в данной организации.

РОРЗ — это простейший протокол для работы пользователя с содержимым своего почтового ящика. Он позволяет только забрать почту из почтового ящика сервера на рабочую станцию клиента и удалить ее из почтового ящика на сервере. Всю дальнейшую обработку почтовое сообщение проходит на компьютере клиента.

РОРЗ -сервер не отвечает за отправку почты, он работает только как универсальный почтовый ящик для группы пользователей. Когда пользователю необходимо отправить сообщение, он должен установить соединение с каким-либо SMTP-сервером и отправить туда свое сообщение по SMTP. Этот SMTP-сервер может быть тем же хостом, где работает РОРЗ -сервер, а может располагаться совсем в другом месте.

Как правило, при работе с электронной почтой небольшие организации используют для получения своей корреспонденции РОРЗ -сервер, установленный на каком-либо компьютере в офисе, а отправляют почту по SMTP на один из хорошо доступных общеизвестных SMTP-серверов города (найти такие совсем несложно).

Принципы работы

РОРЗ- сервис, как правило, устанавливается на 110-й ТСР -порт сервера, который будет находится в режиме ожидания входящего соединения. Когда клиент хочет воспользоваться РОРЗ -сервисом, он просто устанавливает TCP-соединение с портом 110 этого хоста. После установления соединения сервис РОРЗ отправляет подсоединившемуся клиенту приветственное сообщение. После этого клиент и сервер начинают обмен командами и данными. По окончании обмена РОРЗ -канал закрывается.

Команды РОРЗ состоят из ключевых слов, состоящих из ASCII-символов, и одним или несколькими параметрами, отделяемыми друг от друга символом "пробела" — <SP>. Все команды заканчиваются символами "возврата каретки" и "перевода строки" — <CRLF>. Длина ключевых слов не превышает четырех символов, а каждого из аргументов может быть до 40 символов.

Ответы РОРЗ -сервера на команды состоят из строки статус- индикатора, ключевого слова, строки дополнительной информации и символов завершения строки — <CRLF>. Длина строки ответа может достигать 512 символов. Строка статус -индикатора принимает два значения: положительное ("+ОК") и отрицательное ("-ERR"). Любой сервер РОРЗ обязан отправлять строки статус- индикатора в верхнем регистре, тогда как другие команды и данные могут приниматься или отправляться как в нижнем, так и в верхнем регистрах.

Ответы РОРЗ -сервера на отдельные команды могут составлять несколько строк. В этом случае строки разделены символами <CRLF>. Последнюю строку информационной группы завершает строка, состоящая из символа "." (код — 046) и <CRLF>, т. е. последовательность "CRLF.CRLF".

РОРЗ -сессия состоит из нескольких частей. Как только открывается TCP-соединение и РОРЗ -сервер отправляет приветствие, сессия должна быть зарегистрирована — состояние аутентификации (AUTHORIZATION state). Клиент должен зарегистрироваться в РОРЗ -сервере, т. е. ввести свой идентификатор и пароль.

После этого сервер предоставляет клиенту его почтовый ящик и открывает для данного клиента транзакцию — состояние начала транзакции обмена (TRANSACTION state). На этой стадии клиент может считать и удалить почту своего почтового ящика.

После того как клиент заканчивает работу (передает команду QUIT), сессия переходит в состояние UPDATE — завершение транзакции. В этом состоянии РОРЗ -сервер закрывает транзакцию данного клиента (на языке баз данных — операция COMMIT) и закрывает TCP-соединение.

В случае получения неизвестной, неиспользуемой или неправильной команды, РОРЗ -сервер должен ответить отрицательным состоянием индикатора.

РОРЗ -сервер может использовать в своей работе таймер контроля времени соединения. Этот таймер отсчитывает время "бездействия" ("idle") клиента в сессии от последней переданной команды. Если время сессии истекло, сервер закрывает TCP-соединение, не переходя в состояние UPDATE (иными словами, откатывает транзакцию или на языке баз данных — выполняет ROLLBACK).

Примечание

Не забывайте, что РОРЗ -сервер может обслуживать группу клиентов, которые, возможно, присоединяются по коммутируемой линии, и, следовательно, необходимо иметь средство автоматического регулирования времени соединения. По спецификации РОРЗ -таймер контроля состояния "idle" должен быть установлен на промежуток времени не менее 10 минут.

Протокол работы, основные команды

При открытии TCP-соединения РОРЗ -клиентом, РОРЗ -сервер отправляет сообщение приветствия (далее во всех примерах РОРЗ -протокола используются следующие обозначения: С —клиент, S — сервер РОРЗ):

S: +OK РОРЗ server ready

Теперь РОРЗ -сессия находится в состоянии аутентификации (AUTHORIZATION), и клиент должен зарегистрировать себя на РОРЗ -сервере. Это может быть выполнено либо с помощью команд USER и PASS — ввод открытых пользовательского идентификатора и пароля (именно этот способ используется чаще), либо командой АРОР — аутентификация цифровой подписью, на базе секретного ключа. Любой РОРЗ -сервер должен поддерживать хотя бы один из механизмов аутентификации.

Команда USER имеет следующий формат:

USER name

Аргументом — "name" является строка, идентифицирующая почтовый ящик системы. Этот идентификатор должен быть уникальным в данной почтовой системе РОРЗ -сервера. Если ответом на эту команду является строка индикатора "+OK", клиент может отправлять команду PASS — ввод пароля или QUIT — завершить сессию. Если ответом является строка "-ERR", клиент может либо повторить команду USER, либо закрыть сессию. Примеры использования команды:

С: USER frated

S: -ERR sorry, no mailbox for frated here

ИЛИ

С: USER mrose

S: +OK mrose is a real hoopy frood

Примечание

Сервер может вернуть отрицательный ответ, если почтовый ящик существует, но по каким-либо причинам не доступен.

Команда PASS используется только после положительного ответа на команду USER:

PASS string

Аргументом команды является строка пароля данного почтового ящика. После получения команды PASS, РОРЗ -сервер, на основании аргументов команд USER и PASS, определяет возможность доступа к заданному почтовому ящику. Если РОРЗ -сервер ответил "+OK", это означает, что аутентификация клиента прошла успешно и он может работать со своим почтовым ящиком, т. е. сессия переходит в состояние TRANSACTION. Если РОРЗ- сервер ответил "-ERR", то либо был введен неверный пароль, либо не найден указанный почтовый ящик:

С: USER mrose

S: +OK mrose is a real hoopy frood

С: PASS secret

S: -ERR maildrop already locked

ИЛИ

С: USER mrose

S: +OK mrose is a real hoopy frood

C: PASS secret

S: +OK mrose's maildrop has 2 messages (320 octets)

Команда аутентификации пользователя АРОР не входит в список обязательно реализуемых команд РОРЗ -сервера. Эта команда предоставляет значительно больший (по сравнению с командами USER или PASS) уровень защиты аутентификации пользователя при открытии сессии AUTHORIZATION и используется только тогда, когда к обеспечению конфиденциальности доступа к информации почтовых ящиков предъявляются повышенные требования. Эта команда может быть передана клиентом РОРЗ -сервера после получения приветственного сообщения или после ошибки обработки команд USER/PASS.

АРОР name digest

Аргументами команды являются: name — имя пользователя (то же, что и в команде USER), digest — шифрованная (по алгоритму MD5) строка пароля. Применяемый здесь алгоритм необратимого шифрования для построения секретного ключа использует открытый ключ и временную метку. Временные метки передаются хосту клиента вместе с сообщением приветствия. Например, для UNIX-машин временная метка может иметь вид: <process-ID.clock@hostname>, где process-ID — это идентификатор процесса, clock — состояние таймера на момент установления соединения, hostname — имя компьютера РОРЗ -сервера. Этот механизм позволяет достичь очень высокой степени защищенности. Далее показан пример работы команды АРОР.

S: +OK РОРЗ server ready [email protected]

С: АРОР mrose c4c9334bac560ecc979e58001b3e22fb

S: +OK maildrop has 1 message (369 octets)

Алгоритм на основании открытого ключа "tanstaaf и временной метки

< [email protected]> построил шифрованную строку "c4c9334bac560ecc979e5800Ib3e22fb".

К командам состояния AUTHORIZATION может относиться команда закрытия РОРЗ- сессии — QUIT, если она была отправлена в режиме AUTHORIZATION (например, при вводе неправильного пароля или идентификатора пользователя):

Эта команда отправляется без аргументов и всегда имеет единственный ответ "+ОК", например:

С: QUIT

S: +ОК dewey POP3 server signing off

После того как клиент успешно прошел процедуру аутентификации в РОРЗ- сервере, и РОРЗ- сервер "закрыл" определенный почтовый ящик только для использования данным клиентом (для тех, кто работал с базами данных, это называется EXCLUSIVE ACCESS LOCK), РОРЗ- сессия переходит в режим TRANSACTION, и клиент может начать работу со своей почтой.

Команда STAT (без аргументов) используется для просмотра состояния текущего почтового ящика.

В ответ РОРЗ- сервер возвращает строку, содержащую количество и общий размер в байтах сообщений, которые клиент может получить с РОРЗ- сервера. Сообщения, помеченные на удаление, не учитываются. Формат ответа: "+ОК nn mm", где nn — количество сообщений, mm — их общий объем:

С: STAT

S: +ОК 2 320

В этом примере РОРЗ -сервер сообщает, что в данном почтовом ящике находятся два сообщения общим объемом 320 байт.

После того как РОРЗ -сервер открыл почтовый ящик, он присваивает каждому сообщению номер и устанавливает его размер в байтах. Первому сообщению присваивается число 1, второму — 2 и т. д. Далее во всех командах, относящихся к сообщениям, РОРЗ -сервер ссылается на сообщения по их номерам и указывает их размер только в десятичном виде.

Команда LIST может передаваться как с аргументом msg — номером сообщения, так и без аргумента:

LIST [msg]

Если команда содержит аргумент, и сообщение с указанным номером существует, ответом на нее будет "информационная строка", которая содержит номер сообщения и размер сообщения в байтах. Если аргумент не указан — ответом будет список информационных строк обо всех сообщениях в данном почтовом ящике. Сообщения, помеченные на удаление не фигурируют в этом списке:

С: LIST

S: +ОК 2 messages (320 octets)

S: 1 120

S: 2 200

S: .

ИЛИ

С: LIST 2

S: +ОК 2 200

ИЛИ

С: LIST 3

S: -ERR no such message, only 2 messages in maildrop

Следующая команда — команда RETR — используется для передачи клиенту запрашиваемого сообщения:

RETR msg

Аргумент команды — номер сообщения. Если запрашиваемого сообщения нет, возвращается отрицательный индикатор "-ERR".

С: RETR 1

S: +ОК 120 octets

S: <text message>

S: .

После получения, сообщение, как правило, помечается на удаление из почтового ящика, при этом используется команда DELE:

DELE msg

Аргумент команды— номер сообщения. Сообщения, помеченные на удаление, реально удаляются только после закрытия транзакции, на стадии UPDATE.

С: DELE 1

S: +ОК message 1 deleted

ИЛИ

С: DELE 2

S: -ERR message 2 already deleted

Для проверки состояния соединения с РОРЗ- сервером используется команда NOOP. При активном соединении ответом на нее будет положительный индикатор "+ОК":

С: NOOP

S: +ОК

Для отката транзакции внутри сессии используется команда RSET (без аргументов). Если пользователь случайно Пометил на удаление какие-либо сообщения, он может убрать эти пометки, отправив эту команду:

 

С: RSET

S: +OK maildrop has 2 messages (320 octets)

После того как пользователь проделал в режиме TRANSACTION все необходимые действия, он должен перейти в режим UPDATE. Для этого клиент РОРЗ отправляет команду QUIT. По этой команде все сообщения, помеченные на удаление, реально уничтожаются в почтовом ящике. Если сессия TRANSACTION завершается каким-либо другим способом (сбой сервера, сети или др.) никаких изменений в состоянии почтового ящика не происходит.

РОРЗ- сервер может поддерживать еще несколько команд, которые предоставляют пользователю большую свободу в манипулировании сообщениями, но которые не входят в список обязательных для реализации команд, т. е. ваш РОРЗ- сервер может их и не поддерживать. Одной из таких команд является команда ТОР:

TOP msg n

По этой команде пользователь может получить "n" первых строк сообщения с номером "msg". РОРЗ- сервер по запросу клиента отправляет заголовок сообщения, затем пустую строку, затем требуемое количество строк сообщения (если количество строк в сообщении меньше указанного в параметре "n", пользователю передается все сообщение).

С ТОР 1 10

S +OK

S <header>

S <blank>

S <message body>

S .

Различные расширения РОРЗ- протокола могут включать в себя другие команды или поддерживать расширения описанных команд. Эту или другую дополнительную информацию вы можете найти в соответствующих RFC, но большинство РОРЗ- систем работают только с набором описанных выше команд.

Пример сценария

Ниже приведена стандартная сессия работы с РОРЗ -протоколом.

S: <wait for connection on TCP port 110>

C: <open connection>

S: +OK РОРЗ server ready

С: USER mrose

S: +OK mrose is a real hoopy frood

С: PASS secret

S: +OK mrose's maildrop has 2 messages (320 octets)

С: STAT

S: +OK 2 320

С: LIST

S: +OK 2 messages (320 octets)

S: 1 120

S: 2 200

S: .

С: RETR 1

S: +OK 120 octets

S: <the РОРЗ server sends message 1>

S: .

С: DELE 1

S: +OK message 1 deleted

С: RETR 2

S: +OK 200 octets

S: <the РОРЗ server sends message 2>

S: .

С: DELE 2

S: +OK message 2 deleted

С: QUIT

S: +OK dewey РОРЗ server signing off (maildrop empty)

С: <close connection>

S: <wait for next connection>

Простота протокола POP, которая послужила росту его популярности вначале, обернулась затем отсутствием гибкости и невозможности выполнять другие операции управления почтовыми ящиками. На смену РОРЗ пришло новое поколение протоколов работы с электронной почтой — протоколы IMAP.

Литература

Информацию о протоколе РОРЗ можно найти в: RFC-1081, RFC-1082, RFC-1225, RFC-1725, RFC-1939.