Что такое код imap_listsubscribed

Что такое использование команд Subscribe и Unsubscribe в Imap4req1?

Что такое использование команд Subscribe и Unsubscribe в Imap4req1? Я проверил RFC 3501, но я не мог понять его использования. Что произойдет, когда я напишу следующие команды

будет ли сервер обрабатывать эти почтовые ящики как отдельные?

пожалуйста, проверьте ниже один раз и сообщите разницу

Они меняют вывод команды LSUB . Это. SUBSCRIBE добавляет папки к выходу команды LSUB . UNSUBSCRIBE удалит их из вывода команды LSUB . То есть LSUB показывает только подписанные папки.

LIST всегда будет показывать все папки.

Например, начиная со всех подписанных папок:

Теперь отмените подписку INBOX.Sent :

Все, что отличается от того, что INBOX.Sent было удалено с выхода LSUB. Обратите внимание, что вывод LIST не будет затронут.

Теперь вернемся назад:

Они обычно используются для того, чтобы клиент отмечал папки, которые пользователь интересует.

FPublisher

Web-технологии: База знаний

Документация PHP

imap_listsubscribed

imap_listsubscribed — Alias of imap_lsub()

Описание

This function is an alias of: imap_lsub().

Последние поступления:

ТехЗадание на Землю

Размещена 14 марта 2020 года

Пpоект Genesis (из коpпоpативной пеpеписки)

Шпаргалка по работе с Vim

Размещена 05 декабря 2020 года

Vim довольно мощный редактор, но работа с ним не всегда наглядна.
Например если нужно отредактировать какой-то файл например при помощи crontab, без знания специфики работы с viv никак.

Ошибка: Error: Cannot find a val >Размещена 13 сентабря 2020 года

Если возникает ошибка на centos 5 вида
YumRepo Error: All mirror URLs are not using ftp, http[s] or file.
Eg. Invalid release/

Linux Optimization

Размещена 30 июля 2012 года

Реализация IMAP протокола

11.08.2014, 02:43

Реализация IMAP C#
Помогите с реализацией IMAP на C# с ssl. Нужно установить соединение, получить список сообщений.

Реализация протокола обмена по COM порту
Здравствуйте, в общем нужно было мне реализовать протокол обмена с весами на основе программы.

Реализация протокола pop. При попытке реализовать такие команды, как STAT и LIST программа зависает
Здравствуйте! Пытаюсь создать простого почтового клиента, используя методы класса TcpClient.

IMAP Почтовый клиент
Уважаемые форумчане! Нашёл пример IMAP клиента.

imap удаление почты
делаю IMAP клиент,нужны команды ,инфа про них,а еще лучше с примерами,такие команды как APPEND и т д

11.08.2014, 03:25 2

WinSock — это если на голом Си или С++, то бишь под WinAPI.
А в .NET либо через сокеты из System.Net, либо через готовые библиотеки (основанные на тех сокетах).

Сам вот ищу библиотеку такую
Библиотек вроде немало, вот только что я ни попробую — все ерунда какая-то, ничего толком не работает
ImapX, InterIMAP, ActiveUp.Net.Imap4.
Идеальной пока не нашел, но вот Noix.IMAP вроде хоть куда-то годится.

Вот вам в скомпилированном виде.
Noix.TestIMAP — это тестовая прожка. Вводите туда сервер (скажем imap.yandex.ru), порт (143 обычно, про SSLовский 995-ый я хз, поддерживается или нет — не пробовал), нажимаете Connect.
Ниже вводите ящик и пароль — нажимаете Authentificate.
Еще ниже вводите INBOX, нажимаете Select Folder и затем Fetch.
Видите заголовки 2 писем (вообще он все письма получал, т.е. так

поэтому теперь получает только 2, а то долго очень, их много)
Почему-то только с INBOX у меня получилось. Хотя суть IMAPа и одно из главных преимуществ перед POP3 — это именно поддержка папок.

Что такое IMAP и POP?

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

IMAP и POP — это два метода доступа к электронной почте. Рекомендуется использовать IMAP, если вам требуется проверять почту с нескольких разных устройств (например, телефона, ноутбука и планшета).

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

IMAP скачивает сообщение, только когда вы его щелкаете, и вложения не скачиваются автоматически. Так вы сможете проверять сообщения гораздо быстрее, чем с помощью POP.

POP связывается с вашей службой электронной почты и скачивает из нее все новые сообщения. После скачивания на компьютер с Windows или Mac OS сообщения удаляются из почтовой службы. Это значит, что после скачивания почтового сообщения к нему можно обращаться только с того же компьютера. Если вы попытаетесь обратиться к сообщению с другого устройства, ранее скачанные сообщения будут недоступны.

Отправленная почта хранится локально на компьютере с Windows или Mac OS, а не на почтовом сервере.

Многие поставщики услуг Интернета предоставляют учетные записи электронной почты, которые используют POP.

Учетные записи веб-почты или почтовые приложения

Gmail, Outlook.com, Hotmail.com и iCloud — это веб-почта. Вход в учетную запись веб-почты выполняется в Интернете.

