IMAP vs POP3

Константин Третьяков (kt_ee@hotmail.com)

Цель данной статьи: дать по возможности полное представление о протоколах POP3 и IMAP. Несмотря на то, что статья рассчитана на читателя, имеющего некое представление о том, как работает Интернет, основные идеи будут понятны и менее сведущему читателю.

Введение

Датой рождения электронной почты принято считать 1971 год, когда специалисту по компьютерам Рэю Томлинсону удалось послать короткое сообщение с одного компьютера в своей лаборатории на другой. Уже в следующем году появилась первая программа для отсылки и получения электронной почты и вскоре электронная переписка завоевала огромную популярность. Сегодня e-mail является неотъемлемой частью "контактных данных" сотен миллионов людей.

По принципу действия, электронная почта очень напоминает обычную. Что происходит, когда я посылаю другу Васе письмо по почте? Я кидаю письмо в ящик, откуда его достаёт почтальон и делает всё от него зависящее, чтобы это письмо рано или поздно попало в почтовый ящик Васи. Одним ярким ранним утром Вася заглянет в свой почтовый ящик, найдёт там моё письмо и очень обрадуется. Если же я посылаю другу электронное письмо, то я должен "положить" его в Васин "электронный почтовый ящик", откуда это письмо сможет потом (ярким ранним утром) достать Вася. А что такое "электронный почтовый ящик" и как в него можно чего-либо "положить", спросите вы. Попробую объяснить. Роль "ящика" выполняет какой-либо компьютер, который подсоединён к Интернету. Этот компьютер (он называется умным словосочетанием "почтовый сервер") постоянно включён и всегда готов принять письмо для Васи. Для того, чтобы "положить" туда письмо, я должен подсоединится к Интернету, и сказать этому компьютеру что-то вроде "эй, у меня тут для Васи записка, положи её к нему в ящик, ладно?". Потом (ярким ранним утром) Вася подсоединится к Интернету и спросит у своего почтового сервера "привет, я Вася, мне никто не писал?", и сервер передаст ему моё письмо. Обычно на одном почтовом сервере хранятся "ящики" многих людей. Адрес каждого ящика состоит из двух частей разделённых символом @ (эт, собака, кракозябла). Слева пишется "имя" ящика (которое часто совпадает с именем человека) а справа - "имя" почтового сервера. Например, адрес vasya@microsoft.com означает, что письма кладутся в ящик vasya на компьютере microsoft.com.1

Так как компьютеры - существа невероятно глупые, и говорить ни на одном человеческом языке не умеют, то научить компьютер понимать фразы вроде "передай Васе, что он лопух" к сожалению ещё никому не удалось (хотя процесс идёт). Зато совсем несложно научить компьютер понимать определённые команды и правильно реагировать на них. Свой набор команд есть и у почтовых серверов. Так, если я хочу послать Васе письмо, я должен буду передать его серверу приблизительно такую последовательность команд:

HELO kt.ee
MAIL FROM:<kt@kt.ee>
RCPT TO:<vasya@microsoft.com>
DATA
From: Konstantin Tretyakov <kt@kt.ee>
Subject: Privet Vasya!!!

Vasya, ty lopuh!
.
QUIT

Набор команд, которые распознаёт компьютер, и то, что он может сказать в ответ на них (другими словами, "язык" компьютера) называется "протокол". Выше был приведен пример "общения" с почтовым сервером2 с помощью протокола SMTP (Simple Mail Transfer Protocol), который и используется для передачи на сервер сообщений электронной почты. Набор возможных команд SMTP очень ограничен и кроме посылки писем этот протокол почти ни для чего использоваться не может. Для получения почты с сервера Вася будет использовать уже другой протокол, придуманный специально для этой цели.

В то время как для отправки электронных сообщений почти везде используется только SMTP, то для получения их с сервера можно обычно использовать по крайней мере два разных протокола - IMAP и POP3. Конечно не все серверы поддерживают (т.е. понимают) оба эти протокола, но наиболее продвинутые (типа mailhost.ut.ee) понимать должны. Более подробное описание этих протоколов и последует ниже. Те, кто не желает углубляться в такого рода тонкости, могут с чистой совестью прервать чтение этой статьи прямо здесь.

POP3 (Post Office Protocol - Version 3)

Post Office Protocol означает по-английски "почтовый протокол" и используется для "скачивания" с почтового сервера сообщений электронной почты к себе на компьютер. Последняя версия этого протокола - 3, что подразумевает наличие первой и второй версий. Протокол POP2 был стандартом в середине 80-х и лет так через десять ему на смену пришел POP3, которым пользуются и до сих пор.

Для того, чтобы "поближе познакомиться" с любым протоколом, нет лучше способа, чем попробовать "поговорить на нём" самому. Этим мы сейчас и займёмся. Для начала вам нужно найти какой-либо почтовый сервер, который понимал бы POP3, и на котором у вас есть свой почтовый ящик. Большинство почтовых серверов сейчас поддерживают POP3 так что скорее всего вам не придётся долго искать. Я буду использовать для примера mail.hot.ee.
Далее, необходимо научиться пользоваться программой telnet. На это, я думаю, у вас не должно уйти больше минуты. Всё, что вы должны знать о telnet заключается в том, что для того, чтобы подключиться, например, к компьютеру www.microsoft.com на 80 порт, вы должны набрать в командной строке

telnet www.microsoft.com 80
(Если вы используете программу telnet для Windows 95/98/..., то удостоверьтесь, что в меню Terminal | Preferences установлена галочка около "Local Echo". Иначе вы просто не сможете видеть то, что посылаете на сервер.)
Итак, набрали? И ничего не происходит? Неправда, происходит. Теперь вы подсоединились к компьютеру www.microsoft.com на 80 порт и можете посылать и принимать от него данные. А ну-ка попробуйте набрать
GET / HTTP/1.0
после чего нажмите ENTER два раза. В ответ сервер выдаст вам много текста и прервёт соединение. Для тех, кто не понял, что же произошло, поясняю: только что вы проделали (в очень упрощённом виде) то, что делает ваш Интернет-браузер кадый раз, когда вы пробуете зайти на www.microsoft.com (вы туда ведь часто заходите, правда), а именно, запросили через протокол HTTP (HyperText Transfer Protocol) web-страницу www.microsoft.com/. То, что вы подсоединялись именно на порт 80 связано как раз с тем, что вам необходимо было использовать этот протокол.
Теперь-то вы уж точно поняли что к чему, и можно перейти к ознакомлению с POP3.

Итак, вы нашли себе POP3-сервер для беседы. Давайте попробуем с ним поговорить. Для этого подсоединяемся к нему на порт 110 (стандартный порт для протокола POP3):

telnet mail.hot.ee 110

(вместо mail.hot.ee вы конечно же напишете имя выбранного вами сервера).
В ответ вы должны получить что-то вроде

+OK POP3 Ready relay2.hot.ee

(здесь и далее ответы, получемые от сервера будут зелёного цвета, тогда как то, что вы должны послать туда - синего).
Итак, ваш сервер любезно поприветствовал вас, сообщив, что у него всё в порядке. Если он сказал что-либо другое, значит либо он не рад вас видеть, либо это не POP3 сервер. В любом случае тогда вам придётся найти другого подопытного.
Как вы далее увидите, все ответы сервера будут начинаться либо с +OK либо с -ERR что означает удачное или неудачное выполнение команды соответственно. Теперь вы должны идентифицировать себя, т.е. предоставить ваше имя пользователя и пароль, что делается с помощью команд USER и PASS. Сразу предупреждаю, что когда вы будете набирать пароль, он не будет спрятян за "звёздочками", как это обычно делается, так что любой желающий сможет взглянуть на ваш экран и прочитать его. Будьте осторожны.

USER kt
+OK USER kt set
PASS mysecretpassword
+OK You are so in

Как видите, сервер узнал меня. Теперь я могу проверить сколько мне пришло новых сообщений. Для этого существует команда STAT:

STAT
+OK 3 2199

В ответ сервер сообщил, что в моём почтовом ящике 3 сообщения, причём их суммарный размер 2199 байт. Конкретный размер каждого сообщения можно узнать с помощью команды LIST:

LIST
+OK scan listing follows
1 683
2 717
3 799
.

Это означает, что размер первого сообщения - 683 байта, второго - 717 а третьего - 799 байт. Если дать команде LIST в качестве аргумента номер сообщения, то сервер покажет размер только этого сообщения (или сообщит об ошибке, если его нет).

LIST 2
+OK 2 717
LIST 5
-ERR No such message

Теперь попробуем посмотреть какое-нибудь сообщение. Набираем RETR [номер сообщения]:

RETR 1
+OK Message follows
X-Sieve: cmu-sieve 2.0
Return-Path: <vasya@microsoft.com>
Received: from relay3.hot.ee (relay3 [194.126.124.121])
        by mailhost4.hot.ee (8.12.2/8.12.1) with ESMTP id g3HEKvFa014909
        for <kt@mailhost4>; Wed, 17 Apr 2002 17:20:57 +0300
Received: from ut.ee (math.ut.ee [193.40.8.130])
        by relay3.hot.ee (8.12.1/8.12.1) with SMTP id g3HEIWIo031017
        for <kt@h0t.ee>; Wed, 17 Apr 2002 17:19:10 +0300
Date: Wed, 17 Apr 2002 17:18:32 +0300
Message-Id: <200204171419.g3HEIWIo031017@relay3.hot.ee>
From: "Vasya Pupkin" <vasya@microsoft.com>
To: "Konstantin Tretyakov" <kt@h0t.ee>
Subject: Re: Privet Vasya!!!
X-Virus-Scanned: by mail.hot.ee (http://www.hot.ee/)

Sam ty lopuh!
.

После строчки "+OK Message follows" сервер выдал мне всё сообщение. Здесь стоит сделать небольшое отступление про то, как "по настоящему" выглядят сообщения электронной почты. Каждое сообщение имеет 2 части, которые разделены пустой строкой. Первая часть - заголовок (здесь он начинается с символов X-Sieve: ...). Заголовок состоит из полей, которые содержат всякую полезную информацию (вроде From:, To:, Subject: и др.). Вторая часть - сам текст письма - начинается после пустой строки и заканчивается строкой, содержащей только точку. Как видим, это письмо обиженного Васи.
Иногда есть смысл не скачивать всё сообщение сразу, а сначала посмотреть на заголовок и несколько первых строк текста сообщения. Если обнаружится, что это spam или ещё какая гадость, можно будет стереть письмо, не смотря его полностью. Для этого набираем TOP [номер сообщения] [количество строк текста сообщения]:

TOP 2 0
+OK Message follows
X-Sieve: cmu-sieve 2.0
Return-Path: <john@smith.com>
Received: from relay3.hot.ee (relay3 [194.126.124.121])
        by mailhost4.hot.ee (8.12.2/8.12.1) with ESMTP id g3HETfFa020463
        for <kt@mailhost4>; Wed, 17 Apr 2002 17:29:41 +0300
Received: from smith.com (noorus.aklubi.ee [193.40.14.124])
        by relay3.hot.ee (8.12.1/8.12.1) with SMTP id g3HETfIo008909
        for <kt@h0t.ee>; Wed, 17 Apr 2002 17:29:41 +0300
Message-Id: <200204171429.g3HETfIo008909@relay3.hot.ee>
Date: Wed, 17 prM 2002 17:32:31 GMT
From: John Smith<john@smith.com>
To: Konstantin Tretyakov<kt@h0t.ee>
Subject: Hi
X-Virus-Scanned: by mail.hot.ee (http://www.hot.ee/)

.

В ответ на запрос TOP 2 0 сервер выдал только заголовок второго сообщения. Видно, что это письмо от какого-то Джона Смита. Давайте его сотрём:

DELE 2
+OK message deleted
LIST
+OK scan listing follows
1 683
3 799
.

Ну вот, теперь мы не сможем прочесть, что написал Джон Смит. На самом деле его письмо ещё не стёрто. Оно совсем исчезнет только после того, как мы дадим команду QUIT. Если такой команды дано не будет (например, соединение прервется по техническим причинам), то подсоединившись к серверу снова, мы опять увидим все 3 сообщения. Можно восстановить письмо и не прерывая соединения с помощью команды RSET:

RSET
+OK
LIST
+OK scan listing follows
1 683
2 717
3 799
.

Команда RSET восстанавливает все удалённые в течение данной сессии письма. Команда QUIT заканчивает сессию, и сервер закрывает соединение. После этой команды все стёртые (и не восстановленные) сообщения будут по-настоящему удалены.

QUIT
+OK

Вот и всё. Как видите, протокол POP3 довольно примитивен. В то же время он отлично подходит для различных бесплатных почтовых серверов (вроде hot.ee, mail.ru и др.), так как очень прост, не позволяет никакой излишней "вольности", и доступ пользователя к сообщениям осуществляется за короткое время ("скачал и ушёл"). Это важно в случае, когда на сервере очень много почтовых ящиков.
Обычно при использовании POP3 подразумевается, что вы каждый раз скачиваете все сообщения к себе на компьютер и удаляете их с сервера. Однако, если вы часто читаете свою электронную почту с разных компьютеров, то вам придётся хранить все сообщения на сервере (иначе ваши письма окажутся разбросанными по всем этим компьютерам и вы не сможете на одном из них перечитать письмо, которое скачали, когда были на другом - оно будет уже стёрто с сервера). А это не очень удобно, так как протокол POP3 не предоставляет никаких средств для работы с файлами (вы не сможете, например, сделать прямо на сервере новый каталог и переместить туда наиболее интересные сообщения). Именно в таких случаях выручает гораздо более продвинутый почтовый протокол IMAP.

IMAP (Internet Message Access Protocol)

IMAP - очень продвинутый и совсем не похожий на POP3 протокол передачи почты. Придуман он был в 1986 году в Стэнфорде и назывался тогда Interactive Mail Access Protocol. Такой популярности, как POP этот протокол сразу не завоевал, но в последнее время им пользуются всё чаще. Последняя версия - IMAP4rev1 появилась только в 1997 году. Официальным стандартом IMAP4 (в отличие от POP3) пока (18.4.02) не считается.

В то время как POP3 рассчитан на offline-доступ к почте (т.е. вы подсоединяетесь к серверу, скачиваете новые сообщения и отсоединяетесь), то IMAP сделан для online-доступа. Ваши сообщения хранятся на сервере и доступны вам с любого компьютера. С помощью протокола IMAP вы можете создавать и удалять на сервере каталоги, переносить сообщения из одного каталога в другой и добавлять новые сообщения (например, незаконченные письма обычно кладут в каталог Drafts). Соединение с IMAP-сервером не прерывается сразу после проверки новых сообщений. Наоборот, вы можете оставаться на связи сколько вам угодно. Это позволяет очень просто проверять не пришло ли вам новых сообщений.

Так как набор возможностей протокола IMAP довольно велик, то я вкратце приведу лишь самые простые примеры использования основных команд. Итак, подсоединяемся к IMAP-серверу на порт 143:

telnet mailhost.ut.ee 143
* OK [CAPABILITY IMAP4REV1 LOGIN-REFERRALS STARTTLS AUTH=LOGIN] madli.ut.ee IMAP
4rev1 2001.315 at Thu, 18 Apr 2002 01:42:06 +0300 (EEST)

и идентифицируем себя с помощью команды LOGIN [имя] [пароль]

a001 LOGIN kt mysecretpassword
* OK
a001 OK [CAPABILITY IMAP4REV1 IDLE NAMESPACE MAILBOX-REFERRALS SCAN SORT THREAD=
REFERENCES THREAD=ORDEREDSUBJECT MULTIAPPEND] User kt authenticated 

Как вы заметили, перед словом LOGIN я написал какое-то a001. Это так называемая метка. Метка должна стоять перед каждой командой и абсолютно всё равно что вы напишете в качестве метки - "a001" "1234" или "qwerty", главное, чтобы она состояла из латинских букв и цифр. В ответ на команду LOGIN сервер выдал две строчки (вторая строчка здесь для удобства разделена на две) - одна из них начинается со звёздочки, а вторая, с a001, т.е. с той же метки, которой была помечена сама команда. Вообще, в ответ на любую команду сервер всегда рано или поздно выдаст строчку, которая начинается с той же метки. Эта строчка показыает, что выполнение команды закончено, а слово, следующее непосредственно за меткой - OK, NO или BAD - говорит, что команда выполнена удачно, неудачно, или не была распознана сервером соответственно. Помечать каждую команду необходимо потому, что прокол IMAP (в отличие от POP3) позволяет посылать серверу несколько команд сразу, не дожидаясь ответа на каждую из них. Ответы сервер выдаст потом вперемешку и только по метке можно будет определить какой ответ к какой команде относится. Строчки, начинающиеся со звёздочки, дают дополнительную информацию о результате выполнения команды.

Теперь рассмотрим работу с каталогами (или по-другому, папками). Команда LIST [подкаталог] [шаблон] возвращает список каталогов в указанном подкаталоге (чтобы получить список всех каталогов, надо указать в качестве подкаталога "", т.е. пустую строку). Для того, чтобы создать, переименовать или удалить каталог используются команды CREATE, RENAME и DELETE.

a002 LIST "Mail/" *
* LIST (\NoSelect) "/" Mail/
* LIST (\NoInferiors \Marked) "/" Mail/sent-mail
* LIST (\NoInferiors \UnMarked) "/" Mail/saved-messages
a002 OK LIST complete
a003 CREATE Mail/new
a003 OK CREATE completed
a004 LIST "Mail/" *
* LIST (\NoSelect) "/" Mail/
* LIST (\NoInferiors \Marked) "/" Mail/sent-mail
* LIST (\NoInferiors \UnMarked) "/" Mail/saved-messages
* LIST (\NoInferiors \UnMarked) "/" Mail/new
a004 OK LIST completed
a005 RENAME Mail/new Mail/newmail
a005 OK RENAME completed
a006 LIST Mail/ *
* LIST (\NoSelect) "/" Mail/
* LIST (\NoInferiors \Marked) "/" Mail/sent-mail
* LIST (\NoInferiors \UnMarked) "/" Mail/saved-messages
* LIST (\NoInferiors \Marked) "/" Mail/newmail
a006 OK LIST completed
a007 DELETE Mail/newmail
a007 OK DELETE completed
a008 LIST Mail/ *
* LIST (\NoSelect) "/" Mail/
* LIST (\NoInferiors \Marked) "/" Mail/sent-mail
* LIST (\NoInferiors \UnMarked) "/" Mail/saved-messages
a008 OK LIST complete

Каталог INBOX играет специальную роль - туда приходит вся почта. Его переименовать нельзя. Вместо этого команда RENAME INBOX [имя другой папки] просто перенесёт все сообщения из INBOX в указанную папку. Для того, чтобы посмотреть почту, нужно сначала "открыть" папку INBOX с помощью команды SELECT INBOX:

a009 SELECT INBOX
* 27 EXISTS
* 0 RECENT
* OK [UIDVALIDITY 1013764851] UID validity status
* OK [UIDNEXT 693] Predicted next UID
* FLAGS (\Answered \Flagged \Deleted \Draft \Seen)
* OK [PERMANENTFLAGS (\* \Answered \Flagged \Deleted \Draft \Seen)] Permanent flags
* OK [UNSEEN 23] first unseen message in /home/kt/mbox
a009 OK [READ-WRITE] SELECT completed

Из ответа сервера мы узнаём, что в почтовом ящике всего 27 сообщений, из которых 0 новых. Теперь, когда INBOX "открыт", мы можем проверять его на наличие новых сообщений командой NOOP. Если новых сообщений нет - NOOP ничего не делает (NOOP = No Operation), если же с момента прошлой проверки пришли новые письма, сервер даст нам знать об этом.

a010 NOOP 
a010 OK NOOP completed
a011 NOOP
a011 OK NOOP completed
a012 NOOP
* 28 EXISTS
* 1 RECENT
a012 OK NOOP completed

В ответ на третий NOOP сервер вдруг сообщил, что появилось новое сообщение. Давайте его посмотрим. Для этого сначала используем команду SEARCH RECENT что бы узнать номер этого сообщения, а затем - FETCH [номер] BODY[] (или FETCH [номер] RFC822) чтобы прочитать текст.

a013 SEARCH RECENT 
* SEARCH 28
a013 OK SEARCH completed
a014 FETCH 28 BODY[] 
* 28 FETCH (BODY[] {614}
Return-Path: <kt@-t.ee>
Received: from madli.ut.ee (root@madli.ut.ee [3ffe:200:25:500:a00:20ff:fe83:b3ae
])
        by math.ut.ee (8.10.1/8.10.1/math-1.9) with ESMTP id g3IDo9D20585
        for <kt@math.-t.ee>; Thu, 18 Apr 2002 16:50:10 +0300 (EEST)
Received: from ut.ee (noorus.aklubi.ee [193.40.14.124])
        by madli.ut.ee (8.12.1/8.12.1/madli-1.15) with SMTP id g3IDmXT3005398
        for <kt@-t.ee>; Thu, 18 Apr 2002 16:49:38 +0300 (EEST)
Date: Thu, 18 Apr 2002 16:48:33 +0300 (EEST)
Message-Id: <200204181349.g3IDmXT3005398@madli.ut.ee>
From: Me@ut.ee
To: You@madli.ut.ee
Subject: New message!

This is a new message!!!
)
* 28 FETCH (FLAGS (\Recent \Seen))
a014 OK FETCH completed

Какое-то глупое письмо, не правда ли? (на самом деле я его сам себе только что послал) Надо бы его удалить. Для этого необходимо сначала пометить письмо как "удалённое" (как говорят англичане, поставить на него флаг \Deleted), после чего можно будет стереть его с помощью команды EXPUNGE или CLOSE.

a015 STORE 28 +FLAGS (\Deleted)
* 28 FETCH (FLAGS (\Recent \Deleted))
a015 OK STORE completed
a016 EXPUNGE
* 28 EXPUNGE
* 27 EXISTS
* 0 RECENT
a016 OK Expunged 1 messages
Теперь в ящике осталось 27 сообщений. Их порядковые номера можно получить так:
a017 SEARCH ALL
* SEARCH 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
a017 OK SEARCH completed
Интересно, сколько из них пришло от меня самого?
a018 SEARCH FROM "Konstantin Tretjakov"
* SEARCH 10 20
a018 OK SEARCH completed
С помощью команды SEARCH можно, к примеру, попросить сервер найти все письма, посланные мне людьми, у которых E-mail заканчивается на "@math.ut.ee", содержащие в теме письма сочетание "Re:" и в тексте сообщения - строку "4MB":
a019 SEARCH FROM @math.ut.ee SUBJECT "Re:" BODY "4MB"
* SEARCH 7
a019 OK SEARCH completed
Одно такое сообщение есть. Это сообщение номер 7.
А теперь наверное подошло время закончить заниматься всякими глупостями с сервером, у которого и без нас дел немало. Давайте попрощаемся с ним:
a020 LOGOUT
* BYE madli.ut.ee IMAP4rev1 server terminating connection
a020 OK LOGOUT completed

Видели, как он обрадовался! Прямо так и закричал: "BYE". А вы, надеюсь, получили неплохое представление о том, что же такое Internet Message Access Protocol, и с чем его едят. Конечно, были приведены примеры использования лишь нескольких основных команд, и если вас интересует более подробное описание, то вам следует обратиться к RFC 2060, ссылку на который вы найдёте ниже.

Насколько вы помните (если ещё помните), статья называлась IMAP vs POP3, что можно перевести на русский примерно как "Кто лучше - IMAP или POP3?". Так вот, этого я вам не скажу. Решайте сами.

Спасибо за внимание.

Полезные Ссылки




Примечания:
1 На самом деле это не всегда так. Например, мой адрес - kt@kt.ee, но мой почтовый сервер - mailhost.kt.ee. Зная вторую часть адреса, можно всегда определить имя почтового сервера используя DNS. Но это уже другая тема...
2 Ответы сервера на посылаемые команды были опущены.

Copyright © Константин Третьяков.
18 апреля 2002 г