Майл pop3. Протокол POP3

31.01.2019

POP3 это протокол по которому мы можем получить почту с сервера, для подобной задачи, используется ещё протокол IMAP, но о нём я возможно напишу в будущем, когда столкнусь с ним. А для отправки почты используется как правило SMTP протокол, но речь здесь пойдёт о получении почты. Сначала немного теории.

Как работает POP3 протокол.

Итак, согласно почтовому протоколу POP3, сервер вешается на порт 110 и слушает входящие соединения. Сервер это сноб – он никогда не начнёт диалог первым. Поэтому первыми с ним должны «заговорить» (подключиться) мы, используя TCP соединение. И когда соединение установлено POP3 сервер посылает нам приглашение. Затем, пока соединение остаётся открытым происходит обмен данными.В конце статьи пример простенького скрипта, а пока краткое описание. Итак, действующие лица: S: – сервер, С: - клиент.

Команды протокола POP3

Команды протокола POP3 состоят из ключевых слов, за которыми могут следовать аргументы например: DELE 1 - здесь мы (т.е. клиент) сообщили серверу, что мы помечаем 1 сообщение на удаление. (Почему DELE, а не DELETE ? – читай ниже.)

Все команды серверу должны заканчиваться парой CRLF (это, если писать скрипты, символы: \n – В Unix подобных системах и \r\n в форточках).

Команды и их аргументы должны состоять из символов печатаемого диапазона ASCII.

Команда и её аргументы должны разделяться одним(!) пробелом.

Ключевое слово команды должно быть от 3 до 4 символов длиной, а её аргумент не может превышать 40 символов.

Согласно протоколу POP3, ответы сервера состоят из флага состояния – это:

+OK – Всё хорошо. -ERR – Всё плохо.

И ключевого слова, за которым может идти дополнительная информация, например:

Как видно выше, ответ сервера так же заканчивается парой CRLF

Пара CRLF ассоциируется у меня со словом «Приём» - это, как по рации: когда ты всё, что хотел, сказал и в конце говоришь слово «Приём», что бы собеседник понял, что теперь ты его слушаешь.

Иногда ответ сервера содержит несколько строк:

С: LISTCRLF S: +OK 2 messages (320 octets)CRLF S: 1 120CRLF S: 2 200CRLF S: .CRLF

В таком случае, если каждая строка, в соответствии с протоколом POP3 - заканчивается парой CRLF то, как нам понять, где конец ответа? В данном случае концом всего ответа нужно считать строку: .CRLF где точка - это символ ASCII с кодом 46 и знакомая нам пара CRLF.

APOP [имя]

Эта команда передаёт POP3 серверу логин и зашифрованный пароль(digest). Используется, когда мы хотим авторизоваться на сервере, и при этом не передавать пароль в открытом виде.

[имя] - строка, указывающая имя почтового ящика.

- временная метка, сконкатенированная с паролем, и зашифрованная по MD5-алгоритму.

Если эта команда поддерживается, метка времени получается при соединении с сервером.

USER [имя]

Отправляет имя пользователя.

[имя] - строка, указывающая имя пользователя (почтового ящика).

PASS [пароль]

Отправляет пароль пользователя.

[пароль] - пароль к почтовому ящика.

DELE [сообщение]

Помечает указанное сообщение на удаление. Помеченные сообщения, на самом деле, удаляются только после закрытия транзакции, после того, как прошла команда QUIT. Так же закрытие транзакций на серверах может происходить по истечении , установленного сервером. Что бы этого не произошло можно посылать серверу

LIST [сообщение]

Если передать аргумент - номер сообщения, то сервер выдаёт инфу о запрашиваемом сообщении. Иначе, сервер выдаёт информацию про все сообщения, которые есть на почте. Кстати, сообщения, помеченные для удаления, не перечислятся.

[сообщение] - номер сообщения (необязательно).

NOOP