Если у вас есть компьютер с Windows или Mac OS, вы, вероятно, использовали программу, например Outlook, Apple Mail или Thunderbird, для управления электронной почтой. Outlook, Apple Mail и Thunderbird — это приложениядля работы с электронной почтой: программы, устанавливаемые на компьютере для управления электронной почтой. Они взаимодействуют с помощью службы электронной почты, например Gmail или Outlook.com, для получения и отправки электронной почты.

В почтовое приложение вы можете добавить любую учетную запись электронной почты, чтобы управлять ею оттуда. Например, вы можете добавить в приложение Outlook или Apple Mail учетные записи веб-почты (Gmail, Outlook.com, Hotmail.com, AOL и Yahoo) и почтовые учетные записи, предоставленные вашей организацией.

Добавление учетных записей веб-почты в почтовые приложения, такие как Outlook, Apple Mail, Thunderbird

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

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

Сервер входящей почты (IMAP): IMAP. _лт_ имя службы>. com

Сервер входящей почты (POP): pop. имя службы>.com

Сервер исходящей почты (SMTP): smtp. имя службы>.com

Работа с IMAP в Synapse #1

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

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

Думаю, что это одно из ключевых преимуществ IMAP — нет необходимости ждать пересылку всего письма с сервера, если все, что нам требуется — это посмотреть его заголовок. Естественно, у протокола IMAP имеется ещё ряд преимуществ по сравнению с POP3, но во всех прелестях IMAP мы будем знакомиться, думаю, что на протяжении ещё пары-тройки статей, а пока начнем рассмотрение работы с IMAP в Synapse с самых-самых простых операций.

Итак, что из себя представляет протокол IMAP:

В Synapse для работы с IMAP используется модуль imapsend.pas, который содержит один единственный класс:

в котором и содержатся все необходимые нас свойства и методы для работы с IMAP. Разберемся с работой этого класса на примере небольшой программы. Для начала создаем новый проект Delphi и размещаем на главной форме следующие компоненты:

Форма для логина на сервер IMAP

Теперь попробуем залогиниться на почтовом сервере. Снова обращаю Ваше внимание на тот факт, что

В OnCreate и OnDestroy формы пишем:

Пишем такой обработчик OnClick:

Теперь разберемся, что здесь происходит, зачем и почему именно так, а не иначе.

У класса TImapSend нет собственных свойств для логина/пароля и хоста/порта, но т.к. этот класс — наследник TSynaClient у которого эти свойства присутствуют, то мы свободно ими воспользовались.

Почтовый сервер может использовать как SSL, так и TLS, поэтому предусматриваем эти ситуации. При этом не забываем:

Далее мы пробуем залогиниться на сервере, используя метод Login:

Метод логин работает следующим образом:
1. Пробуем установить соединение с сервером. Если соединение выполнено, то сервер вернет нам либо

что будет означать, что логин уже выполнен, либо строкой

что будет означать, что соединение создано и надо отправить на сервер команду LOGIN, чтобы провести аутентификацию.
2. Проверяем возможности сервера. Для этого на сервер отправляется команда CAPABILITY. В результате сервер пришлет нам список своих возможностей, а также, если сервер является IMAP-сервером, то в списке возможностей должна содержаться:

3. Проверяется необходимо ли использовать TLS при работе. Если в списке возможностей имеется STARTTLS, то пробуем использовать TLS (для этого свойство AutoTLS должно быть True) и снова отправляем команду CAPABILITY, чтобы заполнить список возможностей сервера.
4. Пробуем отправить команду LOGIN на сервер. Для этого используется protected-метод AuthLogin. Логин и пароль в этом случае отправляются в открытом виде.
5. Если логин прошел успешно, то сервер ответит «OK», а свойство класса AuthDone станет равным True.

Илон Маск рекомендует:  Геометрическое сглаживание в сплайнами

После того, как мы залогинились на сервере мы можем сразу посмотреть где мы находимся в данный момент и отправлять на сервер различные команды. Итак, вначале посмотрим, что будут содержать свойства TImapSend после логина на сервере mail.ru.

Для того, чтобы посмотреть, что отвечает нам сервер я положил на форму компонент TMemo, написал такой обработчик события OnReadFilter сокета:

и назначил этот обработчик в OnCreate формы:

Теперь запускаем нашу программку, задаем логин и пароль доступа к почтовому ящику на mail.ru и пробуем залогиниться. После клика по кнопке «Login» в Memo появятся такие строки, содержащие ответы сервера:
* OK Welcome
* CAPABILITY IMAP4rev1 ID XLIST UIDPLUS STARTTLS LOGINDISABLED
S1 OK CAPABILITY completed
S2 NO Command disabled. Please use STARTTLS first.

