0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Подключение к серверу

Подключение к серверу

Пойдем по порядку, а главное, с примерами. Для начала нужно создать соединение с сервером. Для этого воспользуемся библиотекой openSSL.

Отлично, соединение установлено и можно наблюдать ответ OK со строчкой, которая начинается с ответа CAPABILITY

По каждому из CAPABILITY существует удобная шпаргалка, где со ссылками на RFC выписаны все возможные значения CAPABILITY. Например, IMAP4rev1 говорит клиенту о том, что сервер работает по стандарту IMAP4, а IDLE сигнализирует о том, что можно подписаться на изменения, происходящие в ящике.

Авторизация на сервере

После подключения к серверу нужно зайти в свой ящик. Делается это с помощью команды LOGIN

Так, стоп, логин я понимаю а а1 это что такое? — Возможно спросите вы. А это тэг команды. В интересах клиента тэги должны быть разные, так как ответ прилетает с тем же тегом, что и запрос, а значит его можно сопоставить для парсинга между командами. Также сервер может вернуть ответ со звездочкой в начале, как например * OK, это называется untagged response. В основном, такой ответ возвращается для команд, которые ожидают в ответе несколько сущностей, например LIST.

Запрос списка папок

Чтобы запросить список писем в папке нужно сначала эти папки узнать. Делается это командой LIST. Эта команда возвращается список папок на сервере.

Первый параметр в команде — namespace. Если сервер поддерживает namespace, то его значения можно запросить с помощью запроса NAMESPACE. Стандартный namespace выглядит как пустая строка. Далее в дело вступает параметр wildcards. С его помощью мы можем сказать серверу какие папки нам нужно вернуть. Например мы можем получить: ветку дерева папок, только корни, или вообще все, как в примере выше. Лучше так не делать, потому что кто знает сколько у пользователя папок в ящике. Авторы протокола рекомендуют использовать «%» — в таком случае вы получите все папки верхнего уровня из ящика.

Из ответа мы понимаем что это untagged-ответ где каждая строчка — это ваши папки в ящике. Сначала идут флаги, по которым мы читаем метаинформацию папки, например, в примере у всех папок нет потомков и некоторые папки специального назначения (такие как Trash, Junk и др.). Дальше идет символ с разделителем папок. Этот символ используется для вложенных папок. Например для потомка папки Trash имя выглядело бы как «Trash/New Folder». После всех папок сервер вернет нам ОК с тегом, который мы присвоили команде и временем выполнения этой команды.

Выбор папки

Далее по схеме, мы должны выполнить выбор папки, из которой подтянем наши сообщения. Делается это с помощью команды SELECT

При выборе папки возвращается вся информация о ней. Пойдем по порядку.

  • Ответ с флагами, которые разрешены внутри папки для писем.
  • Ответ с флагами который клиент может изменить навсегда
  • Ответ с количеством писем в папке
  • Ответ с количеством recent писем, то есть тех, которые мы получили между выборами папок
  • Ответ с количеством непросмотренных писем

Запрос писем

Теперь самое интересное — запрос писем. Здесь нужно быть крайне осторожным, особенно на мобильных клиентах. Согласитесь, вряд ли захочется при входе в приложение получать тысячи сообщений от сервера к себе в базу. Мало того, нет смысла загружать всё письмо целиком, так как это может быть нецелесообразно для отображения, например, списка всех писем. Допустим, чтобы быстро показать пользователю письма, мы запросим только «конверт». В этом конверте мы хотим увидеть: отправителя, получателя, тему письма и дату отправки. Будем загружать 10 первых сообщений.

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

Читайте так же:
Как отрегулировать кулер на ноутбуке в биосе

Ответ приведу в сокращенном виде:

Понятно, что ничего не понятно. А всё дело в том, что формат конверта диктуется RFC 2822. Его я не буду рассматривать в данной статье. В этом конверте есть вся необходимая информация: дата получения письма, тема письма, отправитель, получатель и даже messageId. Его клиенты используют для отображения цепочки писем.

Итак, мы смогли показать пользователю базовую информацию о письме, а как же тело?
Мы можем сразу скачать всё тело письма, независимо от его размеров, это конечно недолго но тем не менее затратно по сети и памяти. Кстати делается это всё той же командой FETCH