Это что то вроде пинга серверу, в случае доступности сервер всегда ответит +OK.

Можно посылать эту команду, время от времени, что бы сервер не закрыл соединения при длительном простое.

RETR [сообщение]

Получить сообщение с указанным номером.

[сообщение] - номер сообщения.

Откат транзакций в пределах текущего сеанса. К примеру, если вы случайно пометили сообщение на удаление, то можно убрать метки, послав команду RSET.

Получить количество сообщений в ящике, а так же ещё и размер, занимаемый этими сообщениями на сервере.

Получить заголовки указанного сообщения, и указанное количество первых строк сообщения. Эти данные вернуться, разделённые пустой строкой.

[сообщение] - номер сообщения.

[количество строк] - сколько строк нужно вывести.

Имя Аргументы Ограничения Возможные ответы
APOP [имя] Поддержка этой команды не гарантируется * +OK maildrop has n message * -ERR password suplied for [имя] is incorrect
USER [имя] - * +OK name is a valid mailbox * -ERR never heard of mailbox name
PASS [пароль] Работает после успешной передачи имени почтового ящика * +OK maildrop locked and ready * -ERR invalid password * -ERR unable to lock maildrop
DELE [сообщение] * +OK message deleted * -ERR no such message
LIST [сообщение] Доступна после успешной идентификации * +OK scan listing follows * -ERR no such message
NOOP - Доступна после успешной идентификации +OK
RETR [сообщение] Доступна после успешной идентификации * +OK message follows * -ERR no such message
RSET - Доступна после успешной идентификации +OK
STAT - Доступна после успешной идентификации +OK a b
TOP [сообщение] [количество строк] Доступна после успешной идентификации * +OK n octets * -ERR no such message
QUIT - - +OK

Состояния сеанса POP3

Согласно протоколу POP3, сеанс состоит из нескольких режимов:

AUTHORIZATION:

– Имеет место, когда мы соединились с сервером, и он отправил нам приглашение:

S: <Сервер слушает порт 110> C: <подключается к серверу> S: +OK POP3 server ready

Здесь мы должны идентифицировать себя:

C: APOP vasya S: +OK vasya"s maildrop has 2 messages (320 octets)

Здесь стоит пояснить, что команда APOP [имя] , которую я опишу ниже, может и не поддерживаться. Тогда авторизация может происходить следующим образом, когда пароль передаётся открытым текстом:

C: USER vasya S: +OK User accepted C: PASS vasinpass S: +OK Pass accepted

Если всё проходит успешно, наши отношения с сервером переходят в режим транзакции.

TRANSACTION:

На данном этапе мы получаем информацию о состоянии нашего почтового ящика. Так же мы можем принять и отправить почту, а так же пометить письма на удаление. Завершить этот режим можно командой QUIT, получив её сервер, переходит к режиму UPDATE.

UPDATE:

На данном этапе сервер удаляет помеченные нами на удаление письма, в общем, освобождает ресурсы и закрывает соединение.

Стоит заметить, что у почтового сервера POP3 может существовать так называемый INACTIVITY AUTOLOGOUT таймер . Он должен иметь, по крайней мере, 10-минутный интервал. Это означает, что если мы не общаемся с сервером в течение этого интервала, сервак «огорчается» на нас, и автоматически закрывает соединение, не переходя при этом, в режим UPDATE.

Пример диалога с почтовым сервером POP3

S: <Сервер ожидает входящих соединений на порту 110> C: <подключается к серверу> S: +OK POP3 server ready <[email protected]> C: APOP vasya S: +OK vasya"s maildrop has 2 messages (320 octets) C: STAT S: +OK 2 320 C: LIST S: +OK 2 messages (320 octets) S: 1 120 S: 2 200 S: . C: RETR 1 S: +OK 120 octets S: <сервер передает сообщение 1> S: . C: DELE 1 S: +OK message 1 deleted C: RETR 2 S: +OK 200 octets S: <сервер передает сообщение 2> S: . C: DELE 2 S: +OK message 2 deleted C: QUIT S: +OK dewey POP3 server signing off (maildrop empty) C: <закрывает соединение> S: <продолждает ждать входящие соединения>

