В этой лекции
В предыдущей лекции обсуждался протокол POP3, который является одним из наиболее популярных протоколов для получения почтовых сообщений с сервера электронной почты. Хотя протокол POP3 легко реализуется практически в любой операционной системе, он имеет ряд недостатков. Наиболее серьезный из них — отсутствие возможностей по управлению перемещением и хранением сообщений на сервере. Сообщения, как правило, загружаются с почтового сервера все сразу, после чего они с сервера удаляются, т.е. отсутствует возможность выбирать сообщения для получения. Такая схема хороша лишь для провайдера Internet, обслуживающего почтовый сервер вашей организации, так как при этом экономится дисковое пространство на сервере. Однако пользователей такая ситуация не удовлетворяет, поскольку при приеме почты они ограничены лишь одним ПК, на который загружаются сообщения. Когда пользователи получают почту по локальной сети и только на определенный ПК, то проблема не возникает. Если же они пожелают получать почту и на работе, и дома, то сразу появляется много проблем. В этом случае сообщения распределяются после получения между двумя рабочими станциями, которые к тому же расположены в различных местах!
Для решения подобных проблем был
разработан новый протокол. Протокол Internet Mail
Access Protocol (IMAP), разработанный в Вашингтонском
университете, предполагает возможность
получения пользователями электронной
почты из одного почтового ящика из
различных мест, при этом сообщения не
распределяются между точками получения.
Пользователю предоставляется возможность
управлять сообщениями в его почтовом ящике
и дополнительными функциями по
обслуживанию почтовых ящиков на сервере.
Конечно, есть и обратная сторона этой
медали — почтовый сервер под
управлением ОС Linux должен обслуживать всю
почту, которая находится на его жестком
диске. Это может создать
В этой лекции мы расскажем о работе протокола IMAP и способах его реализации в операционной системе Linux. Текущая версия IMAP — 4 с номером реализации 1 или сокращенно IMAP4rev1. Этот протокол полностью описан в документе RFC 2060.
Как и POP3, протокол IMAP использует концепцию клиент-сервер с набором команд. С помощью команд осуществляется передача сообщений электронной почты от сервера клиенту. Клиент устанавливает для этой цели TCP-соединение с портом 143 на сервере. Далее сервер должен ответить специальным сообщением-приглашением. В листинге 7.1 приведен пример сеанса по протоколу IMAP.
1 [jessica@shadrach jessical$ telnet localhost 143 2 Trying 127.0.0.1 ... 3 Connected to localhost. 4 Escape character is '^]'. 5 * OK shadrach.smallorg.org IMAP4revl V12.250 server ready 6 a001 LOGOUT 7 * BYE shadrach.smallorg.org IMAP4rev1 server terminating connection 8 a001 OK LOGOUT completed 9 Connection closed by foreign host. 10 [jessica@snadrach jessica]$
В строке 1 показана команда на
открытие сеанса с помощью telnet
с портом 143 (порт IMAP по умолчанию). Строка 5
отображает приглашение, выданное сервером
IMAP. В строке 6 клиентом задана команда
закончить сеанс с сервером. Затем сервер
посылает сообщение об окончании сеанса (строка
7) и закрывает соединение с клиентом.
Каждая команда, выдаваемая
клиентом, предваряется уникальным
идентификатором. Сервер может затем
использовать этот идентификатор в своих
ответах, что позволяет клиенту определить,
к какой команде относится ответ сервера.
Это особенно важно при выполнении сервером
нескольких команд за сеанс. Идентификатор
обычно представляет собой короткую строку
алфавитно-цифровых символов, которая
генерируется клиентом. Так, в строке 6
листинга 7.1 клиентом был выбран
идентификатор a001.
Если бы клиенту потребовалось задавать и
другие команды, то следующим
идентификатором был бы a002
и т.д. Часто для упрощения
идентификаторы команд в течение сеанса IMAP
просто последовательно увеличивают один из
своих разрядов.
После установления соединения клиент находится в состоянии ожидания проверки подлинности, так как для выполнения каких-либо операций со своим почтовым ящиком на сервере он должен идентифицировать себя. После идентификации на сервере клиент может использовать команды IMAP для управления сообщениями на сервере. Протоколом IMAP предусмотрена возможность поддержки пользователем нескольких почтовых ящиков на одном сервере. При этом клиент может читать, отправлять и удалять сообщения в любом из принадлежащих ему почтовых ящиков. Это серьезный шаг вперед, по сравнению с протоколом POP3.
Так же как и в протоколе POP3, в IMAP имеется несколько методов проверки подлинности клиента. Некоторые из них обеспечивают больший уровень безопасности, по сравнению с другими. В отличие от клиентов POP3, клиенты IMAP часто проводят довольно длительные сеансы с сервером при обработке сообщений. Таким образом, идентификатор пользователя и пароль не передаются по сети несколько раз в час, как это обычно происходит при работе по протоколу POP3. Несомненно, что передача идентификатора пользователя и пароля в зашифрованном виде остается актуальной и применяется по мере возможности.
Команда LOGIN
позволяет клиенту при регистрации на
сервере IMAP использовать идентификатор
пользователя и пароль в обычном текстовом
виде. Хотя это и не наилучший метод, все же
иногда это единственная возможность
подключиться к серверу. В листинге 7.2
представлен сеанс IMAP с использованием
команды LOGIN.
1 [katie@shadrach katie]$ 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 a001 LOGIN katie boxcar 7 a001 OK LOGIN completed 8 a002 LOGOUT 9 * BYE shadrach.smallorg.org IMAP4rev1 server terminating connection 10 a002 OK LOGOUT completed 11 Connection closed by foreign host. 12 [katie@shadrach katie]$
В строке 6 вы видите, как
пользователь katie
регистрируется на сервере IMAP с помощью
команды LOGIN. В
строке 7 показан ответ сервера. Обратите
внимание, что сервер в ответе указал
идентификатор команды клиента ( a001 ).
С помощью команды AUTHENTICATE
клиент может использовать при регистрации
на сервере IMAP альтернативные методы
проверки подлинности. Индивидуальная
проверка подлинности пользователей не
является обязательной и поддерживается не
всеми серверами IMAP. К тому же реализации
такой проверки могут различаться в
зависимости от сервера. Когда клиент выдает
команду AUTHENTICATE,
сервер отвечает на нее строкой вызова в
кодировке base64. Далее в обязанности клиента
входит ответ на вызов сервера о проверке
подлинности, также закодированный base64. Если
на сервере не поддерживается метод
проверки подлинности, предложенный
клиентом, он включает в свой ответ
отрицательное слово NO.
После этого клиент должен продолжить
переговоры по согласованию метода проверки
подлинности. Если все попытки определить
метод проверки подлинности потерпели
неудачу, то клиент предпринимает попытку
зарегистрироваться на сервере посредством
команды LOGIN.
Пример сеанса с применением AUTHENTICATE
представлен в листинге 7.3.
1 [riley@shadrach riley]$ 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 AUTHENTICATE KERBEROS_V4 7 a1 NO AUTHENTICATE KERBEROS_V4 failed 8 a2 AUTHENTICATE GSSAPI 9 a2 NO AUTHENTICATE GSSAPI failed 10 a3 AUTHENTICATE LOGIN 11 + VXNlciBOYU1lAA== 12 * 13 a3 NO AUTHENTICATE LOGIN failed 14 a4 LOGIN riley firetruck 15 a4 OK LOGIN completed 16 a5 LOGOUT 17 * BYE shadrach.smallorg.org IMAP4rev1 server terminating connection 18 a5 OK LOGOUT completed 19 connection closed by foreign host. 20 [riley@shadrach riley]$
В строках 6–9 показаны попытки
клиента согласовать с сервером IMAP метод
проверки подлинности. Как видите, все они не
увенчались успехом. А в строке 10 показано,
что метод проверки, приемлемый и для
клиента, и для сервера, найден. Отвечая,
сервер в строке 11 выдает кодированную
строку с вызовом в кодировке base64. Однако в
строке 12 клиент отвергает попытку
регистрации и возобновляет ее лишь в строке
14 с помощью команды LOGIN.
После регистрации на сервере IMAP клиент может приступить к манипулированию сообщениями. Протокол IMAP предлагает довольно много команд для чтения, перемещения и удаления почтовых сообщений в почтовых ящиках на сервере. Помните, что протокол IMAP предполагает хранение всех сообщений на сервере. Загрузка почтовых сообщений на локальный компьютер производится лишь для отображения. При этом они не перемещаются и не копируются на локальный ПК клиента.
Почтовый ящик для клиента по
умолчанию носит название INBOX.
Все новые сообщения попадают именно в INBOX. Клиент имеет возможность создавать
новые почтовые ящики (иногда называемые в
программах-клиентах для работы с
электронной почтой папками). Туда с целью
упорядочения он может перемещать сообщения
из папки INBOX.
Каждому сообщению назначается
уникальный идентификатор (UID), по которому
они идентифицируются в почтовом ящике.
Метка UID сохраняется в течение всех сеансов
IMAP для того, чтобы клиентское программное
обеспечение могло правильно
идентифицировать сообщения в почтовом
ящике. Каждому почтовому ящику
соответствует уникальный идентификатор
достоверности ( UIDVALIDITY ).
Метка UIDVALIDITY
должна присутствовать во время всех
сеансов IMAP, только в том случае, если
идентификаторы сообщений в ящике
оставались неизменными. Если в почтовом
ящике имеются сообщения с различными
идентификаторами, то значение UIDVALIDITY при следующем сеансе должно
увеличиться. Это позволяет клиентам быстро
определять, появились ли в почтовом ящике
новые сообщения с момента последнего к нему
обращения.
Каждое сообщение снабжается флагом, который отображает его статус. Флаг может быть постоянным или задаваться на время сеанса. Постоянные флаги могут изменяться клиентом и сохраняться вне зависимости от сеансов. Флаги, назначаемые на время сеанса, действительны только на время текущего сеанса IMAP. В табл. 7.1 представлены варианты флагов почтовых сообщений.
| Флаг | Описание |
|---|---|
\Seen |
Сообщение прочитано |
\Answered |
На сообщение послан ответ |
\Flagged |
Сообщение принудительно отмечено |
\Deleted |
Сообщение удалено |
\Draft |
Сообщение не окончено (черновик) |
\Recent |
Новое сообщение в почтовом ящике |
Почтовому сообщению может соответствовать 0 флагов или несколько флагов. Информация о флагах передается клиенту вместе с самим сообщением. В обязанности клиента входит интерпретация флагов соответствующим образом.
В следующем разделе описываются команды IMAP, которые клиент может задавать серверу. Хотя, согласно RFC, команды IMAP набираются заглавными буквами, большинство серверов IMAP воспринимает команды, заданные как заглавными, так и прописными буквами. Сервер должен отвечать соответствующим образом на заданные команды или отвечать отрицательно, если команда задана неправильно либо не поддерживается.
Команда 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]$
В строке 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
такой же, как и на команду SELECT.
Аргумент команды EXAMINE
также может выступать имя почтового ящика,
к которому она применяется. Пока почтовый
ящик открыт, с помощью EXAMINE нельзя выполнять никакие действия.
Таким образом, в этом режиме исключена
возможность добавления или удаления флагов
сообщений.
Команда CREATE
используется для создания нового почтового
ящика на сервере IMAP. Имя и местоположение
новых почтовых ящиков определяются в
соответствии с общими спецификациями ОС Linux.
В рабочем каталоге пользователя создается
новый почтовый ящик с именем, но без задания
местоположения, так как оно известно
каталогу $HOME
клиента. Например, если рабочий каталог
клиента находится в /home/riley
и клиент задает команду CREATE
для создания нового почтового ящика stuff/,
то вновь созданный ящик на почтовом сервере
под управлением ОС Linux будет иметь путь /home/riley/stuff/.
В этом примере вы видите, как используется
знак разделителя /.
Однако это не является общим для всех
серверов IMAP.
Папки или почтовые ящики?
Некоторые программы IMAP-клиенты используют термин папка по отношению к новым почтовым ящикам. Многие из них позволяют пользователям также создавать их с определенным уровнем вложенности, так что будьте осторожны при создании новых папок (почтовых ящиков). С ростом длины пути к почтовому ящику становится все трудней обслуживать его.
В листинге 7.5 представлен пример сеанса IMAP по созданию нового почтового ящика, который затем делается активным.
1 [alex@shadrach alex]$ ls -l 2 total 0 3 [alex@shadrach alex]$ telnet localhost 143 4 Trying 127.0.0.1... 5 Connected to localhost. 6 Escape character is '^]'. 7 * OK localhost IMAP4rev1 V12.250 server ready 8 a1 LOGIN alex drums 9 a1 OK LOGIN completed 10 a2 CREATE stuff/junk 11 a2 OK CREATE completed 12 a3 SELECT stuff/junk 13 * 0 EXISTS 14 * 0 RECENT 15 * OK [UIDVALIDITY 936998958] DID validity status 16 * OK [UIDNEXT 1] Predicted next UID 17 * FLAGS (\Answered VFlagged \Deleted \Draft \Seen) 18 * OK [PERMANENTFLAGS (\* \Answered \Flagged \Deleted \Draft \Seen)] Permanent fs 19 a3 OK [READ-WRITE] SELECT completed 20 a4 LOGOUT 21 * BYE shadrah.smallorg.org IMAP4rev1 server terminating connection 22 a4 OK LOGOUT completed 23 Connection closed by foreign host. 24 [alex@shadrach alex]$ ls -lR 25 .: 26 total 1 27 drwx------ 2 alex alex 1024 Sep 10 16:29 stuff 28 29 stuff: 30 total 1 31 -rw------ 1 alex alex 516 Sep 10 16:29 junk 32 [alex@shadrach alex]$
В строке 1 показано, как
пользователь alex
задает команду просмотра в своем рабочем
каталоге. В строке 3 он устанавливает
соединение с локальным сервером IMAP с
помощью telnet.
После регистрации на сервере он задает
команду CREATE в
строке 10 для создания нового почтового
ящика в системе. В строке 11 вы видите
положительный ответ сервера, который
сигнализирует о том, что новый почтовый
ящик был создан. Затем пользователь alex
пытается получить доступ к новому ящику
через команду SELECT (строка
12). В строках 13–19 показан ответ сервера IMAP с
информацией о новом почтовом ящике (в нем
отсутствуют как новые, так и старые
сообщения). После того как пользователь alex
убедился в работоспособности нового
почтового ящика, он завершает сеанс работы
с сервером IMAP. И завершает приведенный
пример еще одна попытка нашего героя
получить сведения о своем рабочем каталоге
в строке 24. На этот раз в строках 25–31
показаны новый подкаталог с именем stuff
и новый файл в нем с именем .
Обратите внимание, что новый почтовый ящик
является файлом, а не каталогом. Сообщения,
помещенные в этот почтовый ящик, будут
просто добавляться в этот файл.
Команда DELETE
применяется к почтовым ящикам, а не к
сообщениям. Сервер IMAP при получении этой
команды попытается удалить почтовый ящик с
именем, указанным в качестве аргумента
команды. В аргументе команды можно
использовать стандартное описание путей ОС
Linux, со знаком разделителя /,
если только они не находятся в каталоге $HOME.
Сообщения из удаленных почтовых ящиков
восстановлению не подлежат и теряются
вместе с ящиками.
С помощью команды RENAME
клиент может изменить имя почтового ящика.
При этом возможно применение двух
параметров. Первый параметр —
собственно имя почтового ящика, который
требуется переименовать. И второй параметр —
новое имя почтового ящика. Для обоих
параметров действительны стандартные
методы задания путей в ОС Linux. Помните, что
пути без знака разделителя /
относятся только к рабочему каталогу
пользователя $HOME,
под которым была произведена регистрация в
системе (на сервере). В листинге 7.6 приведен
пример переименования почтового ящика.
1 [alex@shadrach alex]$ ls -lR 2 .: 3 total 1 4 drwx------ 2 alex alex 1024 Sep 10 16:48 stuff 5 6 stuff: 7 total 1 8 -rw------- 1 alex alex 918 Sep 10 16:44 junk 9 [alex@shadrach alex]$ telnet localhost 143 10 Trying 127.0.0.1... 11 Connected to localhost. 12 Escape character is '^]'. 13 * OK localhost IMAP4rev1 V12.250 server ready 14 a1 login alex drums 15 a1 OK LOGIN completed 16 a2 rename stuff/junk newbox 17 a2 OK RENAME completed 18 a3 select newbox 19 * 1 EXISTS 2B • B RECENT 21 * OK [UIDVALIDITY 936998958] UID validity status 22 * OK [UIDNEXT 2] Predicted next UID 23 * FLAGS (\Answered \Flagged \Deleted VDraft \Seen) 24 * OK [PERMANENTFLAGS (\* \Answered \Flagged \Deleted \Draft \Seen)] Permanent flags 25 a3 OK [READ-WRITE] SELECT completed 26 a4 logout 27 * BYE shadrach.smallorg.org IMAP4rev1 server terminating connection 28 a4 OK LOGOUT completed 29 Connection closed by foreign host. 30 [alex@shadrach alexl$ ls -lR 31 .: 32 total 2 33 -rw------- 1 alex alex 918 Sep 10 16:44 newbox 34 drwx------ 2 alex alex 1024 Sep 12 13:59 stuff 35 36 stuff: 37 total 0 38 [alex@shadrach alex]$
В строке 1 пользователь alex
задает команду на просмотр содержимого
своего рабочего каталога. Как и в
предыдущем примере, у него имеется почтовый
ящик stuff/,
который находится в подкаталоге stuff
в файле . В
строке 9 пользователь alex
устанавливает IMAP-соединение с localhost.
После выполнения всех формальностей, в
строке 16 он задает команду RENAME
для переименования своего ящика с именем stuff/ в newbox.
Строка 17 отображает положительный ответ
сервера IMAP на эту команду. В строке 18
пользователь alex
пытается сделать переименованный почтовый
ящик активным для чего выдает команду SELECT.
Сервер отвечает на нее сведениями о
содержимом нового ящика. Обратите внимание
на строку 19. Дело в том, что alex
предварительно сохранил в почтовом ящике stuff/
сообщение. И теперь, как видите,
переименованный почтовый ящик newbox
также содержит одно сообщение. Таким
образом, можно сделать вывод, что
переименование не влияет на содержимое
почтового ящика. После завершения сеанса IMAP alex повторно
выполняет просмотр рабочего каталога. К его
и нашему удивлению подкаталог с именем stuff
все еще здесь, но файл
уже обнулен. Давайте попробуем разобраться,
что же произошло. Сервер IMAP удалил файл с
именем из
подкаталога stuff,
но сам подкаталог удален не был. В строке 33
показано, что был создан новый почтовый
ящик с именем newbox.
Команда SUBSCRIBE
используется для добавления почтового
ящика в список активных ящиков клиента. В
ней используется только один параметр —
имя почтового ящика, который нужно внести в
список. Все активные почтовые ящики могут
отображаться с помощью команды LSUB,
которая будет описана позже. Почтовый ящик
не обязательно должен существовать, чтобы
его можно было добавить в список активных
ящиков. Эта возможность заложена для того,
чтобы добавлять в список активных ящиков те,
которые еще не созданы, или удалять их, если
они пусты.
Для удаления почтовых ящиков из
списка активных используется команда .
С ней также может использоваться только
один параметр — имя почтового ящика,
который удаляется из списка активных
ящиков клиента. При этом сам по себе
почтовый ящик не удаляется. Он просто
исключается из списка активных почтовых
ящиков. Все активные почтовые ящики могут
отображаться с помощью команды LSUB,
которая будет описана ниже.
Команда 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]$
В строке 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
используется для устранения проблемы,
которая описана для команды LIST.
В отличие от команды LIST, с помощью которой отображается все
содержимое рабочего каталога пользователя,
с помощью команды LSUB
отображаются лишь активизированные ранее
описанной командой SUBSCRIBE
почтовые ящики клиента. Параметры команды LSUB
точно такие же, что и для команды LIST,
т.е. ссылка ( reference )
и имя почтового ящика. Подобно команде LIST,
параметр ссылки указывает путь к каталогу,
в котором находятся почтовые ящики с
соответствующими именами (каталог $HOME,
если указано "" ).
Соответственно, под именем почтового ящика
понимается имя ящика или имена ящиков,
которые требуется вывести в списке (допускается
групповой символ ( * ).
Почтовые ящики могут затем
добавляться в список активных ящиков с
помощью команды SUBSCRIBE,
а удаляться из списка с помощью команды . С помощью этих команд можно
реализовать на базе клиента 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]$
В строке 8 пользователь alex
добавляет созданный в предыдущем примере
почтовый ящик к списку своих почтовых
ящиков. В строке 10 он выдает команду LSUB,
чтобы просмотреть, какие почтовые ящики у
него уже имеются. Обратите внимание:
параметры, заданные с LSUB,
говорят о том, что ящики находятся в его
рабочем каталоге $HOME
и все они должны быть показаны в списке ( * ).
Ответ сервера IMAP показан в строках 11–14. Как
видите, он сильно отличается от ответа,
полученного с помощью команды LIST
(см. листинг 7.7). В списке указаны только
те почтовые ящики, на которые подписан
пользователь alex.
Обратите также внимание на строку 11. Как мы
уже могли видеть в листинге 7.6, почтовый
ящик stuff/jerk был
успешно переименован. Что же произошло? А
теперь вспомните, что подписка на почтовый
ящик вовсе не означает, что он реально
существует. Просто команда LSUB
хранит в своем активном списке сведения обо
всех почтовых ящиках, на которые подписан
пользователь, хотя реальное состояние
ящиков уже давно изменилось. Это свойство LSUB
позволяет временно удалять почтовые ящики,
пока они пусты, и вновь создавать их без
помощи клиентов, как только в них приходят
новые сообщения. Таким образом, клиентам не
нужно повторять процедуру подписки на
почтовые ящики.
Команда STATUS
используется для формирования запроса о
текущем состоянии почтового ящика. Первым
параметром для этой команды является имя
почтового ящика, к которому она применяется.
Второй параметр — это список пунктов, по
которым клиент может получить информацию (она
заключается в круглые скобки () ).
Команда STATUS может
использоваться отдельно для получения
информации о состоянии почтового ящика без
его открытия с помощью команд SELECT
или EXAMINE.
Список критериев, по которым
команда STATUS может
выдавать информацию, представлен в табл. 7.2.
| Критерий | Описание |
|---|---|
MESSAGES |
Общее число сообщений в почтовом ящике |
RECENT |
Число сообщений в ящике с флагом \RECENT (новые) |
UIDNEXT |
Следующий доступный идентификатор UID, который будет назначен новому сообщению |
UIDVALIDITY |
Уникальный идентификатор UID почтового ящика |
UNSEEN |
Число сообщений в почтовом ящике без флага \SEEN |
Пример сеанса IMAP с командой STATUS показан в листинге 7.9.
1 [alex@shadrach alex]$ telnet localhost 143 2 Trying 127.0.0.1... 3 Connected to localhost. 4 Escape character is '^]'. 5 * OK localhost lMAP4rev1 V12.250 server ready 6 a1 login alex drums 7 a1 OK LOGIN completed 8 a2 status inbox (messages recent unseen) 9 * STATUS inbox (MESSAGES 1 RECENT 0 UNSEEN 0) 10 a2 OK STATUS completed 11 a3 status newbox (messages uidnext unseen) 12 * STATUS newbox (MESSAGES 1 UNSEEN 0 UIDNEXT 2) 13 a3 OK STATUS completed 14 a4 logout 15 * BYE shadrach.smallorg.org IMAP4rev1 server terminating connection 16 a4 OK LOGOUT completed 17 Connection closed by foreign host. 18 [alex@shadrach alex]$
В строке 8 пользователь alex
выдает команду STATUS
для запроса информации о количестве
сообщений в почтовом ящике, о количестве
новых и непрочитанных сообщений в
специальном ящике INBOX.
Строка 9 является ответом сервера IMAP на эту
команду. В строке 11 пользователем alex
выдается команда STATUS
уже для другого почтового ящика. Обратите
внимание на ответ сервера IMAP в строке 12.
Здесь сервер ответил сведениями,
запрошенными о почтовом ящике, но не в том
порядке, как они запрашивались. Дело в том,
что сервер IMAP всегда выводит информацию в
определенном порядке. Сведения о состоянии
почтового ящика выдаются в таком порядке: MESSAGES, RECENT, UNSEEN, UIDNEXT,
и UIDVALIDITY.
APPEND —
еще одна команда из семейства команд IMAP. Как
правило, протокол IMAP применяется
исключительно для чтения сообщений из
почтовых ящиков. С помощью команды APPEND появляется возможность посылать
сообщения в почтовый ящик, добавляя
сообщение к концу файла почтового ящика.
Эта функция работает не совсем корректно и
она является довольно опасной, поэтому не
рекомендуем увлекаться ею в качестве
альтернативы SMTP. Это, скорее, приятное
излишество протокола IMAP, а не рабочая
лошадка. Основной формат команды APPEND
следующий:
APPEND mailbox [(flags)] [date/time string] {message size} message
Эта команда является фактически рабочим макетом будущей команды. В листинге 7.10 показана попытка помещения сообщения в почтовый ящик. Естественно, что в этом случае программе-клиенту требуются права как на чтение из почтового ящика, так и на запись в него.
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 create testbox
9 a2 OK CREATE completed
10 a3 append testbox (\SEEN) {23}
11 + Ready for argument
12 This is a test message.
13 a3 OK APPEND completed
14 a4 select testbox
15 * 1 EXISTS
16 * 1 RECENT
17 * OK [UIDVALIDITY 937242636] UID validity Status
18 * OK [UIDNEXT 2] Predicted next UID
19 * FLAGS (\Answered \Flagged \Deleted \Draft \Seen)
20 * OK [PERMANENTFLAGS (\* \Answered \Flagged \Deleted \Draft \Seen)] Permanent fs
21 a4 OK [READ-WRITE] SELECT completed
22 a5 logout
23 * BYE shadrach. smallorg.org IMAP4rev1 server terminating connection
24 a5 OK LOGOUT completed
25 Connection closed by foreign host.
26 [alex@shadrach alex]$ mail -f testbox
27 Mail version 8.1 6/6/93. Type ? for help.
28 "testbox": 2 messages
29 > 1 MAILER-DAEMON@shadra Mon Sep 12 19:11 12/516 "DON'T DELETE THIS MES"
30 2 alex@shadrach.smallo Mon Sep 12 19:11 8/128
31 2
32 Message 2:
33 From alex@shadrach.smallorg.org Mon Sep 12 19:11:18 1999 -0500
34
35 This is a test message
36 Status: RO
37 X-Status:
38 X-Keywords:
39 X-UID: 1
40
41 q
42 [alex@shadrach alex]$
В строке 8 пользователь alex
создает специально для тестирования новый
почтовый ящик. В строке 10 начинается работа
команды APPEND.
Добавляемое сообщение обозначается флагом
как прочитанное. Флагом не помечаются
только те сообщения, в конце которых
отсутствует завершающая пустая строка CR-LF.
В нашем примере пользователь alex
использовал простейшее сообщение. Далее,
после нажатия клавиши Enter
сервер IMAP ответил положительно и "попросил"
пользователя ввести "аргумент" для
команды APPEND в
строке 11. Пользователь в ответ на это
приглашение набрал сообщение. Далее, как
видите, сообщение было успешно добавлено в
почтовый ящик клиента. В строке 14 для
активизации почтового ящика testbox
пользователь задал команду SELECT.
Ответ сервера на команду SELECT дает нам дополнительную пищу для
размышлений. Обратите внимание: в строке 15
говорится о том, что в почтовом ящике
имеется одно новое сообщение, а в строке 16
оно обозначено флагом как "новое". Однако
команда SELECT не
дает пользователю увидеть UID
непрочитанного сообщения, поэтому все
сообщения в ящике обозначаются флагом как
"прочитанные". Это соответствует тому, что
мы говорили о команде APPEND.
Как видите, пользователь alex
применил флаг \SEEN для
добавляемого сообщения. Чтобы окончательно
удостовериться в том, что сообщение
добавлено, пользователь alex
завершает сеанс работы с сервером IMAP и с
помощью программы для чтения почты в ОС Linux
обращается к своему почтовому ящику testbox. Это показано в строке 26, где
пользователь alex
выдает команду на чтение почты из ящика mail -f testbox. В строке 30 показано, что в
почтовом ящике имеется сообщение, тема
которого не указана. Отобразив это
сообщение на экране, мы видим, что это
именно то сообщение, которое было послано с
помощью команды APPEND.
Было бы это сообщение реальным, пришедшим
от удаленного пользователя или созданным с
помощью программы для чтения почты
пользователя alex,
все равно оно должно иметь стандартный вид,
соответствующий RFC 822, только тогда сервер
IMAP сможет обработать его определенным
образом.
Команда CHECK
используется для установки контрольной
точки в почтовом ящике. Любые операции,
такие, например, как запись данных из памяти
сервера на его жесткий диск, должны
выполняться при соответствующем состоянии
почтового ящика. Именно для проверки
целостности почтового ящика после дисковых
и других подобных им операций и применяется
команда CHECK. Эта
команда используется без параметров.
Команда CLOSE
полностью соответствует своему названию —
она закрывает почтовый ящик. Когда почтовый
ящик закрыт, то все сообщения, помеченные
флагом \DELETED,
физически удаляются из него. Действие
команды CLOSE четко
прослеживается на только что открытом
новом почтовом ящике. Открытый почтовый
ящик закрывается также с помощью команды LOGOUT
(о ней мы поговорим позже). Команда CLOSE
не имеет параметров.
Команда
используется для удаления из почтового
ящика всех сообщений, помеченных флагом \DELETED,
при этом почтовый ящик не закрывается.
Ответ сервера на команду
представляет собой отчет о новом состоянии
почтового ящика. В листинге 11 показан
пример работы с командой .
1 [alex@shadrach alex]$ telnet localhost 143 2 Trying 127.0.0.1... 3 Connected to localhost. 4 Escape character is '^]'. 5 * OK localhost lMAP4rev1 v12.250 server ready 6 a1 login alex drums 7 a1 OK LOGIN completed 8 a2 select newbox 9 * 6 EXISTS 10 * 0 RECENT 11 * OK [UIDVAHDITY 937243866] DID validity status 12 * OK [UIDNEXT 8] Predicted next UID 13 * FLAGS (\Answered \Flagged \Deleted \Draft \Seen) 14 * OK [PERMANENTFLAGS (\* \Answered \Flagged \Deleted \Draft VSeen)] Permanent flags 15 * OK [UNSEEN 1] first unseen message in /home/alex/newbox 16 a2 OK [READ-WRITE] SELECT completed 17 a3 store 1 +flags \DELETED 18 * 1 FETCH (FLAGS (\Deleted)) 19 a3 OK STORE completed 20 a4 store 2 +flags \DELETED 21 * 2 FETCH (FLAGS (\Deleted)) 22 a4 OK STORE completed 23 a5 status newbox (messages unseen) 24 * STATUS newbox (MESSAGES 6 UNSEEN 6) 25 a5 OK STATUS completed 26 a6 expunge 27 * 1 EXPUNGE 28 * 1 EXPUNGE 29 * 4 EXISTS 30 * 0 RECENT 31 a6 OK Expunged 2 messages 32 a7 status newbox (messages unseen) 33 * STATUS newbox (MESSAGES 4 UNSEEN 4) 34 a7 OK STATUS completed 35 a8 logout 36 * BYE shadrach.sniallorg.org IMAP4rev1 server terminating connecion 37 a8 OK LOGOUT completed 38 Connection closed by foreign host. 39 [alex@shadrach alex]$
В строке 8 пользователь alex
выбирает почтовый ящик с именем newbox.
Строки 9–16 представляют собой ответ
сервера с информацией относительно
выбранного почтового ящика. Строка 9
говорит о том, что в нем находится 6
сообщений. В строках 17 и 20 пользователь alex
воспользовался командой STORE
(о ней мы поговорим позже), чтобы пометить
два сообщения как удаленные ( \DELETED ).
Затем в строке 23 пользователь alex
выдает команду STATUS.
Из строки 24 можно сделать заключение, что, с
точки зрения сервера IMAP, в почтовом ящике
все еще находятся шесть сообщений, хотя два
из них помечены как удаленные. В строке 26
пользователь выдает команду ,
по которой сообщения, помеченные как
удаленные, стираются. Ответ сервера в
строках 27–31 подтверждает, что сообщения
были удалены из ящика и в нем осталось
четыре сообщения. Это же подтверждает и
команда STATUS,
заданная в строке 32. На нее сервер отвечает,
что в почтовом ящике теперь только четыре
сообщения.
Команда SEARCH
является одним из наиболее мощных средств
из арсенала IMAP. С помощью этой команды
производится поиск сообщений по критериям
в активном почтовом ящике с последующим
отображением результатов в виде номера
сообщения. Формат команды SEARCH
следующий:
SEARCH [CHARSET specification] (search criteria)
Здесь CHARSET
specification состоит из служебного слова CHARSET,
за которым следует обозначение набора
символов. Набор символов по умолчанию — ASCII,
так что, как правило, этот параметр
опускается. Параметр search criteria определяет ключевые критерии
поиска и их значения. Критерии поиска
описаны в табл. 7.3.
| Критерий поиска | Описание |
|---|---|
<message set> |
Сообщения с номерами, соответствующими заданному диапазону |
ALL |
Все сообщения в почтовом ящике |
ANSWERED |
Сообщения с флагом \ANSWERED |
|
Сообщения, содержащие заданную строку в поле заголовка |
BEFORE <date> |
Сообщения, которые были созданы до указанной даты |
BODY |
Сообщения, содержащие в теле указанную строку |
CC <string> |
Сообщения, содержащие заданную строку в поле заголовка CC |
DELETED |
Сообщения с флагом \DELETED |
DRAFT |
Сообщения с флагом \DRAFT |
FLAGGED |
Сообщения с набором флагов \FLAGGED |
From <string> |
Сообщения, содержащие заданную строку в поле заголовка From |
HEADER <field name> <STRING> |
Сообщения, содержащие указанный заголовок с заданной в нем строкой |
KEYWORD <flag> |
Сообщения, содержащие указанный список критериев |
LARGER <n> |
Сообщения, размер которых больше n |
NEW |
Сообщения с флагом \RECENT, но без флага \SEEN |
NOT <search key> |
Сообщения, не содержащие указанный список критериев |
OLD |
Сообщения без флага \RECENT |
ON <date> |
Сообщения, которые были созданы в указанный день |
OR <searchkey 1> <searchkey 2> |
Сообщения, содержащие логические критерии поиска ИЛИ |
RECENT |
Сообщения с флагом \RECENT |
SEEN |
Сообщения с флагом \SEEN |
SENTBEFORE <date> |
Сообщения, которые были созданы до указанной даты, согласно полю заголовка Date |
SENTON <date> |
Сообщения, которые были созданы в указанную дату, согласно полю заголовка Date |
SENTSINCE <date> |
Сообщения, которые были созданы после указанной даты, согласно полю заголовка Date |
SINCE <date> |
Сообщения, которые были созданы после указанной даты |
SMALLER <n> |
Сообщения, размер которых не превышает n |
TEXT <string> |
Сообщения, которые содержат указанную строку или в заголовках, или в теле сообщения |
UID <message set> |
Сообщения с UID, соответствующими заданному диапазону |
UNANSWERED |
Сообщения без флага \ANSWERED |
|
Сообщения без флага \DELETED |
UNDRAFT |
Сообщения без флага \DRAFT |
UNFLAGGED |
Сообщения без набора флагов \FLAGGED |
UNKEYWORD <flag> |
Сообщения без набора заданных критериев |
UNSEEN |
Сообщения без флага \SEEN |
Как видно из табл. 7.3,
существует огромное количество критериев
поиска сообщений. Это очень удобно, когда
требуется найти специфическое сообщение в
почтовых ящиках, которые заполнены большим
количеством сообщений. В листинге 7.12
представлен короткий пример с
использованием команды SEARCH.
1 [alex@shadrach alex]$ telnet localhost 143 2 Trying 127.0.0.1... 3 Connected to localhost. 2 Escape character is '^]'. 4 * OK localhost IMAP4rev1 V12.250 server ready 5 a1 login alex drums 7 a1 OK LOGIN completed 8 a2 select inbox 9 * 2 EXISTS 10 * 0 RECENT 11 * OK [UIDVALIDITY 936999597] UID validity status 12 * OK [UIDNEXT 5] Predicted next UID 13 * FLAGS (\Answered \Flagged \Deleted \Draft \Seen) 14 * OK [PERMANENTFLAGS (\* \Answered \Flagged \Deleted \Draft \Seen)] Permanent fs 15 * OK [UNSEEN 1] first unseen message in /var/spool/mail/alex 16 a2 OK [READ-WRITE] SELECT completed 17 a3 search header subject test 18 * SEARCH 1 2 19 a3 OK SEARCH completed 20 a4 search header subject another 21 * SEARCH 2 22 a4 OK SEARCH completed 23 a5 search unseen 24 * SEARCH 1 2 25 a5 OK SEARCH completed 26 a6 logout 27 * BYE shadrach.smallorg.org IMAP4rev1 server terminating connection 28 a6 OK LOGOUT completed 29 Connection closed by foreign host. 30 [alex@shadrach alex]$
В строках 17, 20 и 23 показаны
примеры использования команды SEARCH.
Строки 18, 21 и 24 являются ответами сервера IMAP
на команду SEARCH. В
ответе содержатся номера сообщений,
которые соответствуют критерию поиска.
Если соответствий не найдено, то сервер
возвращает слово SEARCH
без идентификатора сообщения UID.
Команда FETCH
используется для получения текста
почтового сообщения. Она применяется
только для отображения сообщений. В отличие
от POP3, клиент IMAP не сохраняет копию
сообщения на клиентском ПК. Обслуживание
сообщений в почтовом ящике здесь входит в
обязанности сервера. Формат команды FETCH
приведен ниже:
FETCH <message set> <data item names>
Здесь <message set> — диапазон номеров сообщений,
которые требуется получить, а < соответствуют описанию данных
каждого сообщения.
В качестве диапазона номеров сообщений может быть один номер, список номеров, разделенных запятыми, или диапазон номеров, который задается двоеточиями. Сервер IMAP будет возвращать заданные типы данных для всех сообщений диапазона.
Имена типов данных являются
сложной спецификацией частей сообщения,
которые могут возвращаться индивидуально.
Существует три макроса возврата информации
из сообщения: ALL, BODY
и BODY [section].
Тип данных ALL
не означает, что сообщение будет возвращено
целиком, как вы, возможно, предположили.
Однако синтаксис сообщения в этом случае
полноформатный и содержит набор флагов,
дату и конверт сообщения. Клиент IMAP может
легко проанализировать сообщение и разбить
его на части для последующего отображения
информации о сообщении.
Данные типа BODY
также не означают, что возвращается именно
тело сообщения, хотя при этом выделяется
тип текстовой части сообщения и размер тела
сообщения. При этом программа-клиент IMAP
может предоставить пользователю более
детальную информацию о сообщении на основе
анализа этого типа данных.
Макрос BODY [section]
может применяться для возврата отдельных
частей сообщения. В RFC 2060 описаны все части
сообщения формата RFC 822, которые могут
использоваться в этом разделе. Наиболее
часто встречаются части типа HEADER
и TEXT. Так, макрос BODY [HEADER] полностью возвращает заголовок
сообщения. Можно даже задать еще больший
уровень детализации — до отдельных
полей заголовка. Например, для возврата
поля заголовка Subject:
нужно задать BODY [HEADER.FIELDS (SUBJECT)]. Можно получать сразу несколько
полей заголовка. Для этого нужно задавать
их в круглых скобках, разделяя пробелами.
Макрос BODY [SECTION]
можно также модифицировать, добавляя к нему
поле <partial>.
Поле <partial> состоит
из двух чисел, разделенных точкой. Первое
число — начало октета данных, которые
выводятся на экран. Второе число обозначает
количество октетов данных, которые будут
выведены на экран. Это поле можно
использовать для управления выводом на
экран. Если, например, требуется вывести на
экран только первые 10 символов из тела
сообщения с номером 1, то можно использовать
следующую команду:
FETCH 1 BODY [TEXT] <0.10>
По этой команде выводится только
10 символов из тела сообщения, описанного
типом "text". Если
же в теле сообщения менее 10 символов, то
отображается все тело сообщения. В листинге
7.13 представлен пример использования
команды FETCH.
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 * 6 EXISTS
10 * 0 RECENT
11 * OK [UIDVALIDITY 937321060] UID validity status
12 * OK [UIDNEXT 7] Predicted next UID
13 * FLAGS (\Answered \Flagged \Deleted \Draft \Seen)
14 * OK [PERMANENTFLAGS (\* \Answered \Flagged \Deleted \Draft \Seen)] Permanent flags
15 a2 OK [READ-WRITE] SELECT completed
16 a3 fetch 3:5 body[header.fields (date from subject)]
17 * 3 FETCH (BODY[HEADER,FIELDS ("DATE" "FROM" "SUBJECT")] {112}
18 Date: Tue, 14 Sep 1999 10:09:50 -0500
19 From: alex@shadrach.smallorg.org
20 Subject: This is the first test message
21
22 )
23 * 4 FETCH (BODY[HEADER.FIELDS ("DATE" "FROM" "SUBJECT")] {113}
24 Date: Tue, 14 Sep 1999 10:10:04 -0500
25 From: alex@shadrach.smallorg.org
26 Subject: This is the second test message
27
28 )
29 * 5 FETCH (BODY[HEADER.FIELDS ("DATE" "FROM" "SUBJECT")] {112}
30 Date: Tue, 14 Sep 1999 10:10:26 -0500
31 From: alex@shadracn.smallorg.org
32 Subject: This is the third test message
34 )
35 a3 OK FETCH completed
36 a4 fetch 4 body[text]
37 * 4 FETCH (BODY[TEXT) {42}
38 This is the second test message for IMAP
39 )
40 a4 OK FETCH completed
41 a5 logout
42 * BYE shadrach.smallorg.org IMAP4rev1 server terminating connection
43 a5 OK LOGOUT completed
44 Connection closed by foreign host.
45 [alex@shadrach alex]$
В строках 16 и 30 показаны примеры
получения сведений о сообщении с помощью
команды FETCH. Так, в
строке 16 запрашиваются поля заголовка Date, From и Subject
для сообщений 3–5. В строках 17–35 показан
ответ сервера IMAP на эту команду с
соответствующей информацией о запрошенных
сообщениях. В строке 36 запрашивается текст
из тела сообщения номер 4. Соответственно,
строки 37–40 являются ответом сервера IMAP на
этот запрос, где отражается тело сообщения.
По умолчанию данные типа BODY [SECTION] изменяют сообщение,
устанавливая для него флаг \SEEN.
Если же нужно просмотреть часть сообщения
без установления флага, то данные типа BODY [SECTION] можно заменить на BODY.. С помощью этого типа данных
выполняется та же самая операция, что и в BODY [SECTION], но при этом не устанавливается
флаг \SEEN для
сообщения.
Команда STORE
применяется для изменения информации о
сообщении. Формат команды следующий:
STORE <message set> <data item name> <data item value>
Аргумент <message set> задает диапазон номеров сообщений,
к которым применяется команда STORE.
В настоящее время для этой команды
определено только два типа данных ( < ). Тип FLAGS
определяет набор флагов, установленных для
сообщения. Тип FLAGS.SILENT
также определяет набор флагов,
установленных для сообщения, но при этом
сервер IMAP не возвращает их новое значение в
своем ответе.
Поведением этих типов данных
можно управлять, задав перед ними знак плюс
( + ) или минус ( - ).
Знак плюс означает, что значение типа
данных ( < )
будет добавлено к сообщению, минус — что
оно будет удалено из сообщения.
Установка флагов в сообщении с
применением команды STORE
довольно хорошо продемонстрирована в
листинге 7.11. В строке 18 этого листинга
показано, как устанавливается флаг \DELETED
для сообщения в активном почтовом ящике с
номером 1. Обратите внимание, что перед
флагом задан знак плюс ( + ).
Можно было бы также задать флаг ( - ).
Тогда флаг \DELETED
был бы отменен для сообщения (один из
способов восстановить удаленное сообщение
до того, как вступят в силу контрольные
точки сообщения). И помните: сообщение,
помеченное флагом \DELETED,
не удаляется физически из почтового ящика
до выполнения команд по назначению новых
контрольных точек для почтового ящика. А
это делается с помощью команд CHECK, , SELECT
или LOGOUT.
Команда COPY
используется для копирования сообщений из
одного почтового ящика в другой. Формат
команды COPY
приведен ниже:
COPY <message set> <mailbox name>
Здесь <message set> задает диапазон номеров сообщений,
которые нужно скопировать из активного
почтового ящика, а <mailbox name> указывает имя ящика, в который их
нужно скопировать.
Для протокола IMAP не определена
\DELETED. После
следующей ротации почтового ящика (расстановки
контрольных точек) оригиналы сообщений
будут удалены, и останутся только их копии.
Команда UID используется в связке
с командами FETCH, COPY, STORE или SEARCH.
С ее помощью в этих командах можно
использовать реальные идентификационные
номера UID, вместо
последовательности чисел из диапазона
номеров сообщений. Идентификационный номер UID представляет
собой 32-битовое целое число, которое
однозначно идентифицирует сообщения в
почтовом ящике для системы электронной
почты. Как правило, эти функции выполняют
номера сообщений. Однако они не являются
постоянными и могут принимать различные
значения после поступления в ящик новых
сообщений или удаления старых. Поэтому
однозначно идентифицировать сообщения для
программ-клиентов IMAP между сеансами может
только идентификатор UID.
С помощью команды CAPABILITY
клиент может запрашивать у сервера IMAP
информацию о его возможностях. В листинге
7.14 представлен пример использования
команды CAPABILITY в
сеансе IMAP.
1 [riley@shadrach riley]$ telnet localhost 143 2 Trying 127.0.0.1... 3 Connected to local host. 4 Escape character is '^]'. 5 * OK localhost IMAP4revl v12.250 server ready 6 a1 login riley firetruck 7 a1 OK LOGIN completed 8 a2 capability 9 * CAPABILITY IMAP4 IMAP4REV1 NAMESPACE IDLE SCAN SORT MAILBOX-REFERRALS LOGIN-RE 10 FERRALS AUTH=LOGIN THREAD=ORDEREDSUBJECT 11 a2 OK CAPABILITY completed 12 a3 logout 13 * BYE shadrach.smallorg.org IMAP4rev1 server terminating connection 14 a3 OK LOGOUT completed 15 Connection closed by foreign host. 16 [riley@shadrach riley]$
Действия команды NOOP,
как мы знаем, соответствует ее названию, т.е.
она ничего не делает. Она может применяться
для поддержки активности во время сеанса
для того, чтобы сеанс не прекратился по
таймеру интервала ожидания. Ответ сервера
на команду NOOP
всегда должен быть положительным. Так как
сервер часто в ответе возвращает состояние
выполнения той или иной команды, то NOOP
вполне можно использовать как триггер для
периодического запроса о состоянии сервера.
Если что-то произошло с почтовым ящиком во
время периода ожидания, например сервер
удалил сообщения согласно правилам,
установленным для почтового ящика
администратором почтовой системы, то в
ответ на команду NOOP
будет возвращена обновленная информация о
его состоянии.
Команда LOGOUT
используется для завершения сеанса для
текущего идентификатора пользователя и
закрытия всех открытых почтовых ящиков.
Если какие-либо сообщения были помечены
флагом \DELETED, то с
помощью этой команды они будут физически
удалены из почтового ящика.
Для платформы Linux было написано несколько программных пакетов, реализующих функции и сервера и клиента IMAP. С ростом популярности IMAP4 следует ожидать очередного бума в разработке приложений для работы с IMAP в ОС Linux. В этом разделе мы коснемся наиболее популярных программных пакетов для Linux, которые реализуют функции сервера и клиента IMAP.
Программный пакет imapd
является одной из широко распространенных
реализаций сервера IMAP4, разработанной в
Вашингтонском университете. Он входит в
большинство дистрибутивов ОС Linux как
бинарный программный пакет. Если в вашей
версии Linux он отсутствует или вы желаете
получить его последнюю версию, то это можно
сделать с сервера FTP Вашингтонского
университета по адресу ftp://ftp.cac.washington.edu.
Последняя версия находится там под
названием imap.tar.Z.
Когда писалась эта книга текущей версией
была imap-4.6.BETA.
Программа imapd
вызывается по умолчанию процессом сервера
Internet inetd и слушает
TCP-порт с номером 143 на предмет установления
соединений. Для запуска imapd
посредством inetd
требуется строка конфигурации в файле /etc/inetd.conf
такого содержания:
imap stream tcp nowait root /usr/sbin/tcpd imapd
По умолчанию почтовым каталогом
для клиента IMAP является рабочий каталог
пользователя $HOME,
указанный в файле /etc/passwd.
Более детально об установке и
конфигурировании программного обеспечения
сервера IMAP поговорим в лекции 12, "Установка
и конфигурирование POP3 и IMAP".
Для получения пользователем
почты из нескольких почтовых ящиков по
протоколу IMAP можно сконфигурировать
соответствующим образом программу fetchmail.
Для установки базовых параметров можно
воспользоваться программой fetchmailconf.
С ее помощью можно указать сервер IMAP и
транспортный протокол для передачи почты (см.
лекцию 6, "Протокол POP3"). Для почтового ящика
по умолчанию программа fetchmailconf
создает файл конфигурации .fetchmailrc.
Как правило, это специальный почтовый ящик
с именем INBOX. Если
требуется проверять другие почтовые ящики,
которые были сконфигурированы на сервере
IMAP, можно задавать в fetchmail
опцию -r:
fetchmail -r mailbox
Здесь mailbox —
имя почтового ящика (или папки), который
будет проверяться вместо ящика INBOX.
Предупреждение
При использовании этой опции
следует быть очень осторожным, так как fetchmail
будет пересылать все
получаемые ею сообщения в обычный ящик на
локальном ПК. Таким образом, сообщения,
которые попадали в различные ящики, теперь
будут собираться в одном месте.
Большинством программ-клиентов сегодня предлагаются графические интерфейсы для работы с почтовыми ящиками в IMAP. Так, например, часть программного пакета Netscape Mail — программа Netscape Mail — имеет графический интерфейс и может быть сконфигурирована для работы с сервером IMAP. На рис. 7.1 показано основное окно для конфигурирования почтовой программы из пакета Netscape.
В разделе Входящие почтовые серверы (Incoming Mail Servers) можно задавать один или несколько почтовых серверов, у которых программа будет забирать почту. Новый сервер можно добавить, нажав на кнопку Добавить (Add). На рис. 7.2 показана операция по добавлению нового почтового сервера.
С помощью кнопки Тип сервера (Server Type) можно добавить либо сервер POP3, либо сервер IMAP. Если выбрать тип сервера IMAP, то в конфигурационном окне появятся две дополнительные метки. На рис. 7.3 показано окно с метками для конфигурирования IMAP.