все в соответствии с тем, как работает метод Login у TImapSend, т.е.:
1. Соединение было установлено, сервер с нами поздаровался и предложил залогиниться (строка 1)
2. Мы попросили список возможностей сервер и сервер нам ответил (строки 2,3)
3. Мы попробовали отправить на сервер логин и пароль, но сервер нам отказал в аутентификации, т.к. мы забыли подключить TLS.
Теперь, включаем TLS (ставим флажок у чекбокса AutoTLS) и снова пробуем залогиниться. Логин проходит успешно, о чем нам говорит лог:
* OK Welcome
* CAPABILITY IMAP4rev1 ID XLIST UIDPLUS STARTTLS LOGINDISABLED
S3 OK CAPABILITY completed
S4 OK Starting TLS.
* CAPABILITY IMAP4rev1 > S5 OK CAPABILITY completed
* CAPABILITY IMAP4rev1 ID XLIST UIDPLUS
S6 OK Authentication successful
Теперь посмотрим, что содержат свойства класса после логина.

Статусная строка, содержащая результат последней операции. После успешной аутентификации она у нас будет содержать:
S4 OK Authentication successful
и, соответственно, свойство

Что такое код imap_listsubscribed

Д ля того, чтобы эти функции заработали вц должны скомпилировать PHP с флагом —with-imap. Этот флаг требут, чтобы была установлена библиотека c-client. Последнюю версию можно получить по адресу ftp://ftp.cac.washington.edu/imap/. Затем скопируйте c-client/c-client.a в /usr/local/lib или какую либо другую директорию, прописанную в пути, затем скопируйте c-client/rfc822.h, mail.h и linkage.h в /usr/local/include или другую директорию с include-файлами.

imap_append — Добавляет текстовое сообщение в указанный почтовый ящик

Описание int imap_append(int imap_stream, string mbox, string message, stringflags);

В озвращает true в случае успеха или false иначе.

imap_append() добавляет текстовое сообщение в указанный почтовый ящик mbox. Если указаны необязательные флаги, также записывает в почтовый ящик и флаги.

П ри общении с сервером Cyrus IMAP нужно использовать в качестве ограничителей строки «\r\n» вместо «\n», иначе действие не выполнится.

imap_base64 — Декодирует текст, закодированный с помощью BASE64

Описание string imap_base64(string text);

Ф ункция imap_base64() декодирует текст в формате BASE-64. Декодированное сообщение возвращается как строка.

imap_body — Читает тело сообщения

Описание string imap_body(int imap_stream, int msg_number, int flags);

Ф ункция imap_body() возвращает тело сообщения, имеющего номер п/п msg_number в текущем почтовом ящике. Необязательные флаги это битовые маски из

FT_UID — Номер сообщения msgno является UID»ом сообщения

FT_PEEK — Не устанавливать флаг \Seen если он еще не установлен.

FT_INTERNAL — Возвращаемая строка записана во внутреннем формате и не может быть приведена к канонической форме с CRLF.

imap_check — Проверяет текущий почтовый ящик

Описание array imap_check(int imap_stream);

В озвращает информацию о текущем почтовом ящике. В случае неуспеха возвращает FALSE.

Ф ункция imap_check() проверяет статус текущего почтового ящика на сервере и возвращает информацию в объекте со следующими свойствами.

Date : дата сообщения

Mailbox : название почтового ящика

Nmsgs : количество сообщений

Recent : количество недавно пришедших сообщений

imap_close — Закрывает поток IMAP

Описание int imap_close(int imap_stream, int flags);

З акрывает поток imap. Необязательный флаг CL_EXPUNGE заставляет стереть помеченные на удаление сообщения при закрытии.

imap_createmailbox — Создает новый почтовый ящик.

Описание int imap_createmailbox(int imap_stream, string mbox);

i map_createmailbox() создает новый почтовый ящик указанный в mbox. Возвращает true в случае успеха и false при ошибке.

imap_delete — Помечает сообщение из текущего почтового ящика на удаление

Описание int imap_delete(int imap_stream, int msg_number);

В озвращает true.

Ф ункция imap_delete() помечает сообщение, указанное через msg_number на удаление. Настоящее удаление сообщений осуществляется функцией imap_expunge().

imap_deletemailbox — Удаляет почтовый ящик

Описание int imap_deletemailbox(int imap_stream, string mbox);

imap_deletemailbox() удаляет указанный почтовый ящик. Возвращает true в случае успеха и false иначе.

imap_expunge — Удаляет все сообщения, помеченные на удаление

Описание int imap_expunge(int imap_stream);

imap_expunge() удаляет все сообщения помеченные на удаление с помощью imap_delete(). Возвращает true.

imap_fetchbody — Извлекает простую секцию тела сообщения

Описание string imap_fetchbody(int imap_stream, int msg_number, int part_number, flags flags);

Э та функция заставляет извлечь подробную секцию указанного сообщения как текстовую строку. Секция — это строка целых чисел, разделенных точками, которые указывают на части тела сообщения в списке частей согласно спецификации IMAP4. Части тела не декодируются этой функцией. Необязательным параметром к imap_fetchbody () является битовая маска из

FT_UID — msgono является UID»ом

FT_PEEK — не устанавливать флаг \Seen если он не установлен

FT_UID — возвращаемая строка записана во внутреннем формате, которое не может быть канонизированна с помощью CRLF

imap_fetchstructure — Читает структуру простого сообщения