Попробуйте на своих входящих такую команду, и вы поймете что я имел в виду под «затратно», даже с 10 сообщениями мы получаем достаточно объемный ответ с абсолютно всей информацией о письме. Кстати о ней.

Часто ли вы скачивали исходник письма в любом известном вам клиенте, чтобы посмотреть как он выглядит в первозданном виде? Если нет, то давайте распотрошим тестовое письмо. В него я добавил картинку прямо в письмо и картинку как вложение. Сохраним его в формате eml, и затем откроем любым текстовым редактором. В зависимости от клиента, вы получите разные исходники письма, но в целом они будут похожи.

Начнем с заголовка письма:

В заголовке письма описана вся метаинформация, от кого, кому, когда, тип контента письма, тема и приоритет письма. Поле boundary указывает на границу письма.

Дальше поймете, что это значит.

Каждый boundary является обычной границей части письма. Они начинаются с двух дефисов «—». Закрывающая граница имеет эти два дефиса ещё и в конце. Подробнее описано в RFC1341

Это можно назвать основной частью письма, здесь описаны части письма и их MIME-типы.

MIME-тип это медиа тип, который был описан в MIME (Multipurpose Internet Mail Extensions) чтобы описывать типы содержимого внутри email сообщения.

  • multipart/mixed говорит нам о том что письмо имеет смешанную структуру, то есть разные части писем могут быть разными представлениями той или иной информации.
  • multipart/related говорит клиенту, что дальше части будут связаны, и их нельзя показывать отдельно,
  • multipart/alternative говорит о том, что это два разных представления одной сущности, например, либо это text/plain либо text/html, тут уж клиент волен брать нужное представление.

У нас здесь простого текста нет, поэтому логичнее брать html-представление. В этом html-представлении как раз находится картинка, с параметром Content-Disposition: inline, то есть она находится непосредственно в теле письма, а не в приложенных документах.

Ссылка на эту картинку не совсем простая. Она описывается параметром Content-ID, который равен jua-uid-q1nz1guinitrcfd3-1567975257318. Это ссылка на следующую часть письма — картинку, которая закодирована в base-64. Чтобы сэкономить нервы, я не стал включать весь base-64 код

Последняя часть письма имеет вид

у которого уже Content-Disposition не inline, как у изображения выше, а attachment. Это изображение как раз должно пойти в панель вложенных файлов, оно кстати тоже закодировано в base-64 и имеет большой размер. Тут становится ясно что не стоит лишний раз грузить всё тело письма, если мы хотим показать только базовую информацию.

Вернемся к протоколу

После работы над письмами нужно закрыть выбранную папку и попрощаться с сервером. Чтобы закрыть папку, нам нужно ввести команду CLOSE. Да, вот так просто

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

Читайте так же:
Как синхронизировать s planner с google

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

Здесь в ответе нас оповещают о двух удаленных сообщениях, об одном новом и о том, что в данной папке количество сообщений равно 16 472.

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

Ну и под конец закроем сессию с сервером и будем с ним прощаться.

Видим грустный untagged ответ BYE, а значит пора заканчивать работу.

Быстрая синхронизация с CONDSOTORE и QRESYNC

Для слежения за изменениями в ящике в выбранной папке можно использовать операцию NOOP. Но что делать, если мы хотим узнать что изменилось в папке, пока мы работали с другой? Самый очевидный вариант — перебрать все письма в локальном хранилище, будь то кэш или база данных, и сравнить с тем, что вернет сервер. С одной стороны, это действительно решение, и на некоторых серверах оно будет буквально единственно верным. С другой стороны, мы же хотим показывать письма настолько быстро, насколько вообще позволяет протокол. Благо наш сервер поддерживает такие расширения протокола как CONDSTORE и QRESYNC, которые были добавлены в RFC7162. Первый добавляет к сообщению и папке специальное 63-битное число, называемое mod-sequence, которое увеличивается при каждой операции над этим письмом. К папке добавляется самый высокий mod-sequence среди всех сообщений. В итоге при каждом подключении к папке на сервере, который поддерживает CONDSTORE мы легко можем узнать, поменялось что-либо или нет, просто сравнивая значения mod-sequence у локальной и серверной папки.