(рис 7.2) Окно для конфигурации почтового сервера в программе Netscape Mail(рис 7.1) Окно для конфигурации новых почтовых серверов в программе Netscape Mail
(рис 7.3) Окно для конфигурации сервера IMAP в программе Netscape MailС помощью конфигурации IMAP
пользователь может выбирать тип
подключения к серверу IMAP. Можно, например,
задать подключение к серверу через
безопасное соединение с использованием
протокола security socket layer (SSL).
Так как в нашем случае эта возможность не
используется, то мы не будем на ней
останавливаться. Далее в конфигурации IMAP
следует указать, каким образом мы хотим
обслуживать удаленные сообщения. Нужно
принять решение, как поступать с
сообщениями, обозначенными как удаленные.
Это как раз и выбирается с помощью
предлагаемых опций. Помечая сообщения как
удаленные, мы снижаем общий сетевой трафик.
Это достигается благодаря сохранению
контрольных точек почтового ящика в
первоначальном виде до окончания работы с
ним, т.е. исключается ротация. Достаточно
рационально этот подход реализован в
продукте компании Netscape. В нем предусмотрена
папка , где
хранятся все сообщения помеченные как
удаленные. Ротация почтового ящика
происходит лишь при очистке этой папки.
Неплохо использовать в этом случае команду
после выхода из папки INBOX,
чтобы убедиться в том, что сообщения с
флагом \DELETED
действительно удалены. На рис. 7.4
показано окно Дополнительные опции IMAP (Advanced IMAP options).
(рис 7.4) Окно для конфигурации дополнительных опций IMAP в программе Netscape MailЗакладка дополнительных опций
дает пользователю возможность выбирать
каталог, к которому будет обращаться сервер
IMAP, в отличие от установленного по
умолчанию. Имеется также возможность
выбора папок, на которые подписан
пользователь. Помните, чем отличаются
команды LIST и LSUB?
По команде LIST
выводится полный список файлов и
подкаталогов в рабочем каталоге
пользователя $HOME.
Если опция выбора папок не помечена, то
программа Netscape Mail будет выполнять команду LIST
и отображать все содержимое рабочего
каталога пользователя как возможные
почтовые ящики или папки. Если же
пользователь в ОС Linux заведен лишь для
работы с электронной почтой, то это не
доставляет неудобств. В противном случае,
если учетная запись пользователя
используется не только для работы с почтой,
можно получить огромный
список файлов, большинство которых
никакого отношения к почте не имеют.
После установки желаемых параметров IMAP можно приступить к просмотру почтовых ящиков на почтовом сервере Linux с помощью графической оболочки, предлагаемой Netscape Mail. Сообщения можно читать, перемещать или удалять с помощью все того же графического интерфейса. Более детально ознакомиться с использованием Netscape Mail можно в лекции 15, "Конфигурирование клиентов ЛВС".
Протокол Internet Mail Access Protocol (IMAP) был
разработан для получения почты с удаленных
серверов. При этом сообщения физически
остаются на сервере. Такой метод получения
почты имеет свои преимущества, так как
почта пользователей хранится в одном месте
и не распределяется между несколькими ПК.
Протоколом IMAP предусмотрена возможность
использования нескольких почтовых ящиков
или папок, которые находятся на сервере.
Такой тип получения почты требует более
тщательного администрирования, так как все
почтовые сообщения и почтовые ящики
находятся на сервере. Однако если сервер
выходит из строя, разрывает соединение или
же его диски переполняются, то все
пользователи утрачивают возможность
получения почты. Администраторы систем
электронной почты с использованием IMAP
должны уделять достаточное внимание
различным деталям при функционировании
почтового сервера. В операционной системе
Linux функции сервера IMAP реализованы в
программе imapd. Для
получения почты с сервера в качестве
клиента IMAP может быть сконфигурирована
стандартная программа fetchmail.
В этой лекции
В предыдущей лекции обсуждался протокол POP3, который является одним из наиболее популярных протоколов для получения почтовых сообщений с сервера электронной почты. Хотя протокол POP3 легко реализуется практически в любой операционной системе, он имеет ряд недостатков. Наиболее серьезный из них — отсутствие возможностей по управлению перемещением и хранением сообщений на сервере. Сообщения, как правило, загружаются с почтового сервера все сразу, после чего они с сервера удаляются, т.е. отсутствует возможность выбирать сообщения для получения. Такая схема хороша лишь для провайдера Internet, обслуживающего почтовый сервер вашей организации, так как при этом экономится дисковое пространство на сервере. Однако пользователей такая ситуация не удовлетворяет, поскольку при приеме почты они ограничены лишь одним ПК, на который загружаются сообщения. Когда пользователи получают почту по локальной сети и только на определенный ПК, то проблема не возникает. Если же они пожелают получать почту и на работе, и дома, то сразу появляется много проблем. В этом случае сообщения распределяются после получения между двумя рабочими станциями, которые к тому же расположены в различных местах!
Для решения подобных проблем был
разработан новый протокол. Протокол Internet Mail
Access Protocol (IMAP), разработанный в Вашингтонском
университете, предполагает возможность
получения пользователями электронной
почты из одного почтового ящика из
различных мест, при этом сообщения не
распределяются между точками получения.
Пользователю предоставляется возможность
управлять сообщениями в его почтовом ящике
и дополнительными функциями по
обслуживанию почтовых ящиков на сервере.
Конечно, есть и обратная сторона этой
медали — почтовый сервер под
управлением ОС Linux должен обслуживать всю
почту, которая находится на его жестком
диске. Это может создать
В этой лекции мы расскажем о работе протокола IMAP и способах его реализации в операционной системе Linux. Текущая версия IMAP — 4 с номером реализации 1 или сокращенно IMAP4rev1. Этот протокол полностью описан в документе RFC 2060.
Как и POP3, протокол IMAP использует концепцию клиент-сервер с набором команд. С помощью команд осуществляется передача сообщений электронной почты от сервера клиенту. Клиент устанавливает для этой цели TCP-соединение с портом 143 на сервере. Далее сервер должен ответить специальным сообщением-приглашением. В листинге 7.1 приведен пример сеанса по протоколу IMAP.
1 [jessica@shadrach jessical$ telnet localhost 143 2 Trying 127.0.0.1 ... 3 Connected to localhost. 4 Escape character is '^]'. 5 * OK shadrach.smallorg.org IMAP4revl V12.250 server ready 6 a001 LOGOUT 7 * BYE shadrach.smallorg.org IMAP4rev1 server terminating connection 8 a001 OK LOGOUT completed 9 Connection closed by foreign host. 10 [jessica@snadrach jessica]$
В строке 1 показана команда на
открытие сеанса с помощью telnet
с портом 143 (порт IMAP по умолчанию). Строка 5
отображает приглашение, выданное сервером
IMAP. В строке 6 клиентом задана команда
закончить сеанс с сервером. Затем сервер
посылает сообщение об окончании сеанса (строка
7) и закрывает соединение с клиентом.
Каждая команда, выдаваемая
клиентом, предваряется уникальным
идентификатором. Сервер может затем
использовать этот идентификатор в своих
ответах, что позволяет клиенту определить,
к какой команде относится ответ сервера.
Это особенно важно при выполнении сервером
нескольких команд за сеанс. Идентификатор
обычно представляет собой короткую строку
алфавитно-цифровых символов, которая
генерируется клиентом. Так, в строке 6
листинга 7.1 клиентом был выбран
идентификатор a001.
Если бы клиенту потребовалось задавать и
другие команды, то следующим
идентификатором был бы a002
и т.д. Часто для упрощения
идентификаторы команд в течение сеанса IMAP
просто последовательно увеличивают один из
своих разрядов.
После установления соединения клиент находится в состоянии ожидания проверки подлинности, так как для выполнения каких-либо операций со своим почтовым ящиком на сервере он должен идентифицировать себя. После идентификации на сервере клиент может использовать команды IMAP для управления сообщениями на сервере. Протоколом IMAP предусмотрена возможность поддержки пользователем нескольких почтовых ящиков на одном сервере. При этом клиент может читать, отправлять и удалять сообщения в любом из принадлежащих ему почтовых ящиков. Это серьезный шаг вперед, по сравнению с протоколом POP3.
Так же как и в протоколе POP3, в IMAP имеется несколько методов проверки подлинности клиента. Некоторые из них обеспечивают больший уровень безопасности, по сравнению с другими. В отличие от клиентов POP3, клиенты IMAP часто проводят довольно длительные сеансы с сервером при обработке сообщений. Таким образом, идентификатор пользователя и пароль не передаются по сети несколько раз в час, как это обычно происходит при работе по протоколу POP3. Несомненно, что передача идентификатора пользователя и пароля в зашифрованном виде остается актуальной и применяется по мере возможности.
Команда LOGIN
позволяет клиенту при регистрации на
сервере IMAP использовать идентификатор
пользователя и пароль в обычном текстовом
виде. Хотя это и не наилучший метод, все же
иногда это единственная возможность
подключиться к серверу. В листинге 7.2
представлен сеанс IMAP с использованием
команды LOGIN.
1 [katie@shadrach katie]$ 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 a001 LOGIN katie boxcar 7 a001 OK LOGIN completed 8 a002 LOGOUT 9 * BYE shadrach.smallorg.org IMAP4rev1 server terminating connection 10 a002 OK LOGOUT completed 11 Connection closed by foreign host. 12 [katie@shadrach katie]$
В строке 6 вы видите, как
пользователь katie
регистрируется на сервере IMAP с помощью
команды LOGIN. В
строке 7 показан ответ сервера. Обратите
внимание, что сервер в ответе указал
идентификатор команды клиента ( a001 ).
С помощью команды AUTHENTICATE
клиент может использовать при регистрации
на сервере IMAP альтернативные методы
проверки подлинности. Индивидуальная
проверка подлинности пользователей не
является обязательной и поддерживается не
всеми серверами IMAP. К тому же реализации
такой проверки могут различаться в
зависимости от сервера. Когда клиент выдает
команду AUTHENTICATE,
сервер отвечает на нее строкой вызова в
кодировке base64. Далее в обязанности клиента
входит ответ на вызов сервера о проверке
подлинности, также закодированный base64. Если
на сервере не поддерживается метод
проверки подлинности, предложенный
клиентом, он включает в свой ответ
отрицательное слово NO.
После этого клиент должен продолжить
переговоры по согласованию метода проверки
подлинности. Если все попытки определить
метод проверки подлинности потерпели
неудачу, то клиент предпринимает попытку
зарегистрироваться на сервере посредством
команды LOGIN.
Пример сеанса с применением AUTHENTICATE
представлен в листинге 7.3.
1 [riley@shadrach riley]$ 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 AUTHENTICATE KERBEROS_V4 7 a1 NO AUTHENTICATE KERBEROS_V4 failed 8 a2 AUTHENTICATE GSSAPI 9 a2 NO AUTHENTICATE GSSAPI failed 10 a3 AUTHENTICATE LOGIN 11 + VXNlciBOYU1lAA== 12 * 13 a3 NO AUTHENTICATE LOGIN failed 14 a4 LOGIN riley firetruck 15 a4 OK LOGIN completed 16 a5 LOGOUT 17 * BYE shadrach.smallorg.org IMAP4rev1 server terminating connection 18 a5 OK LOGOUT completed 19 connection closed by foreign host. 20 [riley@shadrach riley]$
В строках 6–9 показаны попытки
клиента согласовать с сервером IMAP метод
проверки подлинности. Как видите, все они не
увенчались успехом. А в строке 10 показано,
что метод проверки, приемлемый и для
клиента, и для сервера, найден. Отвечая,
сервер в строке 11 выдает кодированную
строку с вызовом в кодировке base64. Однако в
строке 12 клиент отвергает попытку
регистрации и возобновляет ее лишь в строке
14 с помощью команды LOGIN.
После регистрации на сервере IMAP клиент может приступить к манипулированию сообщениями. Протокол IMAP предлагает довольно много команд для чтения, перемещения и удаления почтовых сообщений в почтовых ящиках на сервере. Помните, что протокол IMAP предполагает хранение всех сообщений на сервере. Загрузка почтовых сообщений на локальный компьютер производится лишь для отображения. При этом они не перемещаются и не копируются на локальный ПК клиента.
Почтовый ящик для клиента по
умолчанию носит название INBOX.
Все новые сообщения попадают именно в INBOX. Клиент имеет возможность создавать
новые почтовые ящики (иногда называемые в
программах-клиентах для работы с
электронной почтой папками). Туда с целью
упорядочения он может перемещать сообщения
из папки INBOX.
Каждому сообщению назначается
уникальный идентификатор (UID), по которому
они идентифицируются в почтовом ящике.
Метка UID сохраняется в течение всех сеансов
IMAP для того, чтобы клиентское программное
обеспечение могло правильно
идентифицировать сообщения в почтовом
ящике. Каждому почтовому ящику
соответствует уникальный идентификатор
достоверности ( UIDVALIDITY ).
Метка UIDVALIDITY
должна присутствовать во время всех
сеансов IMAP, только в том случае, если
идентификаторы сообщений в ящике
оставались неизменными. Если в почтовом
ящике имеются сообщения с различными
идентификаторами, то значение UIDVALIDITY при следующем сеансе должно
увеличиться. Это позволяет клиентам быстро
определять, появились ли в почтовом ящике
новые сообщения с момента последнего к нему
обращения.
Каждое сообщение снабжается флагом, который отображает его статус. Флаг может быть постоянным или задаваться на время сеанса. Постоянные флаги могут изменяться клиентом и сохраняться вне зависимости от сеансов. Флаги, назначаемые на время сеанса, действительны только на время текущего сеанса IMAP. В табл. 7.1 представлены варианты флагов почтовых сообщений.
| Флаг | Описание |
|---|---|
\Seen |
Сообщение прочитано |
\Answered |
На сообщение послан ответ |
\Flagged |
Сообщение принудительно отмечено |
\Deleted |
Сообщение удалено |
\Draft |
Сообщение не окончено (черновик) |
\Recent |
Новое сообщение в почтовом ящике |
Почтовому сообщению может соответствовать 0 флагов или несколько флагов. Информация о флагах передается клиенту вместе с самим сообщением. В обязанности клиента входит интерпретация флагов соответствующим образом.
В следующем разделе описываются команды IMAP, которые клиент может задавать серверу. Хотя, согласно RFC, команды IMAP набираются заглавными буквами, большинство серверов IMAP воспринимает команды, заданные как заглавными, так и прописными буквами. Сервер должен отвечать соответствующим образом на заданные команды или отвечать отрицательно, если команда задана неправильно либо не поддерживается.
Команда 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]$
В строке 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
такой же, как и на команду SELECT.
Аргумент команды EXAMINE
также может выступать имя почтового ящика,
к которому она применяется. Пока почтовый
ящик открыт, с помощью EXAMINE нельзя выполнять никакие действия.
Таким образом, в этом режиме исключена
возможность добавления или удаления флагов
сообщений.
Команда CREATE
используется для создания нового почтового
ящика на сервере IMAP. Имя и местоположение
новых почтовых ящиков определяются в
соответствии с общими спецификациями ОС Linux.
В рабочем каталоге пользователя создается
новый почтовый ящик с именем, но без задания
местоположения, так как оно известно
каталогу $HOME
клиента. Например, если рабочий каталог
клиента находится в /home/riley
и клиент задает команду CREATE
для создания нового почтового ящика stuff/,
то вновь созданный ящик на почтовом сервере
под управлением ОС Linux будет иметь путь /home/riley/stuff/.
В этом примере вы видите, как используется
знак разделителя /.
Однако это не является общим для всех
серверов IMAP.
Папки или почтовые ящики?
Некоторые программы IMAP-клиенты используют термин папка по отношению к новым почтовым ящикам. Многие из них позволяют пользователям также создавать их с определенным уровнем вложенности, так что будьте осторожны при создании новых папок (почтовых ящиков). С ростом длины пути к почтовому ящику становится все трудней обслуживать его.
В листинге 7.5 представлен пример сеанса IMAP по созданию нового почтового ящика, который затем делается активным.
1 [alex@shadrach alex]$ ls -l 2 total 0 3 [alex@shadrach alex]$ telnet localhost 143 4 Trying 127.0.0.1... 5 Connected to localhost. 6 Escape character is '^]'. 7 * OK localhost IMAP4rev1 V12.250 server ready 8 a1 LOGIN alex drums 9 a1 OK LOGIN completed 10 a2 CREATE stuff/junk 11 a2 OK CREATE completed 12 a3 SELECT stuff/junk 13 * 0 EXISTS 14 * 0 RECENT 15 * OK [UIDVALIDITY 936998958] DID validity status 16 * OK [UIDNEXT 1] Predicted next UID 17 * FLAGS (\Answered VFlagged \Deleted \Draft \Seen) 18 * OK [PERMANENTFLAGS (\* \Answered \Flagged \Deleted \Draft \Seen)] Permanent fs 19 a3 OK [READ-WRITE] SELECT completed 20 a4 LOGOUT 21 * BYE shadrah.smallorg.org IMAP4rev1 server terminating connection 22 a4 OK LOGOUT completed 23 Connection closed by foreign host. 24 [alex@shadrach alex]$ ls -lR 25 .: 26 total 1 27 drwx------ 2 alex alex 1024 Sep 10 16:29 stuff 28 29 stuff: 30 total 1 31 -rw------ 1 alex alex 516 Sep 10 16:29 junk 32 [alex@shadrach alex]$
В строке 1 показано, как
пользователь alex
задает команду просмотра в своем рабочем
каталоге. В строке 3 он устанавливает
соединение с локальным сервером IMAP с
помощью telnet.
После регистрации на сервере он задает
команду CREATE в
строке 10 для создания нового почтового
ящика в системе. В строке 11 вы видите
положительный ответ сервера, который
сигнализирует о том, что новый почтовый
ящик был создан. Затем пользователь alex
пытается получить доступ к новому ящику
через команду SELECT (строка
12). В строках 13–19 показан ответ сервера IMAP с
информацией о новом почтовом ящике (в нем
отсутствуют как новые, так и старые
сообщения). После того как пользователь alex
убедился в работоспособности нового
почтового ящика, он завершает сеанс работы
с сервером IMAP. И завершает приведенный
пример еще одна попытка нашего героя
получить сведения о своем рабочем каталоге
в строке 24. На этот раз в строках 25–31
показаны новый подкаталог с именем stuff
и новый файл в нем с именем .
Обратите внимание, что новый почтовый ящик
является файлом, а не каталогом. Сообщения,
помещенные в этот почтовый ящик, будут
просто добавляться в этот файл.
Команда DELETE
применяется к почтовым ящикам, а не к
сообщениям. Сервер IMAP при получении этой
команды попытается удалить почтовый ящик с
именем, указанным в качестве аргумента
команды. В аргументе команды можно
использовать стандартное описание путей ОС
Linux, со знаком разделителя /,
если только они не находятся в каталоге $HOME.
Сообщения из удаленных почтовых ящиков
восстановлению не подлежат и теряются
вместе с ящиками.
С помощью команды RENAME
клиент может изменить имя почтового ящика.
При этом возможно применение двух
параметров. Первый параметр —
собственно имя почтового ящика, который
требуется переименовать. И второй параметр —
новое имя почтового ящика. Для обоих
параметров действительны стандартные
методы задания путей в ОС Linux. Помните, что
пути без знака разделителя /
относятся только к рабочему каталогу
пользователя $HOME,
под которым была произведена регистрация в
системе (на сервере). В листинге 7.6 приведен
пример переименования почтового ящика.
1 [alex@shadrach alex]$ ls -lR 2 .: 3 total 1 4 drwx------ 2 alex alex 1024 Sep 10 16:48 stuff 5 6 stuff: 7 total 1 8 -rw------- 1 alex alex 918 Sep 10 16:44 junk 9 [alex@shadrach alex]$ telnet localhost 143 10 Trying 127.0.0.1... 11 Connected to localhost. 12 Escape character is '^]'. 13 * OK localhost IMAP4rev1 V12.250 server ready 14 a1 login alex drums 15 a1 OK LOGIN completed 16 a2 rename stuff/junk newbox 17 a2 OK RENAME completed 18 a3 select newbox 19 * 1 EXISTS 2B • B RECENT 21 * OK [UIDVALIDITY 936998958] UID validity status 22 * OK [UIDNEXT 2] Predicted next UID 23 * FLAGS (\Answered \Flagged \Deleted VDraft \Seen) 24 * OK [PERMANENTFLAGS (\* \Answered \Flagged \Deleted \Draft \Seen)] Permanent flags 25 a3 OK [READ-WRITE] SELECT completed 26 a4 logout 27 * BYE shadrach.smallorg.org IMAP4rev1 server terminating connection 28 a4 OK LOGOUT completed 29 Connection closed by foreign host. 30 [alex@shadrach alexl$ ls -lR 31 .: 32 total 2 33 -rw------- 1 alex alex 918 Sep 10 16:44 newbox 34 drwx------ 2 alex alex 1024 Sep 12 13:59 stuff 35 36 stuff: 37 total 0 38 [alex@shadrach alex]$
В строке 1 пользователь alex
задает команду на просмотр содержимого
своего рабочего каталога. Как и в
предыдущем примере, у него имеется почтовый
ящик stuff/,
который находится в подкаталоге stuff
в файле . В
строке 9 пользователь alex
устанавливает IMAP-соединение с localhost.
После выполнения всех формальностей, в
строке 16 он задает команду RENAME
для переименования своего ящика с именем stuff/ в newbox.
Строка 17 отображает положительный ответ
сервера IMAP на эту команду. В строке 18
пользователь alex
пытается сделать переименованный почтовый
ящик активным для чего выдает команду SELECT.
Сервер отвечает на нее сведениями о
содержимом нового ящика. Обратите внимание
на строку 19. Дело в том, что alex
предварительно сохранил в почтовом ящике stuff/
сообщение. И теперь, как видите,
переименованный почтовый ящик newbox
также содержит одно сообщение. Таким
образом, можно сделать вывод, что
переименование не влияет на содержимое
почтового ящика. После завершения сеанса IMAP alex повторно
выполняет просмотр рабочего каталога. К его
и нашему удивлению подкаталог с именем stuff
все еще здесь, но файл
уже обнулен. Давайте попробуем разобраться,
что же произошло. Сервер IMAP удалил файл с
именем из
подкаталога stuff,
но сам подкаталог удален не был. В строке 33
показано, что был создан новый почтовый
ящик с именем newbox.
Команда SUBSCRIBE
используется для добавления почтового
ящика в список активных ящиков клиента. В
ней используется только один параметр —
имя почтового ящика, который нужно внести в
список. Все активные почтовые ящики могут
отображаться с помощью команды LSUB,
которая будет описана позже. Почтовый ящик
не обязательно должен существовать, чтобы
его можно было добавить в список активных
ящиков. Эта возможность заложена для того,
чтобы добавлять в список активных ящиков те,
которые еще не созданы, или удалять их, если
они пусты.
Для удаления почтовых ящиков из
списка активных используется команда .
С ней также может использоваться только
один параметр — имя почтового ящика,
который удаляется из списка активных
ящиков клиента. При этом сам по себе
почтовый ящик не удаляется. Он просто
исключается из списка активных почтовых
ящиков. Все активные почтовые ящики могут
отображаться с помощью команды LSUB,
которая будет описана ниже.
Команда 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]$
В строке 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
используется для устранения проблемы,
которая описана для команды LIST.
В отличие от команды LIST, с помощью которой отображается все
содержимое рабочего каталога пользователя,
с помощью команды LSUB
отображаются лишь активизированные ранее
описанной командой SUBSCRIBE
почтовые ящики клиента. Параметры команды LSUB
точно такие же, что и для команды LIST,
т.е. ссылка ( reference )
и имя почтового ящика. Подобно команде LIST,
параметр ссылки указывает путь к каталогу,
в котором находятся почтовые ящики с
соответствующими именами (каталог $HOME,
если указано "" ).
Соответственно, под именем почтового ящика
понимается имя ящика или имена ящиков,
которые требуется вывести в списке (допускается
групповой символ ( * ).
Почтовые ящики могут затем
добавляться в список активных ящиков с
помощью команды SUBSCRIBE,
а удаляться из списка с помощью команды . С помощью этих команд можно
реализовать на базе клиента 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]$
В строке 8 пользователь alex
добавляет созданный в предыдущем примере
почтовый ящик к списку своих почтовых
ящиков. В строке 10 он выдает команду LSUB,
чтобы просмотреть, какие почтовые ящики у
него уже имеются. Обратите внимание:
параметры, заданные с LSUB,
говорят о том, что ящики находятся в его
рабочем каталоге $HOME
и все они должны быть показаны в списке ( * ).
Ответ сервера IMAP показан в строках 11–14. Как
видите, он сильно отличается от ответа,
полученного с помощью команды LIST
(см. листинг 7.7). В списке указаны только
те почтовые ящики, на которые подписан
пользователь alex.
Обратите также внимание на строку 11. Как мы
уже могли видеть в листинге 7.6, почтовый
ящик stuff/jerk был
успешно переименован. Что же произошло? А
теперь вспомните, что подписка на почтовый
ящик вовсе не означает, что он реально
существует. Просто команда LSUB
хранит в своем активном списке сведения обо
всех почтовых ящиках, на которые подписан
пользователь, хотя реальное состояние
ящиков уже давно изменилось. Это свойство LSUB
позволяет временно удалять почтовые ящики,
пока они пусты, и вновь создавать их без
помощи клиентов, как только в них приходят
новые сообщения. Таким образом, клиентам не
нужно повторять процедуру подписки на
почтовые ящики.
Команда STATUS
используется для формирования запроса о
текущем состоянии почтового ящика. Первым
параметром для этой команды является имя
почтового ящика, к которому она применяется.
Второй параметр — это список пунктов, по
которым клиент может получить информацию (она
заключается в круглые скобки () ).
Команда STATUS может
использоваться отдельно для получения
информации о состоянии почтового ящика без
его открытия с помощью команд SELECT
или EXAMINE.
Список критериев, по которым
команда STATUS может
выдавать информацию, представлен в табл. 7.2.
| Критерий | Описание |
|---|---|
MESSAGES |
Общее число сообщений в почтовом ящике |
RECENT |
Число сообщений в ящике с флагом \RECENT (новые) |
UIDNEXT |
Следующий доступный идентификатор UID, который будет назначен новому сообщению |
UIDVALIDITY |
Уникальный идентификатор UID почтового ящика |
UNSEEN |
Число сообщений в почтовом ящике без флага \SEEN |
Пример сеанса IMAP с командой STATUS показан в листинге 7.9.
1 [alex@shadrach alex]$ telnet localhost 143 2 Trying 127.0.0.1... 3 Connected to localhost. 4 Escape character is '^]'. 5 * OK localhost lMAP4rev1 V12.250 server ready 6 a1 login alex drums 7 a1 OK LOGIN completed 8 a2 status inbox (messages recent unseen) 9 * STATUS inbox (MESSAGES 1 RECENT 0 UNSEEN 0) 10 a2 OK STATUS completed 11 a3 status newbox (messages uidnext unseen) 12 * STATUS newbox (MESSAGES 1 UNSEEN 0 UIDNEXT 2) 13 a3 OK STATUS completed 14 a4 logout 15 * BYE shadrach.smallorg.org IMAP4rev1 server terminating connection 16 a4 OK LOGOUT completed 17 Connection closed by foreign host. 18 [alex@shadrach alex]$
В строке 8 пользователь alex
выдает команду STATUS
для запроса информации о количестве
сообщений в почтовом ящике, о количестве
новых и непрочитанных сообщений в
специальном ящике INBOX.
Строка 9 является ответом сервера IMAP на эту
команду. В строке 11 пользователем alex
выдается команда STATUS
уже для другого почтового ящика. Обратите
внимание на ответ сервера IMAP в строке 12.
Здесь сервер ответил сведениями,
запрошенными о почтовом ящике, но не в том
порядке, как они запрашивались. Дело в том,
что сервер IMAP всегда выводит информацию в
определенном порядке. Сведения о состоянии
почтового ящика выдаются в таком порядке: MESSAGES, RECENT, UNSEEN, UIDNEXT,
и UIDVALIDITY.
APPEND —
еще одна команда из семейства команд IMAP. Как
правило, протокол IMAP применяется
исключительно для чтения сообщений из
почтовых ящиков. С помощью команды APPEND появляется возможность посылать
сообщения в почтовый ящик, добавляя
сообщение к концу файла почтового ящика.
Эта функция работает не совсем корректно и
она является довольно опасной, поэтому не
рекомендуем увлекаться ею в качестве
альтернативы SMTP. Это, скорее, приятное
излишество протокола IMAP, а не рабочая
лошадка. Основной формат команды APPEND
следующий:
APPEND mailbox [(flags)] [date/time string] {message size} message
Эта команда является фактически рабочим макетом будущей команды. В листинге 7.10 показана попытка помещения сообщения в почтовый ящик. Естественно, что в этом случае программе-клиенту требуются права как на чтение из почтового ящика, так и на запись в него.
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 create testbox
9 a2 OK CREATE completed
10 a3 append testbox (\SEEN) {23}
11 + Ready for argument
12 This is a test message.
13 a3 OK APPEND completed
14 a4 select testbox
15 * 1 EXISTS
16 * 1 RECENT
17 * OK [UIDVALIDITY 937242636] UID validity Status
18 * OK [UIDNEXT 2] Predicted next UID
19 * FLAGS (\Answered \Flagged \Deleted \Draft \Seen)
20 * OK [PERMANENTFLAGS (\* \Answered \Flagged \Deleted \Draft \Seen)] Permanent fs
21 a4 OK [READ-WRITE] SELECT completed
22 a5 logout
23 * BYE shadrach. smallorg.org IMAP4rev1 server terminating connection
24 a5 OK LOGOUT completed
25 Connection closed by foreign host.
26 [alex@shadrach alex]$ mail -f testbox
27 Mail version 8.1 6/6/93. Type ? for help.
28 "testbox": 2 messages
29 > 1 MAILER-DAEMON@shadra Mon Sep 12 19:11 12/516 "DON'T DELETE THIS MES"
30 2 alex@shadrach.smallo Mon Sep 12 19:11 8/128
31 2
32 Message 2:
33 From alex@shadrach.smallorg.org Mon Sep 12 19:11:18 1999 -0500
34
35 This is a test message
36 Status: RO
37 X-Status:
38 X-Keywords:
39 X-UID: 1
40
41 q
42 [alex@shadrach alex]$
В строке 8 пользователь alex
создает специально для тестирования новый
почтовый ящик. В строке 10 начинается работа
команды APPEND.
Добавляемое сообщение обозначается флагом
как прочитанное. Флагом не помечаются
только те сообщения, в конце которых
отсутствует завершающая пустая строка CR-LF.
В нашем примере пользователь alex
использовал простейшее сообщение. Далее,
после нажатия клавиши Enter
сервер IMAP ответил положительно и "попросил"
пользователя ввести "аргумент" для
команды APPEND в
строке 11. Пользователь в ответ на это
приглашение набрал сообщение. Далее, как
видите, сообщение было успешно добавлено в
почтовый ящик клиента. В строке 14 для
активизации почтового ящика testbox
пользователь задал команду SELECT.
Ответ сервера на команду SELECT дает нам дополнительную пищу для
размышлений. Обратите внимание: в строке 15
говорится о том, что в почтовом ящике
имеется одно новое сообщение, а в строке 16
оно обозначено флагом как "новое". Однако
команда SELECT не
дает пользователю увидеть UID
непрочитанного сообщения, поэтому все
сообщения в ящике обозначаются флагом как
"прочитанные". Это соответствует тому, что
мы говорили о команде APPEND.
Как видите, пользователь alex
применил флаг \SEEN для
добавляемого сообщения. Чтобы окончательно
удостовериться в том, что сообщение
добавлено, пользователь alex
завершает сеанс работы с сервером IMAP и с
помощью программы для чтения почты в ОС Linux
обращается к своему почтовому ящику testbox. Это показано в строке 26, где
пользователь alex
выдает команду на чтение почты из ящика mail -f testbox. В строке 30 показано, что в
почтовом ящике имеется сообщение, тема
которого не указана. Отобразив это
сообщение на экране, мы видим, что это
именно то сообщение, которое было послано с
помощью команды APPEND.
Было бы это сообщение реальным, пришедшим
от удаленного пользователя или созданным с
помощью программы для чтения почты
пользователя alex,
все равно оно должно иметь стандартный вид,
соответствующий RFC 822, только тогда сервер
IMAP сможет обработать его определенным
образом.
Команда CHECK
используется для установки контрольной
точки в почтовом ящике. Любые операции,
такие, например, как запись данных из памяти
сервера на его жесткий диск, должны
выполняться при соответствующем состоянии
почтового ящика. Именно для проверки
целостности почтового ящика после дисковых
и других подобных им операций и применяется
команда CHECK. Эта
команда используется без параметров.
Команда CLOSE
полностью соответствует своему названию —
она закрывает почтовый ящик. Когда почтовый
ящик закрыт, то все сообщения, помеченные
флагом \DELETED,
физически удаляются из него. Действие
команды CLOSE четко
прослеживается на только что открытом
новом почтовом ящике. Открытый почтовый
ящик закрывается также с помощью команды LOGOUT
(о ней мы поговорим позже). Команда CLOSE
не имеет параметров.
Команда
используется для удаления из почтового
ящика всех сообщений, помеченных флагом \DELETED,
при этом почтовый ящик не закрывается.
Ответ сервера на команду
представляет собой отчет о новом состоянии
почтового ящика. В листинге 11 показан
пример работы с командой .
1 [alex@shadrach alex]$ telnet localhost 143 2 Trying 127.0.0.1... 3 Connected to localhost. 4 Escape character is '^]'. 5 * OK localhost lMAP4rev1 v12.250 server ready 6 a1 login alex drums 7 a1 OK LOGIN completed 8 a2 select newbox 9 * 6 EXISTS 10 * 0 RECENT 11 * OK [UIDVAHDITY 937243866] DID validity status 12 * OK [UIDNEXT 8] Predicted next UID 13 * FLAGS (\Answered \Flagged \Deleted \Draft \Seen) 14 * OK [PERMANENTFLAGS (\* \Answered \Flagged \Deleted \Draft VSeen)] Permanent flags 15 * OK [UNSEEN 1] first unseen message in /home/alex/newbox 16 a2 OK [READ-WRITE] SELECT completed 17 a3 store 1 +flags \DELETED 18 * 1 FETCH (FLAGS (\Deleted)) 19 a3 OK STORE completed 20 a4 store 2 +flags \DELETED 21 * 2 FETCH (FLAGS (\Deleted)) 22 a4 OK STORE completed 23 a5 status newbox (messages unseen) 24 * STATUS newbox (MESSAGES 6 UNSEEN 6) 25 a5 OK STATUS completed 26 a6 expunge 27 * 1 EXPUNGE 28 * 1 EXPUNGE 29 * 4 EXISTS 30 * 0 RECENT 31 a6 OK Expunged 2 messages 32 a7 status newbox (messages unseen) 33 * STATUS newbox (MESSAGES 4 UNSEEN 4) 34 a7 OK STATUS completed 35 a8 logout 36 * BYE shadrach.sniallorg.org IMAP4rev1 server terminating connecion 37 a8 OK LOGOUT completed 38 Connection closed by foreign host. 39 [alex@shadrach alex]$
В строке 8 пользователь alex
выбирает почтовый ящик с именем newbox.
Строки 9–16 представляют собой ответ
сервера с информацией относительно
выбранного почтового ящика. Строка 9
говорит о том, что в нем находится 6
сообщений. В строках 17 и 20 пользователь alex
воспользовался командой STORE
(о ней мы поговорим позже), чтобы пометить
два сообщения как удаленные ( \DELETED ).
Затем в строке 23 пользователь alex
выдает команду STATUS.
Из строки 24 можно сделать заключение, что, с
точки зрения сервера IMAP, в почтовом ящике
все еще находятся шесть сообщений, хотя два
из них помечены как удаленные. В строке 26
пользователь выдает команду ,
по которой сообщения, помеченные как
удаленные, стираются. Ответ сервера в
строках 27–31 подтверждает, что сообщения
были удалены из ящика и в нем осталось
четыре сообщения. Это же подтверждает и
команда STATUS,
заданная в строке 32. На нее сервер отвечает,
что в почтовом ящике теперь только четыре
сообщения.
Команда SEARCH
является одним из наиболее мощных средств
из арсенала IMAP. С помощью этой команды
производится поиск сообщений по критериям
в активном почтовом ящике с последующим
отображением результатов в виде номера
сообщения. Формат команды SEARCH
следующий:
SEARCH [CHARSET specification] (search criteria)
Здесь CHARSET
specification состоит из служебного слова CHARSET,
за которым следует обозначение набора
символов. Набор символов по умолчанию — ASCII,
так что, как правило, этот параметр
опускается. Параметр search criteria определяет ключевые критерии
поиска и их значения. Критерии поиска
описаны в табл. 7.3.
| Критерий поиска | Описание |
|---|---|
<message set> |
Сообщения с номерами, соответствующими заданному диапазону |
ALL |
Все сообщения в почтовом ящике |
ANSWERED |
Сообщения с флагом \ANSWERED |
|
Сообщения, содержащие заданную строку в поле заголовка |
BEFORE <date> |
Сообщения, которые были созданы до указанной даты |
BODY |
Сообщения, содержащие в теле указанную строку |
CC <string> |
Сообщения, содержащие заданную строку в поле заголовка CC |
DELETED |
Сообщения с флагом \DELETED |
DRAFT |
Сообщения с флагом \DRAFT |
FLAGGED |
Сообщения с набором флагов \FLAGGED |
From <string> |
Сообщения, содержащие заданную строку в поле заголовка From |
HEADER <field name> <STRING> |
Сообщения, содержащие указанный заголовок с заданной в нем строкой |
KEYWORD <flag> |
Сообщения, содержащие указанный список критериев |
LARGER <n> |
Сообщения, размер которых больше n |
NEW |
Сообщения с флагом \RECENT, но без флага \SEEN |
NOT <search key> |
Сообщения, не содержащие указанный список критериев |
OLD |
Сообщения без флага \RECENT |
ON <date> |
Сообщения, которые были созданы в указанный день |
OR <searchkey 1> <searchkey 2> |
Сообщения, содержащие логические критерии поиска ИЛИ |
RECENT |
Сообщения с флагом \RECENT |
SEEN |
Сообщения с флагом \SEEN |
SENTBEFORE <date> |
Сообщения, которые были созданы до указанной даты, согласно полю заголовка Date |
SENTON <date> |
Сообщения, которые были созданы в указанную дату, согласно полю заголовка Date |
SENTSINCE <date> |
Сообщения, которые были созданы после указанной даты, согласно полю заголовка Date |
SINCE <date> |
Сообщения, которые были созданы после указанной даты |
SMALLER <n> |
Сообщения, размер которых не превышает n |
TEXT <string> |
Сообщения, которые содержат указанную строку или в заголовках, или в теле сообщения |
UID <message set> |
Сообщения с UID, соответствующими заданному диапазону |
UNANSWERED |
Сообщения без флага \ANSWERED |
|
Сообщения без флага \DELETED |
UNDRAFT |
Сообщения без флага \DRAFT |
UNFLAGGED |
Сообщения без набора флагов \FLAGGED |
UNKEYWORD <flag> |
Сообщения без набора заданных критериев |
UNSEEN |
Сообщения без флага \SEEN |
Как видно из табл. 7.3,
существует огромное количество критериев
поиска сообщений. Это очень удобно, когда
требуется найти специфическое сообщение в
почтовых ящиках, которые заполнены большим
количеством сообщений. В листинге 7.12
представлен короткий пример с
использованием команды SEARCH.
1 [alex@shadrach alex]$ telnet localhost 143 2 Trying 127.0.0.1... 3 Connected to localhost. 2 Escape character is '^]'. 4 * OK localhost IMAP4rev1 V12.250 server ready 5 a1 login alex drums 7 a1 OK LOGIN completed 8 a2 select inbox 9 * 2 EXISTS 10 * 0 RECENT 11 * OK [UIDVALIDITY 936999597] UID validity status 12 * OK [UIDNEXT 5] Predicted next UID 13 * FLAGS (\Answered \Flagged \Deleted \Draft \Seen) 14 * OK [PERMANENTFLAGS (\* \Answered \Flagged \Deleted \Draft \Seen)] Permanent fs 15 * OK [UNSEEN 1] first unseen message in /var/spool/mail/alex 16 a2 OK [READ-WRITE] SELECT completed 17 a3 search header subject test 18 * SEARCH 1 2 19 a3 OK SEARCH completed 20 a4 search header subject another 21 * SEARCH 2 22 a4 OK SEARCH completed 23 a5 search unseen 24 * SEARCH 1 2 25 a5 OK SEARCH completed 26 a6 logout 27 * BYE shadrach.smallorg.org IMAP4rev1 server terminating connection 28 a6 OK LOGOUT completed 29 Connection closed by foreign host. 30 [alex@shadrach alex]$
В строках 17, 20 и 23 показаны
примеры использования команды SEARCH.
Строки 18, 21 и 24 являются ответами сервера IMAP
на команду SEARCH. В
ответе содержатся номера сообщений,
которые соответствуют критерию поиска.
Если соответствий не найдено, то сервер
возвращает слово SEARCH
без идентификатора сообщения UID.
Команда FETCH
используется для получения текста
почтового сообщения. Она применяется
только для отображения сообщений. В отличие
от POP3, клиент IMAP не сохраняет копию
сообщения на клиентском ПК. Обслуживание
сообщений в почтовом ящике здесь входит в
обязанности сервера. Формат команды FETCH
приведен ниже:
FETCH <message set> <data item names>
Здесь <message set> — диапазон номеров сообщений,
которые требуется получить, а < соответствуют описанию данных
каждого сообщения.
В качестве диапазона номеров сообщений может быть один номер, список номеров, разделенных запятыми, или диапазон номеров, который задается двоеточиями. Сервер IMAP будет возвращать заданные типы данных для всех сообщений диапазона.
Имена типов данных являются
сложной спецификацией частей сообщения,
которые могут возвращаться индивидуально.
Существует три макроса возврата информации
из сообщения: ALL, BODY
и BODY [section].
Тип данных ALL
не означает, что сообщение будет возвращено
целиком, как вы, возможно, предположили.
Однако синтаксис сообщения в этом случае
полноформатный и содержит набор флагов,
дату и конверт сообщения. Клиент IMAP может
легко проанализировать сообщение и разбить
его на части для последующего отображения
информации о сообщении.
Данные типа BODY
также не означают, что возвращается именно
тело сообщения, хотя при этом выделяется
тип текстовой части сообщения и размер тела
сообщения. При этом программа-клиент IMAP
может предоставить пользователю более
детальную информацию о сообщении на основе
анализа этого типа данных.
Макрос BODY [section]
может применяться для возврата отдельных
частей сообщения. В RFC 2060 описаны все части
сообщения формата RFC 822, которые могут
использоваться в этом разделе. Наиболее
часто встречаются части типа HEADER
и TEXT. Так, макрос BODY [HEADER] полностью возвращает заголовок
сообщения. Можно даже задать еще больший
уровень детализации — до отдельных
полей заголовка. Например, для возврата
поля заголовка Subject:
нужно задать BODY [HEADER.FIELDS (SUBJECT)]. Можно получать сразу несколько
полей заголовка. Для этого нужно задавать
их в круглых скобках, разделяя пробелами.
Макрос BODY [SECTION]
можно также модифицировать, добавляя к нему
поле <partial>.
Поле <partial> состоит
из двух чисел, разделенных точкой. Первое
число — начало октета данных, которые
выводятся на экран. Второе число обозначает
количество октетов данных, которые будут
выведены на экран. Это поле можно
использовать для управления выводом на
экран. Если, например, требуется вывести на
экран только первые 10 символов из тела
сообщения с номером 1, то можно использовать
следующую команду:
FETCH 1 BODY [TEXT] <0.10>
По этой команде выводится только
10 символов из тела сообщения, описанного
типом "text". Если
же в теле сообщения менее 10 символов, то
отображается все тело сообщения. В листинге
7.13 представлен пример использования
команды FETCH.
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 * 6 EXISTS
10 * 0 RECENT
11 * OK [UIDVALIDITY 937321060] UID validity status
12 * OK [UIDNEXT 7] Predicted next UID
13 * FLAGS (\Answered \Flagged \Deleted \Draft \Seen)
14 * OK [PERMANENTFLAGS (\* \Answered \Flagged \Deleted \Draft \Seen)] Permanent flags
15 a2 OK [READ-WRITE] SELECT completed
16 a3 fetch 3:5 body[header.fields (date from subject)]
17 * 3 FETCH (BODY[HEADER,FIELDS ("DATE" "FROM" "SUBJECT")] {112}
18 Date: Tue, 14 Sep 1999 10:09:50 -0500
19 From: alex@shadrach.smallorg.org
20 Subject: This is the first test message
21
22 )
23 * 4 FETCH (BODY[HEADER.FIELDS ("DATE" "FROM" "SUBJECT")] {113}
24 Date: Tue, 14 Sep 1999 10:10:04 -0500
25 From: alex@shadrach.smallorg.org
26 Subject: This is the second test message
27
28 )
29 * 5 FETCH (BODY[HEADER.FIELDS ("DATE" "FROM" "SUBJECT")] {112}
30 Date: Tue, 14 Sep 1999 10:10:26 -0500
31 From: alex@shadracn.smallorg.org
32 Subject: This is the third test message
34 )
35 a3 OK FETCH completed
36 a4 fetch 4 body[text]
37 * 4 FETCH (BODY[TEXT) {42}
38 This is the second test message for IMAP
39 )
40 a4 OK FETCH completed
41 a5 logout
42 * BYE shadrach.smallorg.org IMAP4rev1 server terminating connection
43 a5 OK LOGOUT completed
44 Connection closed by foreign host.
45 [alex@shadrach alex]$
В строках 16 и 30 показаны примеры
получения сведений о сообщении с помощью
команды FETCH. Так, в
строке 16 запрашиваются поля заголовка Date, From и Subject
для сообщений 3–5. В строках 17–35 показан
ответ сервера IMAP на эту команду с
соответствующей информацией о запрошенных
сообщениях. В строке 36 запрашивается текст
из тела сообщения номер 4. Соответственно,
строки 37–40 являются ответом сервера IMAP на
этот запрос, где отражается тело сообщения.
По умолчанию данные типа BODY [SECTION] изменяют сообщение,
устанавливая для него флаг \SEEN.
Если же нужно просмотреть часть сообщения
без установления флага, то данные типа BODY [SECTION] можно заменить на BODY.. С помощью этого типа данных
выполняется та же самая операция, что и в BODY [SECTION], но при этом не устанавливается
флаг \SEEN для
сообщения.
Команда STORE
применяется для изменения информации о
сообщении. Формат команды следующий:
STORE <message set> <data item name> <data item value>
Аргумент <message set> задает диапазон номеров сообщений,
к которым применяется команда STORE.
В настоящее время для этой команды
определено только два типа данных ( < ). Тип FLAGS
определяет набор флагов, установленных для
сообщения. Тип FLAGS.SILENT
также определяет набор флагов,
установленных для сообщения, но при этом
сервер IMAP не возвращает их новое значение в
своем ответе.
Поведением этих типов данных
можно управлять, задав перед ними знак плюс
( + ) или минус ( - ).
Знак плюс означает, что значение типа
данных ( < )
будет добавлено к сообщению, минус — что
оно будет удалено из сообщения.
Установка флагов в сообщении с
применением команды STORE
довольно хорошо продемонстрирована в
листинге 7.11. В строке 18 этого листинга
показано, как устанавливается флаг \DELETED
для сообщения в активном почтовом ящике с
номером 1. Обратите внимание, что перед
флагом задан знак плюс ( + ).
Можно было бы также задать флаг ( - ).
Тогда флаг \DELETED
был бы отменен для сообщения (один из
способов восстановить удаленное сообщение
до того, как вступят в силу контрольные
точки сообщения). И помните: сообщение,
помеченное флагом \DELETED,
не удаляется физически из почтового ящика
до выполнения команд по назначению новых
контрольных точек для почтового ящика. А
это делается с помощью команд CHECK, , SELECT
или LOGOUT.
Команда COPY
используется для копирования сообщений из
одного почтового ящика в другой. Формат
команды COPY
приведен ниже:
COPY <message set> <mailbox name>
Здесь <message set> задает диапазон номеров сообщений,
которые нужно скопировать из активного
почтового ящика, а <mailbox name> указывает имя ящика, в который их
нужно скопировать.
Для протокола IMAP не определена
\DELETED. После
следующей ротации почтового ящика (расстановки
контрольных точек) оригиналы сообщений
будут удалены, и останутся только их копии.
Команда UID используется в связке
с командами FETCH, COPY, STORE или SEARCH.
С ее помощью в этих командах можно
использовать реальные идентификационные
номера UID, вместо
последовательности чисел из диапазона
номеров сообщений. Идентификационный номер UID представляет
собой 32-битовое целое число, которое
однозначно идентифицирует сообщения в
почтовом ящике для системы электронной
почты. Как правило, эти функции выполняют
номера сообщений. Однако они не являются
постоянными и могут принимать различные
значения после поступления в ящик новых
сообщений или удаления старых. Поэтому
однозначно идентифицировать сообщения для
программ-клиентов IMAP между сеансами может
только идентификатор UID.
С помощью команды CAPABILITY
клиент может запрашивать у сервера IMAP
информацию о его возможностях. В листинге
7.14 представлен пример использования
команды CAPABILITY в
сеансе IMAP.
1 [riley@shadrach riley]$ telnet localhost 143 2 Trying 127.0.0.1... 3 Connected to local host. 4 Escape character is '^]'. 5 * OK localhost IMAP4revl v12.250 server ready 6 a1 login riley firetruck 7 a1 OK LOGIN completed 8 a2 capability 9 * CAPABILITY IMAP4 IMAP4REV1 NAMESPACE IDLE SCAN SORT MAILBOX-REFERRALS LOGIN-RE 10 FERRALS AUTH=LOGIN THREAD=ORDEREDSUBJECT 11 a2 OK CAPABILITY completed 12 a3 logout 13 * BYE shadrach.smallorg.org IMAP4rev1 server terminating connection 14 a3 OK LOGOUT completed 15 Connection closed by foreign host. 16 [riley@shadrach riley]$
Действия команды NOOP,
как мы знаем, соответствует ее названию, т.е.
она ничего не делает. Она может применяться
для поддержки активности во время сеанса
для того, чтобы сеанс не прекратился по
таймеру интервала ожидания. Ответ сервера
на команду NOOP
всегда должен быть положительным. Так как
сервер часто в ответе возвращает состояние
выполнения той или иной команды, то NOOP
вполне можно использовать как триггер для
периодического запроса о состоянии сервера.
Если что-то произошло с почтовым ящиком во
время периода ожидания, например сервер
удалил сообщения согласно правилам,
установленным для почтового ящика
администратором почтовой системы, то в
ответ на команду NOOP
будет возвращена обновленная информация о
его состоянии.
Команда LOGOUT
используется для завершения сеанса для
текущего идентификатора пользователя и
закрытия всех открытых почтовых ящиков.
Если какие-либо сообщения были помечены
флагом \DELETED, то с
помощью этой команды они будут физически
удалены из почтового ящика.
Для платформы Linux было написано несколько программных пакетов, реализующих функции и сервера и клиента IMAP. С ростом популярности IMAP4 следует ожидать очередного бума в разработке приложений для работы с IMAP в ОС Linux. В этом разделе мы коснемся наиболее популярных программных пакетов для Linux, которые реализуют функции сервера и клиента IMAP.
Программный пакет imapd
является одной из широко распространенных
реализаций сервера IMAP4, разработанной в
Вашингтонском университете. Он входит в
большинство дистрибутивов ОС Linux как
бинарный программный пакет. Если в вашей
версии Linux он отсутствует или вы желаете
получить его последнюю версию, то это можно
сделать с сервера FTP Вашингтонского
университета по адресу ftp://ftp.cac.washington.edu.
Последняя версия находится там под
названием imap.tar.Z.
Когда писалась эта книга текущей версией
была imap-4.6.BETA.
Программа imapd
вызывается по умолчанию процессом сервера
Internet inetd и слушает
TCP-порт с номером 143 на предмет установления
соединений. Для запуска imapd
посредством inetd
требуется строка конфигурации в файле /etc/inetd.conf
такого содержания:
imap stream tcp nowait root /usr/sbin/tcpd imapd
По умолчанию почтовым каталогом
для клиента IMAP является рабочий каталог
пользователя $HOME,
указанный в файле /etc/passwd.
Более детально об установке и
конфигурировании программного обеспечения
сервера IMAP поговорим в лекции 12, "Установка
и конфигурирование POP3 и IMAP".
Для получения пользователем
почты из нескольких почтовых ящиков по
протоколу IMAP можно сконфигурировать
соответствующим образом программу fetchmail.
Для установки базовых параметров можно
воспользоваться программой fetchmailconf.
С ее помощью можно указать сервер IMAP и
транспортный протокол для передачи почты (см.
лекцию 6, "Протокол POP3"). Для почтового ящика
по умолчанию программа fetchmailconf
создает файл конфигурации .fetchmailrc.
Как правило, это специальный почтовый ящик
с именем INBOX. Если
требуется проверять другие почтовые ящики,
которые были сконфигурированы на сервере
IMAP, можно задавать в fetchmail
опцию -r:
fetchmail -r mailbox
Здесь mailbox —
имя почтового ящика (или папки), который
будет проверяться вместо ящика INBOX.
Предупреждение
При использовании этой опции
следует быть очень осторожным, так как fetchmail
будет пересылать все
получаемые ею сообщения в обычный ящик на
локальном ПК. Таким образом, сообщения,
которые попадали в различные ящики, теперь
будут собираться в одном месте.
Большинством программ-клиентов сегодня предлагаются графические интерфейсы для работы с почтовыми ящиками в IMAP. Так, например, часть программного пакета Netscape Mail — программа Netscape Mail — имеет графический интерфейс и может быть сконфигурирована для работы с сервером IMAP. На рис. 7.1 показано основное окно для конфигурирования почтовой программы из пакета Netscape.
В разделе Входящие почтовые серверы (Incoming Mail Servers) можно задавать один или несколько почтовых серверов, у которых программа будет забирать почту. Новый сервер можно добавить, нажав на кнопку Добавить (Add). На рис. 7.2 показана операция по добавлению нового почтового сервера.
С помощью кнопки Тип сервера (Server Type) можно добавить либо сервер POP3, либо сервер IMAP. Если выбрать тип сервера IMAP, то в конфигурационном окне появятся две дополнительные метки. На рис. 7.3 показано окно с метками для конфигурирования IMAP.

