Опубликован: 21.11.2006 | Доступ: свободный | Студентов: 1812 / 140 | Оценка: 4.09 / 4.00 | Длительность: 38:34:00
Лекция 7:

Протокол IMAP

Команда SUBSCRIBE

Команда SUBSCRIBE используется для добавления почтового ящика в список активных ящиков клиента. В ней используется только один параметр — имя почтового ящика, который нужно внести в список. Все активные почтовые ящики могут отображаться с помощью команды LSUB, которая будет описана позже. Почтовый ящик не обязательно должен существовать, чтобы его можно было добавить в список активных ящиков. Эта возможность заложена для того, чтобы добавлять в список активных ящиков те, которые еще не созданы, или удалять их, если они пусты.

Команда UNSUBSCRIBE

Для удаления почтовых ящиков из списка активных используется команда UNSUBSCRIBE. С ней также может использоваться только один параметр — имя почтового ящика, который удаляется из списка активных ящиков клиента. При этом сам по себе почтовый ящик не удаляется. Он просто исключается из списка активных почтовых ящиков. Все активные почтовые ящики могут отображаться с помощью команды LSUB, которая будет описана ниже.

Команда LIST

Команда LIST используется для получения списка всех почтовых ящиков клиента. С ней используются два параметра. Формат команды LIST приведен ниже:

LIST reference mailbox

Здесь reference — каталог, где находятся почтовые ящики. Если задается пустая строка вместо этого параметра ( "" ), то почтовые ящики находятся в рабочем каталоге пользователя $HOME. Второй параметр mailbox является именем почтового ящика, который нужно просмотреть. Здесь допускается использование специальных символов, так же, как и при получении обычного списка каталогов, например группового символа ( * ). Если именем почтового ящика задана пустая строка ( "" ), то сервер будет возвращать в качестве ответа иерархический разделитель (для Linux / ) и имя корневого параметра. В листинге 7.7 представлен пример сеанса с командой LIST.