Кроме этого в этом расширении добавляются дополнительные параметры для команды STORE и FETCH — CHANGEDSINCE mod-sequence и UNCHANGEDSINCE mod-sequence, которые позволяют выполнять операцию если mod-sequence переданных сообщений больше и меньше данного соответственно. Посмотрим на примере.

Я сэмулировал ситуацию, при которой мы заходим в ящик и ничего о нём до этого не знали, то есть наш локальный mod-sequence равен 0. Как видите сервер возвращает нам вообще все сообщения которые есть в ящике, так как до этого мы не получали ничего, и ничего не знаем о ящике. В ответ на запрос UID писем с CHANGEDSINCE приходит также и untagged-ответ OK c HIGHESTMODESEQ который мы сейчас сохраним, и для каждого сообщения свой MODSEQ

Проведем какие-нибудь операции с ящиком: добавим новые письма, поменяем флаги. Сделаем новый запрос но уже с предыдущим mod-sequence

и мы уже видим разницу, вместо вывода 20 старых и новых сообщеий которые только пришли (звездочка в 17221:* означает взять письма с номера 17221 до максимально возможного) нам приходят письма, чьи MODSEQ больше чем предыдущий указанный. Это достаточно хорошо помогает синхронизировать папку, в которой мы какое то время не были и получать как бы слепок измененных писем, вместо перебора всех возможных.

Казалось бы, куда ещё лучше? Но QRESYNC делает операцию синхронизации ещё быстрее, он позволяет указывать параметры MODSEQ и известные нам UID сообщений прямо во время выбора папки. Давайте объясню на примере. Для начала QRESYNC нужно включить коммандой ENABLE

так как мы ничего не знали о папке до этого, сервер нам возвращает только информацию о папке, без слепка её изменений. Допустим мы спросили первые двадцать сообщений и запомнили их UID а также HIGHESTMODESEQ. Выходим из папки, отправляем себе сообщение, удаляем сообщение, меняем флаги и возвращаемся с прошлой информацией о папке

И вот уже при выборе измененной папки мы сразу же получаем слепок изменений, в виде ответа VANISHED (EARLIER) для сообщений, которые были удалены, и FETCH для сообщений, которые были добавлены или изменены. Теперь стало ещё проще синхронизировать папку, если пользователь давно в неё не заходил. Это очень крутой способ, если у вас локально в кэше хранится кучу сообщений, и вы не хотите сверять их с сообщениями на сервере.

Читайте так же:
Как синхронизировать смарт тв с компьютером через wifi

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

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

Заключение

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

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

Как заставить Thunderbird перезагрузить структуру папок IMAP

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

Это не относится к Gmail. Когда я создаю новую папку IMAP на моем собственном сервере, результат будет таким же.

Прояснить. Вот что я делаю. Во-первых, я создаю новый ярлык в Gmail: введите описание изображения здесь>> </p> <p> Но теперь он не появится в моем дереве папок Thunderbird. Хотя он знает о папке и подписался на: <img src tagsthunderbird imap

9 ответов

В версии 10.0.2 (текущий) и последние версии:

Нажмите на строку учетной записи в дереве папок (строка, расположенная над папкой «Входящие»)

Вы должны получить экран настроек, найти подменю «Управление папками» и нажать на него

  1. Нажмите кнопку «Обновить»
  2. Закройте окно списка папок
  3. Нажмите маленький треугольник на верхнем уровне учетной записи в дереве папок, чтобы скрыть список папок
  4. Нажмите его еще раз, чтобы отобразить список папок

Я только что подтвердил, что это работает для меня в 10.0.2

Я думаю, что на этом сайте вы можете найти более полезную информацию о Gmail x Thunderbird. Кроме того, я узнал на другом форуме следующее:

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

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

(В некоторой степени) удивительно, что в 2015 году с Thunderbird 38.2.0, заставляя Thunderbird обновлять дерево папок IMAP после добавления нового каталога /папки, по-прежнему необходимо.

Я поражен тем, что ответ точно так же описал Рэнди Оррисон, и Оливер Зальцбург подтвердил выше, более 3,5 лет назад: Как заставить Thunderbird перезагрузить структуру папок IMAP

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

Я ушел и перезапустил Thunderbird, дважды проверял, что я подписался на соответствующую папку IMAP, подписался /отменил подписку, вышел и снова перезапустился . ничего не заставило новый каталог отображаться — пока я не закрутился — и поверните вниз стрелку вниз слева от папки «Входящие» (на панели панели папок). Как только я это сделал, появился новый каталог!