Описание array imap_fetchstructure(int imap_stream, int msg_number);

Э та функция заставляет извлечь всю информацию о структуре сообщения с номером msg_number. Возвращаемая величина является объектом со следующими элементами.

ifsubtype — подтип интерфейса

ifdescription — описание интерфейса

ifid — идентификатор интерфейса

ifparameters — параметры интерфейса

Т акже функция возвращает массив объектов под названием parameters[]. Этот объект имеет следующие свойства.

attribute value
атрибут величина

В случае сообщения из нескольих частей, функция также возвращает массив объектов всех свойств под название parts[].

imap_header — Читает заголовок сообщения

Описание object imap_header(int imap_stream, int msg_number, int fromlength, int subjectlength, int defaulthost);

Э та функция возвращает объект различных элементов заголовка

toaddress (полная строка To: строка длиной до 1024 символов)

to[] (возвращает массив объектов из строки To, содержит:)
personal
adl
mailbox
host

fromaddress (полная строка From: строка длиной до 1024 символов)

from[] (возвращает массив объектов из строки From, содержит:)
personal
adl
mailbox
host

ccaddress (полная строка Cc: строка длиной до 1024 символов)
cc[] (возвращает массив объектов из строки Cc, содержит:)
personal
adl
mailbox
host

bccaddress (полная строка Bcc: строка длиной до 1024 символов)
bcc[] (возвращает массив объектов из строки Bcc, содержит:)
personal
adl
mailbox
host

reply_toaddress (полная строка Reply_to: строка длиной до 1024 символов)
reply_to[] (возвращает массив объектов из строки Reply_to, содержит:)
personal
adl
mailbox
host

senderaddress (полная строка Sender: строка длиной до 1024 символов)
sender[] (возвращает массив объектов из строки Sender, содержит:)
personal
adl
mailbox
host

return_path (полная строка Return-path: строка длиной до 1024 символов)
return_path[] (возвращает массив объектов из строки Return_path, содержит:)
personal
adl
mailbox
host

udate ( дата сообщения в формате времени unix)

fetchfrom (строка From, отформатированная до fromlength символов)
fetchsubject (строка Subject, отформатированная до subjectlength символов)

imap_headers — Возвращает заголовки всех сообщений в почтовом ящике

Описание array imap_headers(int imap_stream);

В озвращает строковый массив из информации по заголокам. Один элемент массива на сообщение.

imap_listmailbox — Читает список почтовых ящиков

Описание array imap_listmailbox(int imap_stream, string ref, string pat);

В озвращает массив, содержащий названия почтовых ящиков.

imap_listsubscribed — Перечисляет все подписанные ящики

Описание array imap_listsubscribed(int imap_stream, string ref, string pattern);

В озвращает массив всех почтовых ящиков на которые Вы подписаны. Аргументы ref и pattern указывают начальное месторасположение откуда начинать поиск и шаблон, которому должны удовлетворять названия почтовых ящиков.

imap_mail_copy — Копирует указанные сообщения в почтовый ящик

Описание int imap_mail_copy(int imap_stream, string msglist, string mbox, int flags);

В озвращает true в случае успеха и false иначе. Копирует почтовые сообщения указанные с помощью msglist в почтовый ящик mbox. msglist — это диапазон, а не просто номера сообщений.

флаги — это битовые маски из

CP_UID — номера в последовательности содержат UID»ы

CP_MOVE — после копирования удалить сообщения из текущего почтового ящика

imap_mail_move — Переносит указанные сообщения в почтовый ящик

Описание int imap_mail_move(int imap_stream, string msglist, string mbox);

П ереносит почтовые сообщения указанные с помощью msglist в почтовый ящик mbox. msglist — это диапазон, а не просто номера сообщений. Возвращает true в случае успеха и false иначе.

imap_num_msg — Выдает количество сообщений в текущем почтовом ящике

Описание int imap_num_msg(void);

В озвращает количество сообщений в текущем почтовом ящике.

imap_num_recent — Возвращает количество недавно пришедших сообщений в текущем почтовом ящике

Описание int imap_num_recent(int imap_stream);

В озвращает количество недавно пришедших сообщений в текущем почтовом ящике.

imap_open — Открывает поток IMAP в почтовый ящик

Описание int imap_open(string mailbox, string username, string password, int flags);

В случае успеха возвращает поток IMAP или false иначе. Эта функция может быть использована для открытия потоков к POP3 и NNTP серверам. Для того, чтобы присоединиться к серверу IMAP на 143-й порт на локальной машине сделайте следующее:

$mbox = imap_open(«INBOX»,»user_id»,»password»);
Для того, чтобы подсоединиться к POP3-серверу на 110-й порт на локальном сервере используйте:

$mbox = imap_open(«INBOX»,»user_id»,»password»);
Для того, чтобы подсоединиться к NNTP-серверу на 119-й порт на локальном сервере используйте:

$nntp = imap_open(«comp.test»,»»,»»);
Для того, чтобы подсоединиться к удаленному серверу замените «localhost» на имя или IP-адрес сервера к которому Вы хотите подсоединиться.