Как получить почту по POP3 из PHP

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

Ob_implicit_flush(); header("content-type: text/html; charset=windows-1251"); // Определим пару CRLF: define("CRLF","\r\n"); // Функция для получения многострочного ответа: function getData($fp) { $data=""; while (!feof($fp)) { $line = trim(fgets($fp,1024)); if(trim($line) == ".") break; $data .= $line; } return $data; } // Открываем сокет $fp = fsockopen("pop.yandex.ru", 110, $errNo, $errStr, 10); print fgets($fp,1024)."
"; // Посылаем Логин: fputs($fp,"USER vasya-pupkin".CRLF); print fgets($fp,1024)."
"; // Посылаем Пароль: fputs($fp,"PASS *****".CRLF); print fgets($fp,1024)."
"; // Запрашиваем письмо № 26 fputs($fp,"RETR 26".CRLF); print getData($fp); // Закрываем сессию: fputs($fp,"QUIT".CRLF);


Web-интерфейс
Настройка Mac OS mail
Настройка Outlook
Настройка Mozilla Thunderbird
Настройка The Bat

POP3
Это протокол, который можно использовать для приема электронной почты. Т.е. имеется в виду, возможность забирать почту с сервера на котором она хранится, с помощью интернета (TCP\IP соединение).

IMAP
Это протокол, который кроме приема почты, позволяет управлять ей прямо на сервере. Если POP3 позволяет лишь получить почту (при этом либо удалить письмо с серфера, либо оставить там), то с помощью IMAP прямо на сервере можно отметить письмо как прочитанное и сделать с ним другие действия. При этом по протоколу IMAP письма будут всегда оставаться на сервере, и загружаться каждый раз заново.

SMTP
Это протокол, который предназначен исключительно для отправки почты (POP3 и IMAP - это получение).

Как все это настроить для получения почты?
Если Вы используете для работы с почтой веб-интерфейс, то все эти настройки Вам не нужны. Вы просто заходите на сайт и получаете\отправляете почту. Но в таком случае письма хранятся на сервере, и если у Вас не будет доступа в Интернет, то посмотреть их не получится. Если же Вы хотите работать с почтой через специальную программу, и хранить письма на своем компьютере, то Вам понадобятся следующие настройки, которые обычно приходят в первом письме от хостинг-провайдера (после покупки хостинга):

SMTP-сервер - например smtp.mysite.com
POP3-сервер - например mail.mysite.com
Имя пользователя - например [email protected]
Пароль - он и в Африке пароль.

Еще раз напомним, имя пользователя и пароль задаются Вами, при создании почтового ящика. POP3 и SMTP серверы можно узнать у хостинг-провайдера, или же посмотреть в письме с настройками, которое приходит после заказа хостинга.

Я хочу получать почту через программу
Наиболее популярные программы для работы с почтой это: Mozilla Thunderbird (бесплатная), Microsoft Outlook (не очень удобная), The Bat (удобная, но платная). Также читайте как настроить получение почты на Mac OS .

Важно!
Иногда возникают проблемы с отправкой почты связанные с тем, что Ваш интернет-провайдер блокирует отправку почты, через любой smtp-сервер, кроме его собственного. В таком случае узнайте его на сайте интернет-провайдера или же в технической поддержке.

Также бывает, что интернет-провайдер разрешает использовать чужие smtp-серверы для отправки почты, но блокирует порт 25 из соображений безопасности. В таком случае Вы должны либо использовать порт 587, либо обратиться в техническую поддержку интернет-провайдера, чтобы они разблокировали порт.