Читайте так же:
Как синхронизировать keepass на компьютере и андроиде

Любопытно отметить, что новый каталог IMAP был «двумя уровнями глубины». Структура была Inbox -> Subdirectory 1 -> Subdirectory 2 , где Subdirectory 2 представляет только что добавленный каталог IMAP. Я упоминаю об этом в основном, чтобы утверждать, что глубина директории, «стрелка которой закручена», кажется, не имеет значения, если закрученный каталог является родителем каталога, который не появится. Возможно, поворот стрелки верхнего уровня рядом с именем учетной записи является лучшим вариантом, так как предположительно это заставит все подкаталоги отображаться (я этого не пытался).

Спасибо всем, кто внес свой вклад в решение этой самой расстраивающей проблемы! Полный кредит Рэнди Оррисону за оригинальное решение.

Кто играет за открытие отчета об ошибке (или цитируя существующий отчет)?

Imap папка общего почтового ящика-плохая команда, полученная в недопустимом состоянии

Используя JavaMail, у меня возникают проблемы с обновлением папки imap общего почтового ящика или просто перечислением всех папок общего почтового ящика.
(Обновление папки основного счета-это не проблема)

Почтовый провайдер: office365

A: получить список папок

B: обновление конкретной папки

Если я получаю все папки a) или обновляю любую папку B, я получаю это исключение:

2 ответа

  • IMAP идентификатор почтового ящика

Я пишу сценарий, который извлекает все электронные письма с адреса электронной почты через IMAP. В настоящее время я извлекаю каждую папку (почтовый ящик) и сохраняю самый высокий (извлеченный) UID из каждой папки, поэтому при следующей синхронизации я начинаю извлекать самый высокий UID+1. Но.

У меня есть код, который запускает подпрограмму Items_ItemAdd, когда приходят электронные письма. Он отлично работает для моего личного почтового ящика email. Вот код, который я использую, он написан в модуле Outlook по умолчанию под названием ThisOutlookSession : Option Explicit Public WithEvents.

Я начал получать это сообщение прошлой ночью от моего соединения imap с office365.

Прочитав это , я смог исправить это, добавив это в свои свойства подключения:

(Это в scala, конечно, в java вам понадобится точка с запятой. )

Время для этого интересное. До сегодняшнего дня все работало нормально и без этого. Microsoft, должно быть, что-то сделала с их реализацией SSL. Есть шанс, что они используют openssl? 🙂

После нескольких часов поиска и тестирования различных комбинаций имен пользователей для меня сработало следующее:

Хитрость заключалась не в том, чтобы взять alias , показанный в панели администратора outlook.office365.com, а в том, чтобы взять имя пользователя (может быть UserPrincipalName UPN ) из панели администратора portal.office.com . Также используя косую черту вперед.

Окончательное имя входа в формате: user/shared-mailbox-user-name

Пример:

домен: example.com
пользователь: user@example.com
пароль: abcdefg
общий почтовый ящик: info@example.com
shared-mailbox-user-name / UPN: G1234567890123456789@example.com

Обновление

Office365 admin позволяет нам теперь обновить user-name UPN , чтобы мы могли использовать сам общий почтовый ящик. Тогда это выглядело бы так

Похожие вопросы:

Я хотел бы синхронизировать почтовый ящик IMAP с одного сервера на другой в режиме реального времени. В настоящее время я использую программное обеспечение imapsync, которое использует (метод pull).

во-первых, извините за мой английский (я из Испании) Я пытаюсь подключиться к почтовому серверу Exchange 2010 с IMAP и SSL из Javamail внутри сервера Weblogic 8.1. Это мой код Properties prop = new.

Как получить основные тексты всех сообщений электронной почты из определенного почтового ящика IMAP в Delphi ? Например, из почтового ящика INBOX ?

Я пишу сценарий, который извлекает все электронные письма с адреса электронной почты через IMAP. В настоящее время я извлекаю каждую папку (почтовый ящик) и сохраняю самый высокий (извлеченный) UID.

У меня есть код, который запускает подпрограмму Items_ItemAdd, когда приходят электронные письма. Он отлично работает для моего личного почтового ящика email. Вот код, который я использую, он.

