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

Протокол IMAP

Команда FETCH

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

FETCH <message set> <data item names>

Здесь <message set> — диапазон номеров сообщений, которые требуется получить, а <data item names> соответствуют описанию данных каждого сообщения.

В качестве диапазона номеров сообщений может быть один номер, список номеров, разделенных запятыми, или диапазон номеров, который задается двоеточиями. Сервер 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]$
Листинг 7.13. Пример сеанса IMAP с применением команды FETCH

В строках 16 и 30 показаны примеры получения сведений о сообщении с помощью команды FETCH. Так, в строке 16 запрашиваются поля заголовка Date, From и Subject для сообщений 3–5. В строках 17–35 показан ответ сервера IMAP на эту команду с соответствующей информацией о запрошенных сообщениях. В строке 36 запрашивается текст из тела сообщения номер 4. Соответственно, строки 37–40 являются ответом сервера IMAP на этот запрос, где отражается тело сообщения.

По умолчанию данные типа BODY [SECTION] изменяют сообщение, устанавливая для него флаг \SEEN. Если же нужно просмотреть часть сообщения без установления флага, то данные типа BODY [SECTION] можно заменить на BODY.PEEK [SECTION]. С помощью этого типа данных выполняется та же самая операция, что и в BODY [SECTION], но при этом не устанавливается флаг \SEEN для сообщения.

Команда STORE

Команда STORE применяется для изменения информации о сообщении. Формат команды следующий:

STORE <message set> <data item name> <data item value>

Аргумент <message set> задает диапазон номеров сообщений, к которым применяется команда STORE. В настоящее время для этой команды определено только два типа данных ( <data item name> ). Тип FLAGS определяет набор флагов, установленных для сообщения. Тип FLAGS.SILENT также определяет набор флагов, установленных для сообщения, но при этом сервер IMAP не возвращает их новое значение в своем ответе.

Поведением этих типов данных можно управлять, задав перед ними знак плюс ( + ) или минус ( - ). Знак плюс означает, что значение типа данных ( <data item value> ) будет добавлено к сообщению, минус — что оно будет удалено из сообщения.

Установка флагов в сообщении с применением команды STORE довольно хорошо продемонстрирована в листинге 7.11. В строке 18 этого листинга показано, как устанавливается флаг \DELETED для сообщения в активном почтовом ящике с номером 1. Обратите внимание, что перед флагом задан знак плюс ( + ). Можно было бы также задать флаг ( - ). Тогда флаг \DELETED был бы отменен для сообщения (один из способов восстановить удаленное сообщение до того, как вступят в силу контрольные точки сообщения). И помните: сообщение, помеченное флагом \DELETED, не удаляется физически из почтового ящика до выполнения команд по назначению новых контрольных точек для почтового ящика. А это делается с помощью команд CHECK, EXPUNGE, SELECT или LOGOUT.