1 [alex@shadrach alexl$ 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 create new/anotherbox
9 a2 OK CREATE completed
10 a3 list "" *
11 * LIST (\NoInferiors) "/" .Xdefaults
12 * LIST (\NoInferiors \UnMarked) "/" .bash_logout
13 * LIST (\NoInferiors \UnMarked) "/" .bash_profile
14 * LIST (\NoInferiors \UnMarked) "/" .bashrc
15 * LIST (\NoSelect) "/" stuff
16 * LIST (\NoInferiors \UnMarked) "/" .mailboxlist
17 * LIST (\NoInferiors \UnMarked) "/" .bash_history
18 * LIST (\NoInferiors) "/" newbox
19 * LIST (\NoSelect) "/" new
20 * LIST (\NoInferiors) "/" new/anotherbox
21 * LIST (\NoInferiors) NIL INBOX
22 a3 OK LIST completed
23 a4 logout
24 * BYE shadrach.smallorg.org IMAP4rev1 server terminating connection
25 a4 OK LOGOUT completed
26 Connection closed by foreign host.
27 [alex@shadrach alex]$
Листинг 7.7. Пример сеанса IMAP с использованием команды LIST

В строке 8 пользователь alex выдает команду CREATE для создания нового почтового ящика. В строке 10 он выдает команду LIST с параметрами "" и *. Первый параметр говорит о том, что указанный почтовый ящик находится в рабочем каталоге пользователя $HOME. Вторым параметром задан групповой символ *. Это означает, что пользователь желает получить список всех почтовых ящиков, имеющихся в его рабочем каталоге $HOME. Строки 11–22 представляют собой ответ сервера IMAP на команду LIST. Как видите, сервер IMAP отображает намного больше информации в своем ответе, чем просто список почтовых ящиков. Сервер IMAP в нашем случае установил, что все файлы в рабочем каталоге пользователя alex имеют отношение к электронной почте. Хотя здесь возникает небольшая проблема. Дело в том, что в рабочем каталоге могут быть спрятанные файлы конфигурации. Так как пользователь alex был создан как равноправный пользователь в системе Linux, то его рабочий каталог $HOME был создан по шаблону, который находится в /etc/skel. При этом создается несколько файлов конфигурации для работы с оболочкой bash или с X Window. К сожалению все эти файлы интерпретируются сервером IMAP как почтовые ящики.

Предупреждение

При создании пользователя в операционной системе Linux только в целях отправки/получения электронной почты следует избегать обычной процедуры создания пользователя в системе или по крайней мере не забывать удалять стандартные конфигурационные файлы, которые создаются автоматически в рабочем каталоге пользователя.

И еще одно, на что следует обратить внимание при анализе листинга 7.7, — форма отображения списка почтовых ящиков после использования команды LIST. В строках 11–22 сервер IMAP изначально предполагает, что все почтовые ящики расположены на сервере. Обратите внимание на форму вывода файлов в списке. Те из них, которые не являются почтовыми ящиками, имеют флаг \NoInferior. Следует также отметить, что подкаталоги stuff и new (строки 15 и 19) помечены флагом \NoSelect, что говорит о невозможности их активации с помощью команды SELECT. Также обратите внимание, как в строке 21 команда LIST автоматически отображает почтовый ящик INBOX, хотя в рабочем каталоге не существует файла с таким именем.

Команда LSUB

Команда LSUB используется для устранения проблемы, которая описана для команды LIST. В отличие от команды LIST, с помощью которой отображается все содержимое рабочего каталога пользователя, с помощью команды LSUB отображаются лишь активизированные ранее описанной командой SUBSCRIBE почтовые ящики клиента. Параметры команды LSUB точно такие же, что и для команды LIST, т.е. ссылка ( reference ) и имя почтового ящика. Подобно команде LIST, параметр ссылки указывает путь к каталогу, в котором находятся почтовые ящики с соответствующими именами (каталог $HOME, если указано "" ). Соответственно, под именем почтового ящика понимается имя ящика или имена ящиков, которые требуется вывести в списке (допускается групповой символ ( * ).

Почтовые ящики могут затем добавляться в список активных ящиков с помощью команды SUBSCRIBE, а удаляться из списка с помощью команды UNSUBSCRIBE. С помощью этих команд можно реализовать на базе клиента IMAP чтение групп новостей. При этом каждая группа новостей реализована как отдельный почтовый ящик на сервере, на которую затем можно подписаться. Сегодня большинство программ для работы с электронной почтой включают функцию чтения групп новостей, так что выполнение этих операций в IMAP не требуется. В листинге 7.8 показан сеанс работы IMAP с использованием команды LSUB.

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.25@ server ready
6 a1 login alex drums
7 a1 OK LOGIN completed
8 a2 subscribe new/anotherbox
9 a2 OK SUBSCRIBE completed
10 a3 lsub "" *
11 * LSUB () "/" stuff/junk
12 * LSUB () "/" newbox
13 * LSUB () "/" new/anotherbox
14 a3 OK LSUB completed
15 a4 logout
16 * BYE shadrach.smallorg.org IMAP4rev1 server terminating connection
17 a4 OK LOGOUT completed
18 Connection closed by foreign host.
19 [alex@shadrach alex]$
Листинг 7.8. Пример сеанса IMAP с использованием команды LSUB

В строке 8 пользователь alex добавляет созданный в предыдущем примере почтовый ящик к списку своих почтовых ящиков. В строке 10 он выдает команду LSUB, чтобы просмотреть, какие почтовые ящики у него уже имеются. Обратите внимание: параметры, заданные с LSUB, говорят о том, что ящики находятся в его рабочем каталоге $HOME и все они должны быть показаны в списке ( * ). Ответ сервера IMAP показан в строках 11–14. Как видите, он сильно отличается от ответа, полученного с помощью команды LIST (см. листинг 7.7). В списке указаны только те почтовые ящики, на которые подписан пользователь alex. Обратите также внимание на строку 11. Как мы уже могли видеть в листинге 7.6, почтовый ящик stuff/jerk был успешно переименован. Что же произошло? А теперь вспомните, что подписка на почтовый ящик вовсе не означает, что он реально существует. Просто команда LSUB хранит в своем активном списке сведения обо всех почтовых ящиках, на которые подписан пользователь, хотя реальное состояние ящиков уже давно изменилось. Это свойство LSUB позволяет временно удалять почтовые ящики, пока они пусты, и вновь создавать их без помощи клиентов, как только в них приходят новые сообщения. Таким образом, клиентам не нужно повторять процедуру подписки на почтовые ящики.