Читайте так же:
Синхронизация часов с яндекс

Я использую эту библиотеку PHP для IMAP соединений. Как получить полный размер почтового ящика с помощью IMAP? Я попробовал этот код, но он возвращает только размер папки Входящие .

Я пытаюсь извлечь электронные письма из группового/общего почтового ящика в Outlook, используя приведенный ниже код в Excel. olObjNs.GetSharedDefaultFolder(olShareName, olFolderInbox) Используя это.

Я работаю над надстройкой Outlook, которая будет извлекать список предопределенных категорий из общего почтового ящика. Затем пользователь назначает каждому email из общего почтового ящика эти.

Я использую пакет laravel imap для установки email для получения почтового ящика. используйте этот установочный пакет https://github.com/Webklex/laravel-imap# , но я не понимаю, как он работает или.

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

Настройка The Bat! для работы с почтой Yandex.ru по протоколу IMAP

Настройка The Bat! для работы с почтой Yandex.ru по протоколу IMAP

Почтовая программа The Bat! Professional позволяет собирать почту с неограниченного количества почтовых ящиков, позволяя управлять почтовой перепиской, хранимой на различных почтовых серверах, из одного клиента The Bat!, установленного на вашем компьютере или ноутбуке.

Преимуществом сбора почты профессиональной редакцией The Bat! является возможность организации доступа к программе посредством двухфакторной аутентификации с использованием аппаратных USB-токенов и смарт-карт, позволяющих в значительной степени обезопасить вас от доступа посторонних лиц к вашей переписке в The Bat!

Для доступа к The Bat! Professional вам понадобится подключить к компьютеру персональный USB-токен или смарт-карту и ввести корректный ПИН-код, а не пароль доступа к почте, который можно подсмотреть или перехватить клавиатурным перехватчиком! Если подключить к компьютеру сторонний USB-токен или карту от других приложений, а не от вашей почтовой программы, либо ввести неверный ПИН-код, то получить доступ не удастся.

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

В предыдущем обзоре был рассмотрен вариант настройки The Bat! Professional для работы с почтовым сервисом Mail.ru. В текущей статье вам будет предложен к рассмотрению вариант настройки профессиональной редакции почтовой программы The Bat! для работы с почтой Yandex.ru.

Первым делом вам понадобится настроить почтовый ящик Яндекса и создать пароль приложения, для чего проделайте следующие шаги:

  • Откройте в настройках Яндекс.Почты раздел «Почтовые программы»
  • Установите галочки напротив «С сервера imap.yandex.ru по протоколу IMAP» и «Пароли приложений и OAuth-токены»
  • Сохраните изменения

Раздел “Почтовые программы” Яндех.Почты

Если вам необходимо, чтобы письма сохранялись некоторое время после их удаления в почтовой программе, поставьте галочку напротив «Отключить автоматическое удаление писем, помеченных в IMAP как удалённые». Но учтите, что они будут безвозвратно удалены из ящика сразу после перезапуска почтовой программы.

  • Далее вам необходимо открыть страницу «Управление аккаунтом»

Открытие страницы "Управление аккаунтом"

  • В разделе «Пароли и авторизация» необходимо выбрать подраздел «Включить пароли приложений»

Включить пароли приложений

  • И подтвердить ваш выбор

Подтверждение включения "Паролей приложения"

  • В том числе авторизовавшись в Яндекс.Почте

Авторизация на Яндекс.Почте

  • Далее создаём новый «Пароль приложения» для нашего The Bat!

Создание нового "Пароля приложения" для The Bat!

  • Выбираем тип приложения как «Почта»

Выбор типа приложения "Почта"

  • Укажите удобное название для пароля, с которым он будет отображаться в списке, Например «The Bat! на удалёнке»

Название для пароля

  • После нажатия кнопки «Создать» пароль отразится в новом окне

Пароль приложения

  • ВАЖНО! Пароль можно увидеть только один раз при его создании. Если пароль будет утерян, то удалите его в списке и создайте новый

Список паролей приложений

На данном этапе настройки на стороне Яндекс.Почты завершены, переходим к созданию нового ящика непосредственно в программе The Bat!

голоса
Рейтинг статьи
Ссылка на основную публикацию
ВсеИнструменты
Adblock
detector