О пции — битовая маска из

OP_READONLY — Открыть почтовый ящик в режим «только чтение»

OP_ANONYMOUS — Не использовать или не обновлять .newsrc при использовании новостей

OP_HALFOPEN — Для IMAP и NNTP устанавливает соединение, но не открывает почтовый ящик

Илон Маск рекомендует:  Введение в jsp

CL_EXPUNGE — Автоматически очищать почтовый ящик при закрытии

imap_ping — Проверяет поток IMAP на работоспособность

Описание int imap_ping(int imap_stream);

В озвращает true если поток еще работоспособен и false иначе. Функция imap_ping() проверяет поток на работоспособность. Он может также проверять новую почту; это предпочтительный метод для периодической проверки новой почты и «живучести» удаленных серверов.

imap_renamemailbox — Переименовывает старый почтовый ящик в новый

Описание int imap_renamemailbox(int imap_stream, string old_mbox, string new_mbox);

Э та функция переименовывает старый почтовый ящик в новый. Возвращает true в случае успеха и false иначе.

imap_reopen — Заново открывает поток IMAP на новый почтовый ящик

Описание int imap_reopen(string imap_stream, string mailbox, string [flags]);

В озвращает true в случае успеха и false иначе. Эта функция заново открывает указанный поток на новый ящик.

О пции — битовая маска из

OP_READONLY — Открыть почтовый ящик в режиме только чтение

OP_ANONYMOUS — Не использовать или не обновлять .newsrc при работе с новостями

OP_HALFOPEN — Для IMAP и NNTP устанавливает связь но не открывает почтовый ящик

CL_EXPUNGE — Очищает почтовый ящик при закрытии

imap_subscribe — Подписывает на почтовый ящик

Описание int imap_subscribe(int imap_stream, string mbox);

П одписывает на новый почтовый ящик. Возвращает true в случае успеха и false иначе.

imap_undelete — Снимает отметку с сообщения помеченного на удаление

Описание int imap_undelete(int imap_stream, int msg_number);
Э та функция cнимает отметку с сообщения помеченного на удаление функцией imap_delete(). Возвращает true в случае успеха и false иначе.

imap_unsubscribe — Снимает подписку с почтового ящика

Описание int imap_unsubscribe(int imap_stream, string mbox);

С нимает подписку с почтового ящика. Возвращает true в случае успеха и false иначе.

imap_qprint — Конвертирует строку формата quoted-printable в 8-битовую строку

Описание string imap_qprint(string string);

К онвертирует строку формата quoted-printable в 8-битовую строку. Возвращает 8-битовую (бинарную) строку

imap_8bit — Конвертирует 8-битовую строку в формат quoted-printable

Описание string imap_8bit(string string);

К онвертирует 8-битовую строку в формат quoted-printable. Возвращает строку в формате quoted-printable.

imap_binary — Конвертирует 8-битную строку в формат base64

Описание string imap_binary(string string);

К онвертирует 8-битную строку в формат base64. Возвращает строку в формате base64.

imap_scanmailbox — Читает список почтовых ящиков, проводит поиск в названиях ящиков

Описание array imap_scanmailbox(int imap_stream, string string);

В озвращает массив, содержащий имена почтовых ящиков, которые имеют строку string в названии.

imap_mailboxmsginfo — Получает информацию о текущем почтовом ящике

Описание array imap_mailboxmsginfo(int imap_stream);

В озвращает информацию о текущем почтовом ящике. FALSE в случае неудачи. Функция imap_mailboxmsginfo() проверяет статус текущего почтового ящика на сервере и возвращает информацию в объекте со следующими свойствами:

Date : дата сообщения

Mailbox : название почтового ящика

Nmsgs : количество сообщений

Recent : количество недавно пришедших сообщений

Unread : количество непрочитанных сообщений

Size : размер почтового ящика

imap_rfc822_write_address — Возвращает правильно отформатированный email адрес

Описание string imap_rfc822_write_address(string mailbox, string host, string personal);

В озвращает правильно отформатированный email адрес по данному почтовому ящику, хосту и персональной информации.

imap_rfc822_parse_adrlist — Проводит разбор адресной строки

Описание string imap_rfc822_parse_adrlist(string address, string default_host);

Э та функция разбирает адресную строку и для каждого адреса возвращает массив объектов. Есть 4 типа объектов:

mailbox — название почтового ящика (имя пользователя)

host — название хоста

personal — личное имя

adl — путь к домену-источнику

imap_setflag_full — Устанавливает флаги на сообщения

Описание string imap_setflag_full(int stream, string sequence, string flag, string options);

Э та функция застваляет добавить указанный флаг к набору флагов сообщения в указанной последовательности.

options — это битовая маска из ST_UID Аргументы последовательности содержат UIDы вместо номеров

imap_clearflag_full — Очищает флаги сообщения

Описание string imap_clearflag_full(int stream, string sequence, string flag, string options);

Э та функция заставляет удалить флаги из набора флагов сообщения в указанной последовательности.

options — это битовая маска из ST_UID Аргументы последовательности содержат UIDы вместо номеров

