Опубликован: 21.11.2006 | Уровень: специалист | Доступ: платный
Лекция 7:

Протокол IMAP

Клиентская часть протокола IMAP

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

Почтовый ящик для клиента по умолчанию носит название INBOX. Все новые сообщения попадают именно в INBOX. Клиент имеет возможность создавать новые почтовые ящики (иногда называемые в программах-клиентах для работы с электронной почтой папками). Туда с целью упорядочения он может перемещать сообщения из папки INBOX.

Каждому сообщению назначается уникальный идентификатор (UID), по которому они идентифицируются в почтовом ящике. Метка UID сохраняется в течение всех сеансов IMAP для того, чтобы клиентское программное обеспечение могло правильно идентифицировать сообщения в почтовом ящике. Каждому почтовому ящику соответствует уникальный идентификатор достоверности ( UIDVALIDITY ). Метка UIDVALIDITY должна присутствовать во время всех сеансов IMAP, только в том случае, если идентификаторы сообщений в ящике оставались неизменными. Если в почтовом ящике имеются сообщения с различными идентификаторами, то значение UIDVALIDITY при следующем сеансе должно увеличиться. Это позволяет клиентам быстро определять, появились ли в почтовом ящике новые сообщения с момента последнего к нему обращения.

Каждое сообщение снабжается флагом, который отображает его статус. Флаг может быть постоянным или задаваться на время сеанса. Постоянные флаги могут изменяться клиентом и сохраняться вне зависимости от сеансов. Флаги, назначаемые на время сеанса, действительны только на время текущего сеанса IMAP. В табл. 7.1 представлены варианты флагов почтовых сообщений.

Таблица 7.1. Флаги почтового сообщения IMAP
Флаг Описание
\Seen Сообщение прочитано
\Answered На сообщение послан ответ
\Flagged Сообщение принудительно отмечено
\Deleted Сообщение удалено
\Draft Сообщение не окончено (черновик)
\Recent Новое сообщение в почтовом ящике

Почтовому сообщению может соответствовать 0 флагов или несколько флагов. Информация о флагах передается клиенту вместе с самим сообщением. В обязанности клиента входит интерпретация флагов соответствующим образом.

В следующем разделе описываются команды IMAP, которые клиент может задавать серверу. Хотя, согласно RFC, команды IMAP набираются заглавными буквами, большинство серверов IMAP воспринимает команды, заданные как заглавными, так и прописными буквами. Сервер должен отвечать соответствующим образом на заданные команды или отвечать отрицательно, если команда задана неправильно либо не поддерживается.

Команда SELECT

Команда SELECT используется, лишь когда почтовый ящик активен. По умолчанию, пока клиент не зарегистрирован в системе, ни один из принадлежащих ему почтовых ящиков не является выбранным. Далее клиент должен выбрать почтовый ящик, с которым он собирается работать. Обычно первый ящик, который выбирается клиентом, — это ящик INBOX, куда помещаются новые сообщения. Формат команды SELECT следующий:

SELECT mailbox

Здесь mailbox — это название почтового ящика, к которому обращается клиент. Во время одного сеанса IMAP может быть активен только один почтовый ящик. Если ящик существует и у клиента имеется соответствующий доступ к нему, то сервер дает многострочный ответ, где описывается состояние почтового ящика. Пример сеанса с использованием команды SELECT показан в листинге 7.4.

1 [alex@shadrach alex]$ telnet localhost 143
2 Trying 127.0.0.1...
3 Connected to localhost.
4 Escape character is '^]'.
5 * OK localhost IMAP4rev1 v12.250 server ready
6 a1 LOGIN alex drums
7 a1 OK LOGIN completed
8 a2 SELECT INBOX
9 * 2 EXISTS
10 * 1 RECENT
11 * OK [UIDVALIDITY 936033227] UID validity status
12 * OK [UIDNEXT 3] Predicted next UID
13 * FLAGS (\Answered \Flagged \Deleted \Draft \Seen)
14 * OK [PERMANENTFLAGS (\* \Answered \Flagged \Deleted \Draft \Seen)] Permanent fs
15 * OK [UNSEEN 2] first unseen message in /var/spool/mail/alex
16 a2 OK [READ.WRITE] SELECT completed
17 a3 LOGOUT
18 * BYE shadrach.smallorg.org IMAP4rev1 server terminating connection
19 a3 OK LOGOUT completed
20 Connection closed by foreign host.
21 [alex@shadrach alex]$
Листинг 7.4. Пример сеанса IMAP с использованием команды SELECT

В строке 8 пользователем alex задана команда SELECT для почтового ящика INBOX. Ответ сервера на нее представлен в строках 9–15. Строка 9 говорит о том, что в почтовом ящике находятся два сообщения, а в строке 10 показано, что одно из них новое. В строке 11 показано значение UIDVALIDITY для почтового ящика, а в строке 12 — следующий доступный UID, который будет использоваться для данного почтового ящика. Оба этих понятия описаны в начале раздела "Клиентская часть протокола IMAP".

Строки 13 и 14 отображают набор флагов, поддерживаемых для почтового ящика, — постоянных (строка 13) и действительных только на время сеанса (строка 14). Клиент может изменять значение этих флагов для каждого сообщения по своему усмотрению. Команда IMAP для изменения значения флагов STORE обсуждается далее в этой лекции.

Строка 15 также обеспечивает клиента важной информацией. Она показывает, что одно из сообщений с идентификатором UID хранится в ящике с флагом UNSEEN (непрочитанное). Благодаря этому программа-клиент может определить, какое из сообщений следует загрузить для просмотра, вместо того, чтобы загружать содержимое почтового ящика целиком. Еще один полезный параметр, содержащийся в этой строке, — местонахождение сообщения. Как видите, указано, что сообщение находится в каталоге /var/spool/mail/alex. Как правило, все почтовые программы для Linux складывают туда новую почту для пользователей.

В строке 16 показан статус почтового ящика клиента. Статус сообщает о правах пользователя на почтовый ящик. Текущий статус в нашем случае — клиент может производить чтение и запись в свой почтовый ящик. То есть клиент может прочитать любое сообщение, находящееся в ящике, или записать в него новое сообщение. Иногда клиентам дается право только на чтение писем из почтового ящика, тогда они не могут добавлять в него новые сообщения или удалять старые.

Команда EXAMINE

Команда EXAMINE как раз используется для предоставления пользователю прав только для чтения почтового ящика. Ответ сервера на команду EXAMINE такой же, как и на команду SELECT. Аргумент команды EXAMINE также может выступать имя почтового ящика, к которому она применяется. Пока почтовый ящик открыт, с помощью EXAMINE нельзя выполнять никакие действия. Таким образом, в этом режиме исключена возможность добавления или удаления флагов сообщений.

Valentin Diduk
Valentin Diduk
Украина, одесса, кпи, 2010
Евгений Олабин
Евгений Олабин
Беларусь, Гродно