(рис 7.2) Окно для конфигурации почтового сервера в программе Netscape Mail(рис 7.1) Окно для конфигурации новых почтовых серверов в программе Netscape Mail
(рис 7.3) Окно для конфигурации сервера IMAP в программе Netscape MailС помощью конфигурации IMAP
пользователь может выбирать тип
подключения к серверу IMAP. Можно, например,
задать подключение к серверу через
безопасное соединение с использованием
протокола security socket layer (SSL).
Так как в нашем случае эта возможность не
используется, то мы не будем на ней
останавливаться. Далее в конфигурации IMAP
следует указать, каким образом мы хотим
обслуживать удаленные сообщения. Нужно
принять решение, как поступать с
сообщениями, обозначенными как удаленные.
Это как раз и выбирается с помощью
предлагаемых опций. Помечая сообщения как
удаленные, мы снижаем общий сетевой трафик.
Это достигается благодаря сохранению
контрольных точек почтового ящика в
первоначальном виде до окончания работы с
ним, т.е. исключается ротация. Достаточно
рационально этот подход реализован в
продукте компании Netscape. В нем предусмотрена
папка , где
хранятся все сообщения помеченные как
удаленные. Ротация почтового ящика
происходит лишь при очистке этой папки.
Неплохо использовать в этом случае команду
после выхода из папки INBOX,
чтобы убедиться в том, что сообщения с
флагом \DELETED
действительно удалены. На рис. 7.4
показано окно Дополнительные опции IMAP (Advanced IMAP options).
(рис 7.4) Окно для конфигурации дополнительных опций IMAP в программе Netscape MailЗакладка дополнительных опций
дает пользователю возможность выбирать
каталог, к которому будет обращаться сервер
IMAP, в отличие от установленного по
умолчанию. Имеется также возможность
выбора папок, на которые подписан
пользователь. Помните, чем отличаются
команды LIST и LSUB?
По команде LIST
выводится полный список файлов и
подкаталогов в рабочем каталоге
пользователя $HOME.
Если опция выбора папок не помечена, то
программа Netscape Mail будет выполнять команду LIST
и отображать все содержимое рабочего
каталога пользователя как возможные
почтовые ящики или папки. Если же
пользователь в ОС Linux заведен лишь для
работы с электронной почтой, то это не
доставляет неудобств. В противном случае,
если учетная запись пользователя
используется не только для работы с почтой,
можно получить огромный
список файлов, большинство которых
никакого отношения к почте не имеют.
После установки желаемых параметров IMAP можно приступить к просмотру почтовых ящиков на почтовом сервере Linux с помощью графической оболочки, предлагаемой Netscape Mail. Сообщения можно читать, перемещать или удалять с помощью все того же графического интерфейса. Более детально ознакомиться с использованием Netscape Mail можно в лекции 15, "Конфигурирование клиентов ЛВС".
Протокол Internet Mail Access Protocol (IMAP) был
разработан для получения почты с удаленных
серверов. При этом сообщения физически
остаются на сервере. Такой метод получения
почты имеет свои преимущества, так как
почта пользователей хранится в одном месте
и не распределяется между несколькими ПК.
Протоколом IMAP предусмотрена возможность
использования нескольких почтовых ящиков
или папок, которые находятся на сервере.
Такой тип получения почты требует более
тщательного администрирования, так как все
почтовые сообщения и почтовые ящики
находятся на сервере. Однако если сервер
выходит из строя, разрывает соединение или
же его диски переполняются, то все
пользователи утрачивают возможность
получения почты. Администраторы систем
электронной почты с использованием IMAP
должны уделять достаточное внимание
различным деталям при функционировании
почтового сервера. В операционной системе
Linux функции сервера IMAP реализованы в
программе imapd. Для
получения почты с сервера в качестве
клиента IMAP может быть сконфигурирована
стандартная программа fetchmail.
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.