Команды IMAP в Linux
IMAP
Internet Mail Access Protocol (IMAP) в отличии от POP3 забирает все письма на локальный компьютер, а хранит их на сервере, поэтому у клиента есть возможность просматривать почту с различных ПК или мобильных устройств
Для обмена командами клиент устанавливает TCP соединение с сервером, который прослушивает порт 143, 465, 587
Каждая команда, выдаваемая клиентом, предваряется уникальным идентификатором, например для завершения сеанса связи клиент отправляет следующую команду:
a001 LOGOUT
Если бы клиенту потребовалось задавать и другие команды, то следующим идентификатором был бы a002
После идентификации на сервере клиент может использовать команды IMAP для управления сообщениями на сервере. Протоколом IMAP предусмотрена возможность поддержки пользователем нескольких почтовых ящиков на одном сервере.
Команда LOGIN позволяет клиенту при регистрации на сервере IMAP использовать логин и пароль в текстовом виде.
a001 LOGIN mmegatest@yandex.ru tedwqkmee
Команда AUTHENTICATE это альтернативный вариант авторизации на сервере с возможность указать метод проверки
a1 AUTHENTICATE KERBEROS_V4
Если на сервере не поддерживается метод проверки подлинности, предложенный клиентом, он ответит словом NO
После авторизации, клиент может манипулировать сообщениями на сервере. Сообщения не копируются на локальный компьютер, а копируются только для отображения
Почтовый ящик для клиента по умолчанию носит название INBOX
Каждому сообщению назначается уникальный идентификатор (UID), по которому они идентифицируются в почтовом ящике
Метка UID сохраняется в течение всех сеансов IMAP для того, чтобы клиентское программное обеспечение могло правильно идентифицировать сообщения в почтовом ящике
Каждому почтовому ящику соответствует уникальный идентификатор достоверности ( UIDVALIDITY )
Метка UIDVALIDITY должна присутствовать во время всех сеансов IMAP, только в том случае, если идентификаторы сообщений в ящике оставались неизменными
Если в почтовом ящике имеются сообщения с различными идентификаторами, то значение UIDVALIDITY при следующем сеансе должно увеличиться. Это позволяет клиентам быстро определять, появились ли в почтовом ящике новые сообщения с момента последнего к нему обращения.
Каждое сообщение снабжается флагом, который отображает его статус. Флаг может быть постоянным или задаваться на время сеанса. Постоянные флаги могут изменяться клиентом и сохраняться вне зависимости от сеансов. Флаги, назначаемые на время сеанса, действительны только на время текущего сеанса IMAP
Флаги почтового сообщения IMAP:
\Seen Сообщение прочитано
\Answered На сообщение послан ответ
\Flagged Сообщение принудительно отмечено
\Deleted Сообщение удалено
\Draft Сообщение не окончено (черновик)
\Recent Новое сообщение в почтовом ящике
Почтовому сообщению может соответствовать 0 флагов или несколько флагов. Информация о флагах передается клиенту вместе с самим сообщением. В обязанности клиента входит интерпретация флагов соответствующим образом.
Команда SELECT используется после авторизации, для выбора почтового ящика, например входящие ( INBOX )
a003 SELECT INBOX
a003 SELECT INBOX
* FLAGS (\Answered \Seen \Draft \Deleted $Forwarded)
* 5 EXISTS
* 5 RECENT
* OK [UNSEEN 1]
* OK [PERMANENTFLAGS (\Answered \Seen \Draft \Flagged \Deleted $Forwarded \*)] Limited
* OK [UIDNEXT 40] Ok
* OK [UIDVALIDITY 1669753653] Ok
a003 OK [READ-WRITE] SELECT Completed.
UIDNEXT 40 - это следующий доступный UID, который будет использоваться для данного почтового ящика
FLAGS (\Answered \Seen \Draft \Deleted $Forwarded) - это набор поддерживаемых флагов, в данном случае постоянных
PERMANENTFLAGS (\Answered \Seen \Draft \Flagged \Deleted $Forwarded \* - это набор поддерживаемых флагов, в данном случае действительных только на время сеанса
Клиент может изменять значение этих флагов для каждого сообщения
UNSEEN 1 - значит одно сообщение находится в ящике с флагом "не прочитано"
READ-WRITE - права пользователя для почтового ящика клиента
Команда EXAMINE читает содержимое почтового ящика
Пока почтовый ящик открыт, с помощью EXAMINE нельзя выполнять никакие действия. Таким образом, в этом режиме исключена возможность добавления или удаления флагов сообщений
Команда CREATE используется для создания нового почтового ящика на сервере IMAP
Команда DELETE применяется к почтовым ящикам, а не к сообщениям
В следующем примере создается пользовательская папка test на сервер imap.yandex.ru и тут же удаляется
a004 CREATE test
a004 OK CREATE Completed.
a005 DELETE test
a005 OK DELETE Completed.
С помощью команды RENAME клиент может изменить имя почтового ящика
Команда SUBSCRIBE используется для добавления почтового ящика в список активных ящиков клиента
Команда UNSUBSCRIBE используется для удаления активных ящиков клиента
Команда LIST используется для получения списка всех почтовых ящиков клиента
a007 list "" "*"
"" - каталог где находятся все ящики клиента ( корневой ), "*" - имя почтового ящика, в данном случае любое имя
a008 LSUB "" "*" работает подобно команде LIST но используется в других случаях, подробнее в здесь
Команда STATUS используется для формирования запроса о текущем состоянии почтового ящика
Первым параметром для этой команды является имя почтового ящика, к которому она применяется. Второй параметр — это список пунктов, по которым клиент может получить информацию (она заключается в круглые скобки () ). Команда STATUS может использоваться отдельно для получения информации о состоянии почтового ящика без его открытия с помощью команд SELECT или EXAMINE
Список критериев
MESSAGES Общее число сообщений в почтовом ящике
RECENT Число сообщений в ящике с флагом \RECENT (новые)
UIDNEXT Следующий доступный идентификатор UID, который будет назначен новому сообщению
UIDVALIDITY Уникальный идентификатор UID почтового ящика
UNSEEN Число сообщений в почтовом ящике без флага \SEEN
a009 STATUS INBOX (messages recent unseen)
* STATUS INBOX (MESSAGES 5 RECENT 5 UNSEEN 5)
a009 OK STATUS Completed.
С помощью команды APPEND появляется возможность посылать сообщения в почтовый ящик, добавляя сообщение к концу файла почтового ящика.
APPEND mailbox [(flags)] [date/time string] {message size} message
Весьма сомнительный способ, для этого есть SMTP
Команда CHECK используется для установки контрольной точки в почтовом ящике.
Команда EXPUNGE используется для удаления из почтового ящика всех сообщений, помеченных флагом \DELETED
a016 store 1 +flags \DELETED
* 1 FETCH (UID 35 FLAGS (\Deleted))
a016 OK store Completed.
a017 store 2 +flags \DELETED
* 2 FETCH (UID 36 FLAGS (\Deleted))
a017 OK store Completed.
a018 status INBOX (messages unseen)
* STATUS INBOX (MESSAGES 3 UNSEEN 3)
* 1 EXPUNGE
* 6 EXPUNGE
* 3 RECENT
a018 OK status Completed.
a019 EXPUNGE
a019 OK EXPUNGE Completed.
Команда SEARCH выполняет поиск сообщений по критериям и возвращет его номер
SEARCH [CHARSET specification] (search criteria)
Здесь CHARSET specification состоит из служебного слова CHARSET, за которым следует обозначение набора символов. Набор символов по умолчанию — ASCII, так что, как правило, этот параметр опускается. Параметр search criteria определяет ключевые критерии поиска и их значения. Критерии поиска здесь
a020 search header subject mmegatest
* SEARCH 1 2 3
a020 OK search Completed.
Команда FETCH используется для получения текста почтового сообщения.
FETCH
Здесь
Имена типов данных являются сложной спецификацией частей сообщения, которые могут возвращаться индивидуально. Существует три макроса возврата информации из сообщения: ALL, BODY и BODY [section]
ALL не означает, что сообщение будет возвращено целиком
Данные типа BODY также не означают, что возвращается именно тело сообщения, хотя при этом выделяется тип текстовой части сообщения и размер тела сообщения. При этом программа-клиент IMAP может предоставить пользователю более детальную информацию о сообщении на основе анализа этого типа данных
Макрос BODY [section] может применяться для возврата отдельных частей сообщения
FETCH 1 BODY [TEXT] <0.10>
a022 FETCH 2 BODY
* 2 FETCH (BODY ("text" "html" ("charset" "utf-8") NIL NIL "base64" 28632 368))
a022 OK FETCH Completed.
Команда STORE применяется для изменения информации о сообщении, подробнее здесь
Команда COPY используется для копирования сообщений из одного почтового ящика в другой
COPY
Здесь
Команда UID используется в связке с командами FETCH, COPY, STORE или SEARCH
Команда NOOP может применяться для поддержки активности во время сеанса для того, чтобы сеанс не прекратился по таймеру интервала ожидания
С помощью команды CAPABILITY клиент может запрашивать у сервера IMAP информацию о его возможностях
a023 CAPABILITY
* CAPABILITY IMAP4rev1 CHILDREN UNSELECT LITERAL+ NAMESPACE XLIST BINARY UIDPLUS ENABLE ID IDLE MOVE
a023 OK CAPABILITY Completed.
Подключение с помощью openssl
Далеко не все почтовые сервера позволяют использовать незащищенное соединение с клиентом, в таком случае можно использовать возможности программы openssl
После установления соединения с сервером используются стандартные команды imap
#Подключение к imap серверу yandex
openssl s_client -connect imap.yandex.ru:993 -crlf