imap_sort — Сортирует сообщения в текущем почтовом ящике

Описание string imap_sort(int stream, int criteria, int reverse, int options);

В озвращает массив номеров сообщений рассортированных по данному параметру. Rev должен быть равен 1 если нужна сортировка в обратном порядке. Критерии сортировки (должен быть указан только один):

SORTDATE
SORTARRIVAL
SORTFROM
SORTSUBJECT
SORTTO
SORTCC
SORTSIZE

по дате сообщения
по дате поступления
по полю From
по теме сообщения
по полю To
по полю cc
по размеру

опции — битовая маска из

SE_UID Возвратить UIDы вместо номеров последовательности

SE_NOPREFETCH Не извелекать заранее найденные сообщения

imap_fetchheader — Возвращает заголовок сообщения

Описание stringimap_fetchheader(int imap_stream, int msgno, int flags);

Э та функция заставляет извлечь полный, неотфильтрованный заголовок указанного сообщения в формате RFC 822 как текстовую строку.

FT_UID msgno является UID»ом

FT_INTERNAL Возвращаемая строка записана во внутреннем формате без каких-либо попыток канонизировать ее с помощью CRLF

FT_PREFETCHTEXT RFC822. Текст должен быть предварительно разобран. Это поможет избежать эстренных задержек если требуется извлечь полный текст сообщения (например, в операции «сохранить в локальном файле»)

imap_uid — Эта функция возвращает UID по данному номеру сообщения в последовательности

Описание string imap_uid(string mailbox, int msgno);

Э та функция возвращает UID по данному номеру сообщения в последовательности.

IMAP: трудности перехода

Какие грабли зарыты в IMAP

Уже некоторое время IMAP работает в Почте Mail.Ru в полную силу, и я готов рассказать о том, с какими проблемами мы столкнулись при его запуске. Часть из них была связана с особенностями самого протокола и с его историей, другие были обусловлены спецификой взаимодействия IMAP с нашим хранилищем. Отдельная категория трудностей вызвана многообразием почтовых клиентов.

За подробностями — добро пожаловать под кат.

Нынешний запуск IMAP — наш второй подход к снаряду. В прошлый раз мы взяли сервер Dovecot и попробовали заточить его под себя. Результат нас не устроил: с нашими нагрузками и нашей инфраструктурой он сочетался плохо. В этот раз мы решили выбрать другой путь, и написали собственное решение.

IMAP мы запустили в мае, но анонсировали только в июне. Фактически, майская аудитория — это наши сотрудники и те пользователи, у которых клиенты автоматически определили наличие IMAP в нашей Почте и подключили к нему новые добавленные аккаунты.

Трудности, специфичные для протокола IMAP

1. Громоздкость самого протокола

Первая версия протокола IMAP появилась в 1986 году. В данный момент актуален стандарт IMAP версии 4rev1, который был обновлен в 2003 году. За такой долгий срок стандарт существенно разросся: его текущая версия насчитывает порядка 200 страниц.

Сейчас многие моменты, описанные в стандарте, устарели — в сегодняшних условиях они уже не являются необходимостью. Например, в протоколе предусмотрен возврат количества строк и MD5-суммы частей письма — функционал, который фактически не используется в современных клиентах.

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

Чтобы побороть историческое наследие, нам пришлось реализовать несколько расширений. Одно из них — UID+: когда мы копируем или добавляем письмо, мы возвращаем ID нового письма, которое появилось на сервере в результате копирования или добавления. Это позволяет нам сэкономить на ресурсоемкой операции поиска, которую приходилось проводить клиенту, чтобы распознать, какое именно письмо было добавлено.

2. Отсутствие стандартного паттерна работы с сервером

IMAP предоставляет множество способов решить одну и ту же задачу и, как следствие, практически у всех клиентов паттерн работы различен. Также важно, что паттерны работы существенно отличаются от того, как работает веб-почта или POP3.

Более половины приходится на долю клиентов под устройства Apple: причина в том, что у них хорошо работает автоопределение IMAP. Outloook же, напротив, по умолчанию работает по POP3, и настраивать IMAP нужно руками.

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

Почему для нас это было необходимым шагом? При скромных нагрузках (например, если сервер обслуживает корпоративную почту небольшой компании) вопрос оптимальности стоит не так остро. Однако при наших объемах оптимальность становится критичной: следовательно, нам нужно было изучить паттерны работы всего зоопарка почтовых клиентов, обращающихся к хранилищу.

3. Количество одновременных сессий

По стандарту, минимальный таймаут сервера — 30 минут. Кроме того, один клиент может держать сразу несколько соединений к серверу (в протоколе не указано максимальное количество разрешенных соединений). Фактически, в нашем масштабе, это означает, что один сервер должен оптимально работать с десятками тысяч одновременных соединений. При работе в синхронном режиме такое количество соединений просто поглотило бы все ресурсы.

Для решения этой проблемы я написал библиотеку для асинхронной работы, построенную на базе edge-triggered epoll. Изначально я ставил перед собой задачу сделать библиотеку, при помощи которой можно было бы в будущем за пару дней написать свой асинхронный сервер для решения других задач, помимо IMAP; в результате практически весь код можно использовать для написания других сервисов.