Post Office Protocol (POP) - протокол доставки почты пользователю из почтового ящика почтового сервера РОР . Многие концепции, принципы и понятия протокола POP выглядят и функционируют подобно SMTP. Команды POP практически идентичны командам SMTP, отличаясь в некоторых деталях. На рис.7 изображена модель клиент-сервер по протоколу POP. Сервер POP находится между агентом пользователя и почтовыми ящиками.

В настоящее время существуют две версии протокола POP - РОР2 и РОРЗ, обладающими примерно одинаковыми возможностями, однако несовместимыми друг с другом. Дело в том, что у РОР2 и РОРЗ разные номера портов протокола. Между ними отсутствует связь, аналогичная связи между SMTP и ESMTP. Протокол РОРЗ не является расширением или модификацией РОР2 - это совершенно другой протокол. РОР2 определен в документе RFC 937 (Post Office Protocol-Version 2, Butler, et al, 1985), a РОРЗ - в RFC 1225 (Post Office Protocol-Version 3, Rose, 1991). Далее кратко рассмотрим POP вообще и более подробно - РОРЗ. PОРЗ разработан с учетом специфики доставки почты на персональные компьютеры и имеет соответствующие операции для этого.

Назначение протокола РОРЗ

Ранее почтовые сообщения большинства сетей доставлялись непосредственно от одного компьютера к другому. И если пользователь часто менял рабочие компьютеры или один компьютер принадлежал нескольким пользователям, существовали определенные проблемы. В наши дни общепринята доставка сообщения не на компьютеры пользователя, а в специальные почтовые ящики почтового сервера организации, который круглосуточно работает (включен).

Описание протокола РОРЗ

Конструкция протокола РОРЗ обеспечивает возможность пользователю обратиться к своему почтовому серверу и изъять накопившуюся для него почту. Пользователь может получить доступ к РОР-серверу из любой точки доступа к Интернет. При этом он должен запустить специальный почтовый агент (UA), работающий по протоколу РОРЗ, и настроить его для работы со своим почтовым сервером. Итак, во главе модели POP находится отдельный персональный компьютер, работающий исключительно в качестве клиента почтовой системы (сервера). Подчеркнем также, что сообщения доставляются клиенту по протоколу POP, а посылаются по-прежнему при помощи SMTP. То есть на компьютере пользователя существуют два отдельных агента-интерфейса к почтовой системе - доставки (POP) и отправки (SMTP). Разработчики протокола РОРЗ называет такую ситуацию "раздельные агенты" (split UA). Концепция раздельных агентов кратко обсуждается в спецификации РОРЗ.

В протоколе РОРЗ оговорены три стадии процесса получения почты: авторизация, транзакция и обновление. После того как сервер и клиент РОРЗ установили соединение, начинается стадия авторизации. На стадии авторизации клиент идентифицирует себя для сервера. Если авторизация прошла успешно, сервер открывает почтовый ящик клиента и начинается стадия транзакции. В ней клиент либо запрашивает у сервера информацию (например, список почтовых сообщений), либо просит его совершить определенное действие (например, выдать почтовое сообщение). Наконец, на стадии обновления сеанс связи заканчивается. В табл.7 перечислены команды протокола РОРЗ, обязательные для работающей в Интернет реализации минимальной конфигурации.

Таблица 5. Команды протокола POP версии 3 (для минимальной конфигурации)

Описание

USER

Идентифицирует пользователя с указанным именем

Указывает пароль для пары клиент-сервер

Закрывает TCP-соединение

Сервер возвращает количество сообщений в почтовом ящике плюс размер почтового ящика

Сервер возвращает идентификаторы сообщений вместе с размерами сообщений (параметром команды может быть идентификатор сообщения)

Извлекает сообщение из почтового ящика (требуется указывать аргумент-идентификатор сообщения)

Отмечает сообщение для удаления (требуется указывать аргумент - идентификатор сообщения)

Сервер возвращает положительный ответ, но не совершает никаких действий

Сервер возвращает наибольший номер сообщения из тех, к которым ранее уже обращались

Отменяет удаление сообщения, отмеченного ранее командой DELE

В протоколе РОРЗ определено несколько команд, но на них дается только два ответа: +ОК (позитивный, аналогичен сообщению-подтверждению АСK) и -ERR (негативный, аналогичен сообщению "не подтверждено" NAK). Оба ответа подтверждают, что обращение к серверу произошло и что он вообще отвечает на команды. Как правило, за каждым ответом следует его содержательное словесное описание. В RFC 1225 есть образцы нескольких типичных сеансов РОРЗ. Сейчас мы рассмотрим несколько из них, что даст возможность уловить последовательность команд в обмене между сервером и клиентом.

Авторизация пользователя

После того как программа установила TCP-соединение с портом протокола РОРЗ (официальный номер 110), необходимо послать команду USER с именем пользователя в качестве параметра. Если ответ сервера будет +ОК, нужно послать команду PASS с паролем этого пользователя:

CLIENT: USER kcope ERVER: +ОК CLIENT: PASS secret SERVER: +ОК kcope"s maildrop has 2 messages (320 octets) (В почтовом ящике kcope есть 2 сообщения (320 байтов) ...)

Транзакции РОРЗ

Команда STAT возвращает количество сообщений и количество байтов в сообщениях:

CLIENT: STAT
SERVER: +ОК 2 320

Команда LIST (без параметра) возвращает список сообщений в почтовом ящике и их размеры:

CLIENT: LIST SERVER: +ОК 2 messages (320 octets) SERVER: 1 120 SERVER: 2 200 SERVER: . ...

Команда LIST с параметром возвращает информацию о заданном сообщении:

CLIENT: LIST 2 SERVER: +ОК 2 200 ... CLIENT: LIST 3 SERVER: -ERR no such message, only 2 messages in maildrop

Команда TOP возвращает заголовок, пустую строку и первые десять строк тела сообщения:

CLIENT: TOP 10 SERVER: +ОК SERVER: (сервер POP высылает заголовки сообщений, пустую строку и первые десять строк тела сообщения) SERVER: . ... CLIENT: TOP 100 SERVER: -ERR no such message

Команда NOOP не возвращает никакой полезной информации, за исключением позитивного ответа сервера. Однако позитивный ответ означает, что сервер находится в соединении с клиентом и ждет запросов:

CLIENT: NOOP
SERVER: +ОК

Следующие примеры показывают, как сервер POP3 выполняет действия. Например, команда RETR извлекает сообщение с указанным номером и помещает его в буфер местного UA:

CLIENT: RETR 1 SERVER: +OK 120 octets SERVER: (РОРЗ-сервер высылает сообщение целиком) SERVER: . . . . . .

Команда DELE отмечает сообщение, которое нужно удалить:

SERVER: +OK message 1 deleted ... (сообщение 1 удалено) CLIENT: DELE 2 SERVER: -ERR message 2 already deleted сообщение 2 уже удалено)

Команда RSET снимает метки удаления со всех отмеченных ранее сообщений:

CLIENT: RSET
SERVER: +OK maildrop has 2 messages (320 octets)
(в почтовом ящике 2 сообщения (320 байтов))

Как и следовало ожидать, команда QUIT закрывает соединение с сервером:

CLIENT: QUIT SERVER: +OK dewey POP3 server signing off CLIENT: QUIT SERVER: +OK dewey POP3 server signing off (maildrop empty) CLIENT: QUIT SERVER: +OK dewey POP3 server signing off (2 messages left)

Обратите внимание на то, что отмеченные для удаления сообщения на самом деле не удаляются до тех пор, пока не выдана команда QUIT и не началась стадия обновления. В любой момент в течение сеанса клиент имеет возможность выдать команду RSET , и все отмеченные для удаления сообщения будут восстановлены.