IMAP и POP Gmail через telnet или читать почту это просто

В этом нет ничего сложного — правда! Фактически — написать свой почтовик — проще простого. Так же просто как и читать почту через консоль.

Далее — две маленькие статьи на живых примерах — как пользоваться POP3 и IMAP без почтового клиента.

Читаем POP3

Вам потребуется Linux. Ну или поддержка OpenSSL в Windows — если она у вас есть — то, вероятно, статья не для вас — вы и так всё знаете :)

Далее — набор команд с расшифровкой:

openssl s_client -crlf -connect pop.gmail.com:995

Мы коннектимся на гмейл с использованием SSL. Параметр -crlf гарантирует что нам не придётся испытывать проблем с переносом строк и наши команды будут распознаны так, как надо.
Параметр -ign_eof обещает нам, что команды, начинающиеся с буквы R будут корректно восприняты s_client и не вызовут разрыва SSL.

В случае успешного соединения мы видим что-то типа следующего:

CONNECTED (00000003)
...куча букв и цифр, свидетельствующих о SSL...
+OK Gpop ready for requests from 79.165.189.32 3pf3718132bwz.16

Это значит что на первом этапе всё прошло отлично и мы присоединились к почтовику Гугла.
Далее нам следует авторизоваться.

USER логин БЕЗ @gmail.com

В случае успешного прохождения команды мы видим строчку:

+OK send PASS

Нас просят ввести пароль. Что мы и сделаем:

PASS ваш_пароль

В случае если пароль верен — нас пускают внутрь!

+OK Welcome.

Вот мы и внутри нашего почтового ящика.
Давайте проверим — пришли ли нам новые сообщения?

STAT

Я увидел следующее:

+OK 15 1408449

Это значит, что на сервере у меня 15 непрочитанных писем общим размером 1 408 449 байт.

Интересно — а сколько весит каждое непрочитанное письмо?

LIST

Вот и список сообщений:

+OK 15 messages (1408449 bytes)
1 3423
2 42610
3 3693
4 3693
5 445122
6 1933
7 3488
8 3760
9 3155
10 439325
11 9071
12 3125
13 3575
14 3997
15 438479

Видите — пока ничего сложного :)

Давайте прочитаем пятое сообщение — что-то в нём много байт — наверное, интересное письмо!

Для чтения письма доступна команда TOP

TOP 5 0

Этой командой мы запросили пятое письмо без его текста — получить только заголовки. В заголовках, помимо всего прочего, отбражается кому пришло это письмо, от кого и какая у письма тема.

...
From: root
To: master@skazkin.ru
Subject: Cron perl /home/common/parser.pl queue
...

Мне пришёл отчёт с моего сервера — что парсер закончил строить очередь. Хорошо, читать мне это не очень интересно — там разная служебная информация.
Пометим его для удаления

DELE 5

Гмейл понял нас —

+OK marked for deletion

Гмейл удалит отмеченные для удаления письма после выхода из системы.

Прочитаем самое маленькое письмо —

TOP 6 0

Subject: =?KOI8-R?B?0NLJ18XU?=
From: =?KOI8-R?B?4c7Uz84g58HCz9c=?= <друг@gmail.com>
To: Andrew Skazkin <мне@gmail.com>
Content-Type: text/plain; charset=ISO-8859-1

Ого — не читается :(
Это уже решается почтовыми клиентами — тема письма — в кодировке KOI8-R и зашифрована BASE64.

Чтож, почта прочитана и пора выходить.

Я так подумал — не буду я удалять письмо от Cron.

RSET

Эта команда сбрасывает флажки на удаление у писем, которые мы отметили для удаления.

+OK

Такой ответ — в случае успеха. Теперь можно выйти.

QUIT

Ответом нам —

+OK Farewell.
read:errno=0

Вот и всё. С POP3 мы разобрались, не так ли? Пришла пора для IMAP.

Играемся с IMAP

Процедура мало чем отличается — только лишь командами.

openssl s_client -crlf -ign_eof -connect imap.gmail.com:993

Опять выдала нам кучу букв и цифр, и последняя строчка —

+OK Gpop ready for requests from 79.165.189.32 1pf4035116fxm.33

Входим в аккаунт:

. login я@gmail.com мойпароль

Успешно!

* CAPABILITY IMAP4rev1 UNSELECT LITERAL+ IDLE NAMESPACE QUOTA ID XLIST CHILDREN X-GM-EXT-1 UIDPLUS COMPRESS=DEFLATE
. OK я@gmail.com authenticated (Success)

Обратите внимание — все команды предваряются точкой и пробелом!

Получим список наших папок в аккаунте:

. list "" «*»

Нам вываливается список папок:

* LIST (\HasNoChildren) «/» «Cron»
* LIST (\HasNoChildren) «/» «INBOX»
* LIST (\HasNoChildren) «/» «LJ»
* LIST (\HasNoChildren) «/» «Proxies»
* LIST (\HasNoChildren) «/» «WordPress»
* LIST (\Noselect \HasChildren) «/» [Gmail]""
* LIST (\HasNoChildren) «/» [Gmail]«/&BBIEQQRP- &BD8EPgRHBEIEMA-»
* LIST (\HasNoChildren) «/» [Gmail]«/&BBoEPgRABDcEOAQ9BDA-»
* LIST (\HasNoChildren) «/» [Gmail]«/&BB4EQgQ,BEAEMAQyBDsENQQ9BD0ESwQ1-»
* LIST (\HasNoChildren) «/» [Gmail]«/&BB8EPgQ8BDUERwQ1BD0EPQRLBDU-»
* LIST (\HasNoChildren) «/» [Gmail]«/&BCEEPwQwBDw-»
* LIST (\HasNoChildren) «/» [Gmail]«/&BCcENQRABD0EPgQyBDgEOgQ4-»
. OK Success

То, что с непонятными символами — папки, названные по-русски.

Сколько у нас писем в папке INBOX?

. status INBOX (messages)

Ответ —

* STATUS «INBOX» (MESSAGES 8)
. OK Success

Ого! Есть новая почта! Почитаем её:

. select inbox

Выборка успешна:

* FLAGS (\Answered \Flagged \Draft \Deleted \Seen)
* OK [PERMANENTFLAGS (\Answered \Flagged \Draft \Deleted \Seen \*)]
* OK [UIDVALIDITY 2]
* 8 EXISTS
* 0 RECENT
* OK [UIDNEXT 68967]
. OK [READ-WRITE] inbox selected. (Success)

Посмотрим — что из восьми писем ещё не прочитано:

. fetch 1:* flags

Эта команда выбирает флаги для всех писем, начиная с первого.

* 1 FETCH (FLAGS (\Seen))
* 2 FETCH (FLAGS (\Seen))
* 3 FETCH (FLAGS (\Seen))
* 4 FETCH (FLAGS (\Seen))
* 5 FETCH (FLAGS (\Seen))
* 6 FETCH (FLAGS ())
* 7 FETCH (FLAGS ())
* 8 FETCH (FLAGS ())
. OK Success

Прочитаем седьмое письмо — его заголовки

. fetch 7 full

* 7 FETCH (ENVELOPE («Fri, 20 Nov 2009 09:58:35 +0000» «=?KOI8-R?B?79TXxdTJ1NggzsEg08/Pwt3FzsnFICfSwcLP1MXOy8EgzsEgMSDCwcvTJw==?=» ((«=?KOI8-R?B?5s/S1c0gzyDQz8nTy8/X2cgg08nT1MXNwcg=?=» NIL «root» «searchengines.ru»)) ((«=?KOI8-R?B?5s/S1c0gzyDQz8nTy8/X2cgg08nT1MXNwcg=?=» NIL «root» «searchengines.ru»)) ((«=?KOI8-R?B?5s/S1c0gzyDQz8nTy8/X2cgg08nT1MXNwcg=?=» NIL «root» «searchengines.ru»)) ((NIL NIL «master» «skazkin.ru»)) NIL NIL NIL <200911200935.b8f41f512510@forum.searchengines.ru>"") FLAGS () INTERNALDATE «20-Nov-2009 09:58:38 +0000» RFC822.SIZE 4045)
. OK Success

В целом конечно понятно — но хотелось бы ещё понятнее

. fetch 7 (body[header.fields (from to subject date)])

Выбираем только интересные заголовки:

* 7 FETCH (BODY[HEADER.FIELDS (from to subject date)] {334}
Date: Fri, 20 Nov 2009 09:58:35 +0000
To: master@skazkin.ru
From: =?windows-1251?q?=D4=EE=F0=F3=EC_=EE_=EF=EE=E8=F1=EA=EE=E2=FB=F5_=F1=E8=F1=F2=E5=EC=E0=F5?=

Subject: =?windows-1251?q?=CE=F2=E2=E5=F2=E8=F2=FC_=ED=E0_=F1=EE=EE=E1=F9=E5=ED=E8=E5_=27=F0=E0=E1=EE=F2=E5=ED=EA=E0_=ED=E0_1_=E1=E0=EA=F1=27?=

Прочитаем тело письма:

. fetch 7 rfc822.text

Вот и оно:

* 7 FETCH (RFC822.TEXT {1299}
...сообщение в кодировке windows-1251
. OK Success

В целом, как видите, нет ничего сложного чтобы управляться с консольными выводами POP3 и IMAP.

Разница только в том, что IMAP — понавороченнее, а POP3 обладает весьма урезанным функционалом — и позволяет читать только почту, которая лежит в папке INBOX.

Вспомогательная информация:
Хороший мануал по IMAP
IMAP RFC

Комментировать

Войдите чтобы оставить комментарий.