4. Невозможность однозначно идентифицировать клиент

Наш сервер поддерживает расширение ID, которое позволяет нам идентифицировать примерно половину клиентов. К сожалению, другая половина об этом расширении не знает (из популярных можно назвать, например, Outlook).
Понимание того, с каким клиентом мы работаем, позволяет обойти его характерные баги, а также предсказать, каким будет паттерн работы в рамках данной сессии и, соответственно, оптимизировать работу. Для нас это критично, поэтому, если клиент не называет ID, мы стараемся идентифицировать его другими путями (в случае Outlook — по тегам).

5. Отсутствие команды перемещения сообщений

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

Илон Маск рекомендует:  Iis расчет быстродействия для подключения

Трудности, связанные с адаптацией текущего хранилища писем и индексов

1. Идентификация сообщений

Для работы по IMAP необходимо было поддержать два вида идентификаторов сообщений: порядковый номер, который может отличаться от сессии к сессии, а также уникальный номер, который сохраняется на все время жизни сообщения. Оба идентификатора должны удовлетворять довольно строгим критериям, которые не соответствовали схеме, используемой веб-почтой и POP3-сервером.

Наиболее рациональным оказывается держать в оперативной памяти весь набор порядковых номеров, их соответствие внутренним идентификаторам, а также IMAP ID. При открытии папки мы вытягиваем из хранилища список всех писем, наши внутренние идентификаторы, IMAP ID, флажки и размер сообщения — все то, что хочется отдавать без лишних запросов.

Обо всех изменениях порядкового номера в рамках одной сессии мы должны оповещать клиент. Согласно стандарту, последовательность IMAP ID должна соответствовать последовательности порядковых номеров. Порядковые номера мы получим, отсортировав список писем по уникальным номерам. Когда клиент выдает новую команду, мы заново открываем соединение с хранилищем, запрашиваем время последних изменений, которые были сделаны в ящике. Если изменений со времени последнего такого запроса не было, то мы просто возвращаем ответ на команду. В ином случае мы заново запрашиваем список сообщений в папке и сравниваем с аналогичным списком клиента. Далее мы либо возвращаем информацию об изменениях, либо, если протокол не позволяет этого сделать сразу, делаем у себя пометку о том, что письмо удалено, и ждем подходящего момента, чтобы сообщить об этом клиенту.

Из-за такой специфики — письма уже нет в ящике, но клиент об этом еще не узнал — клиент может запросить данные об уже удаленном письме. Более того, некоторые из них испытывали серьезные проблемы, если ответа на их запрос не поступало. Чтобы клиент не ломался, мы в ответ на подобные запросы возвращаем заглушки. Клиент получает нужную ему для нормальной работы информацию, а уже при следующем обновлении списка писем (оно, как правило, происходит сразу же) удаляет из него сообщение.

2. Необходимость оптимально возвращать информацию о MIME-структуре письма

Практически все клиенты запрашивают информацию о структуре письма. Часто в рамках первой сессии они запрашивают такую информацию сразу обо всех письмах в папке. Парсить письмо на каждый такой запрос было бы крайне неоптимально.
Вместо этого мы сделали кэш MIME-структур. Наличие кэша помогло нам побороть сразу несколько трудностей, связанных с особенностями IMAP — в частности, отсутствие стандартного паттерна работы с сервером: поскольку часть информации хранится в кэше, это помогает нивелировать нагрузку, связанную с разными паттернами работы клиентов.

Сейчас мы кэшируем до 50 сообщений. Почему не 2-3? Дело в том, что некоторые клиенты сначала запрашивают структуру письма, а потом тело, причем сразу для нескольких сообщений; максимальное число писем в такой «пачке» обычно составляет 50 штук.

3. Оптимальная отдача частей письма

Часто клиенты просят лишь текстовые части письма, которые могут находиться в конце самого сообщения. Для отображения сниппетов клиенты могут просить текстовые части сразу у 50-200 писем. Читать весь файл сообщения целиком (и обрабатывать 10 МБ письма для того, чтобы отдать 10 КБ текста) при этом не хочется; использовать индекс для определения позиции части внутри файла при каждом запросе также было бы накладно. В этой ситуации также спасает кэш структуры письма.
Преимущества такого подхода особенно наглядны тогда, когда клиент подгружает сниппеты для нескольких десятков писем: если бы мы не использовали кэш структуры, то для этого приходилось бы просмотреть много мегабайт и пожертвовать скоростью.

Для экономии места в наших хранилищах base64-части хранятся в декодированном виде внутри письма: при работе с веб-почтой это позволяет отдавать аттачи без лишнего перекодирования. Нужно было сделать схему отдачи частей с учетом этого перекодирования. Мы написали потоковое перекодирование на IMAP-сервере. Здесь также помог кэш — благодаря ему мы без перечитывания структуры можем понять, в каком виде (бинарном или нет) хранится тот или иной фрагмент.

4. Особенности работы некоторых клиентов

Некоторые клиенты не полностью соответствуют стандарту RFC: например, стандартные клиенты Android версий 2.2 — 2.3 не могут корректно отображать письма без возврата некоторых необязательных полей. Основная трудность заключалась в том, чтобы определить, какие именно поля каждый из таких клиентов считает для себя обязательными: приходилось решать это методом перебора.

Выше уже упоминалось о том, что у клиентов могут быть различные подходы к удалению писем: одни перемещают их в корзину, другие — удаляют сразу и безвозвратно. При этом некоторые клиенты не понимают стандартное расширение XLIST, которое мы поддерживаем, позволяющее определить, какая именно папка является корзиной. Вместо этого они используют в качестве корзины свою папку (так себя ведет, например, Sparrow).

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

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

То, что мы вынесли для себя: IMAP — достаточно «развесистая» штука, с множеством исторических особенностей, нажитых за 26 лет, которые умножаются на разнообразие почтовых клиентов. При наших нагрузках это выливается в то, что брать готовое решение и пытаться заточить его под себя нерационально: в лучшем случае объем работы будет таким же, как при самостоятельной разработке решения. Этим путем мы и пошли :)

Что такое код imap_listsubscribed

imap_listsubscribed — список всех подписанных mailbox’ов.

Описание

array imap_listsubscribed (int imap_stream, string ref, string pattern)

Возвращает массив всех mailbox’ов, на которые вы подписались. Почти идентична функции imap_listmailbox() , но возвращает только те mailbox’ы, на которые вы, как текущий пользователь, подписались.


Назад Оглавление Вперёд
imap_listmailbox Вверх imap_mail_compose

Если Вы не нашли что искали, то рекомендую воспользоваться поиском по сайту:

imap_getsubscribed

List all the subscribed mailboxes

Description

Gets information about the subscribed mailboxes.

>imap_getmailboxes , except that it only returns mailboxes that the user is subscribed to.

Parameters

An IMAP stream returned by imap_open .

ref should normally be just the server specification as described in imap_open

Specifies where in the mailbox hierarchy to start searching.

There are two special characters you can pass as part of the pattern : ‘*‘ and ‘%‘. ‘*‘ means to return all mailboxes. If you pass pattern as ‘*‘, you will get a list of the entire mailbox hierarchy. ‘%‘ means to return the current level only. ‘%‘ as the pattern parameter will return only the top level mailboxes; ‘

/mail/%‘ on UW_IMAPD will return every mailbox in the

/mail directory, but none in subfolders of that directory.

Return Values

Returns an array of objects containing mailbox information. Each object has the attributes name , specifying the full name of the mailbox; delimiter , which is the hierarchy delimiter for the part of the hierarchy this mailbox is in; and attributes . Attributes is a bitmask that can be tested against:

  • LATT_NOINFERIORS — This mailbox has no «children» (there are no mailboxes below this one).
  • LATT_NOSELECT — This is only a container, not a mailbox — you cannot open it.
  • LATT_MARKED — This mailbox is marked. Only used by UW-IMAPD.
  • LATT_UNMARKED — This mailbox is not marked. Only used by UW-IMAPD.

Реализация IMAP протокола

11.08.2014, 02:43

Реализация IMAP C#
Помогите с реализацией IMAP на C# с ssl. Нужно установить соединение, получить список сообщений.

Реализация протокола обмена по COM порту
Здравствуйте, в общем нужно было мне реализовать протокол обмена с весами на основе программы.

Реализация протокола pop. При попытке реализовать такие команды, как STAT и LIST программа зависает
Здравствуйте! Пытаюсь создать простого почтового клиента, используя методы класса TcpClient.

IMAP Почтовый клиент
Уважаемые форумчане! Нашёл пример IMAP клиента.

imap удаление почты
делаю IMAP клиент,нужны команды ,инфа про них,а еще лучше с примерами,такие команды как APPEND и т д

11.08.2014, 03:25 2

WinSock — это если на голом Си или С++, то бишь под WinAPI.
А в .NET либо через сокеты из System.Net, либо через готовые библиотеки (основанные на тех сокетах).

Сам вот ищу библиотеку такую
Библиотек вроде немало, вот только что я ни попробую — все ерунда какая-то, ничего толком не работает
ImapX, InterIMAP, ActiveUp.Net.Imap4.
Идеальной пока не нашел, но вот Noix.IMAP вроде хоть куда-то годится.

Вот вам в скомпилированном виде.
Noix.TestIMAP — это тестовая прожка. Вводите туда сервер (скажем imap.yandex.ru), порт (143 обычно, про SSLовский 995-ый я хз, поддерживается или нет — не пробовал), нажимаете Connect.
Ниже вводите ящик и пароль — нажимаете Authentificate.
Еще ниже вводите INBOX, нажимаете Select Folder и затем Fetch.
Видите заголовки 2 писем (вообще он все письма получал, т.е. так

поэтому теперь получает только 2, а то долго очень, их много)
Почему-то только с INBOX у меня получилось. Хотя суть IMAPа и одно из главных преимуществ перед POP3 — это именно поддержка папок.

Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL