Почта
Описание формата Maildir
Maildir - структура директорий в которой хранятся email сообщения.
Традиционно, email директории где сохраняются email в виде текстовых файлов, называются «mboxes».
Mboxes имеют известные ограничения:
- невозможность одновременного использования разными приложениями,
- только одно приложение может использовать mboxes в конкретный момент
времени
- для одновременного использования несколькими приложениями, необходимо
использовать блокировку файлов: locking
- при использовании блокировки часто возникают проблемы, особенно в случае
сетевых файловых систем, например: nfs, samba и тд
- проблемы с locking могут привести к порче mboxes при одновременном
использовании несколькими приложениями
Спецификация Maildir в отличие от Mboxes:
- позволяет одновременную работу
- не требует использовать механизм locking'а
- приложения могут производить одновременный update в maildir
Содержимое Maildir
«maildir» - структура директорий:
- в Courier создается утилитой maildirmake (maildrop-maildirmake)
- в procmail создается автоматически
- в dovecot создается автоматически
Обычно, «maildir» не требует «group»/«world» привилегий, пока не потребуется чтобы кто-то еще мог читать Вашу почту.
Maildir содержит три поддиректории:
- tmp
- new
- cur
Эти три директории входят в состав «maildir», куда и будет доставляться новая почта. Дополнительные директории/фолдеры с именами, которые начинаются с «.»
- .Drafts
- .Sent
также имееют внутри структуру поддиректорий, аналогичную первичной: - tmp, new, cur + дополнительно, файл нулевой длины maildirfolder, цель которого, информировать агент почтовой доставки о том что он действительно доставляет почту в folder и дополнительную информации, должен или может получить из родительской директории. Нет необходимости в реальной вложенности фолдеров. Фолдеры, такие как .Sent, в реалии, могут не иметь вложенных поддиректорий-фолдеров. Только primary-первичная (main) maildir содержит поддиректории, остальные, могут вместо физической фложенности, использовать логическую вложенность, которая реализуется посредством использования разделетеля «.» Например: фолдер «.Sent.2002» - обозначает subfolder «2002» для subfolder «Sent».
Folder name encoding
Имена фолдеров могуь содержать любой Unicode символ, исключая управляющие:
- US-ASCII characters, U+0x0020 - U+0x007F
- исключение period «.», forward-slash «/» и амперсенд «&» символы
соответственно: «.» = U+0x002E, «/» = U+0x002F, «&» = U+0x0026
- амперсенд представляется двумя символами: «&-»
- «.», «/» и non US-ASCII unicode символы, представляются с использованием
UTF-7 и модифицированным base64-encoding'ом.
Название non US-ASCII фолдера, начинается с символа «&» - это начало модифицированной base64-encoding последовательности и заканчивается символом «-». Последовательность 16-bit Unicode символов, записывется в big-endian order, и кодируется base64-encoding методом (RFC1521 sec.5.2) с использованием следующей модификацией:
- «=» опускается
- «,» используется как разделитель вместо «/»
Пример: the word “Resume” with both «e»s being the e-acute character, U+0x00e9, is encoded as “R&AOk-sum&AOk-” (so a folder of that name would be a maildir subdirectory called “.R&AOk-sum&AOk-”).
ПО которое использует «maildirs» может создавать дополнительные файлы, кроме директорий tmp,new,cur для собственных целей, индексы, списки, логи, зависит от реализации Maildir.
Почтовые сообщения
сохраняются в отдельных файлах, «one mail per one file», каждое письмо в отдельном файле.
- tmp - для временной работы с mail в процессе доставки
- new - содерджит файлы-письма, доставленные, но еще не просмотренные
- cur - содержит письма которые хоть раз были открыты mail applications
Добавление нового сообщения в maildir
Общий формат maildir файла:
«<base filename>:2,<flags>»
При создании имени нового файла для сохранения почты, используется два формата:
- «time.MusecPpid.host»
- «time.MusecPpid_unique.host»
«time» и «usec» - берутся из системного вызова gettimeofday, «pid» - номер ткущего процесса доставки этой почты в maildir «host» - имя хоста где производится доставка
Верхнее из описания Maildir от Courier, Dovecot использует свои дополнительные расширения: - imap uid - постоянный уникальный ID номер для каждого сообщения
dovecot использует dovecot-uidlist файл для сохранения соответствия uid <-> filename, файл базируется на формате Courier IMAP: courierimapuiddb file
# cat dovecot-uidlist 3 V1341751864 N35214 Gd7a85e003402aa5779100000b0808fdd 22215 :1450888146.M18948P72215.joker.jinr.ru,S=2306,W=2359 30270 :1497439134.M837822P41918.joker.jinr.ru,S=40025,W=40935 30285 :1497496598.M121151P77394.joker.jinr.ru,S=7161,W=7263 34220 :1516186098.M483926P75277.joker.jinr.ru,S=3661182,W=3708766 34297 :1516608714.M734791P3232.joker.jinr.ru,S=3027,W=3083 34316 :1516692335.M644598P7722.joker.jinr.ru,S=13970,W=14227 34512 :1517390833.M516761P46296.joker.jinr.ru,S=13816,W=14138 34706 :1518089238.M969474P25018.joker.jinr.ru,S=5893,W=5988 34724 :1518174535.M309472P84653.joker.jinr.ru,S=3501,W=3600 35153 :1519822787.M80161P28033.joker.jinr.ru,S=2713,W=2773 35213 :1519987101.M852881P74418.joker.jinr.ru,S=4644,W=4762 #
файл начинается с заголовка: 3 V1341751864 N35214 Gd7a85e003402aa5779100000b0808fdd
- 3 версия формата используемого Dovecot v1.1+
- 1341751864 IMAP UIDVALIDITY
- 35214 UID который будет присвоен следующему сообщению-файлу
- d7a85e003402aa5779100000b0808fdd 128'bitный mailbox global UID hex
- возможны другие поля, порядок которых неважен
V1 - совместима с Courier V2 - была использована несколькими non-release версиями
вслед за заголовком следует список мапирования UID ↔ имена файлов 22215 :1450888146.M18948P72215.joker.jinr.ru,S=2306,W=2359 30270 :1497439134.M837822P41918.joker.jinr.ru,S=40025,W=40935
- 22215,30270 - UID сообщений-писем
- S=2306 и S=40025 - размеры файлов
- W=2359 и W=40935 - размеры файлов +CR+LF
- ,S=<size>: указывает размер файла (имя файла содержит размер который
полезен для Maildir++ quota
- ,W=<vsize>: указывает размер файла по RFC822.SIZE, размер файла с CR+LF,
если письмо сохранено с CR+LF, <size> == <vsize>
Использование timestamp в именах файлов
Вернемся к формату имени файла maildir:
«<base filename>:2,<flags>»
Как уже было сказано, <base filename> состоит из timestamp, имени хоста и флагов:
# ls -la cur -rw-r–r– 1 lavr 1000 2306 Dec 23 2007 1450888146.M18948P72215.joker.jinr.ru,S=2306,W=2359:2,RS -rw-r–r– 1 lavr 1000 40025 Jun 14 2007 1497439134.M837822P41918.joker.jinr.ru,S=40025,W=40935:2,S -rw-r–r– 1 lavr 1000 7161 Jun 15 2007 1497496598.M121151P77394.joker.jinr.ru,S=7161,W=7263:2,S -rw-r–r– 1 lavr 1000 3661182 Jan 17 13:48 1516186098.M483926P75277.joker.jinr.ru,S=3661182,W=3708766:2,RS … где: 1450888146.M18948P72215.joker.jinr.ru,S=2306,W=2359:2,RS
- unix timestamp | - размер |
---|
* :2 - новое, если состояние отсутствует, значит: not seen/replied/marked/deleted состояние:
- «D» - черновое «draft»
- «R» - «reply»
- «S» - «seen» просмотрено
- «T» - «trashed» помечено на удаление
- «F» - помечено пользователем
Использование «timestamps»:
- mtime используется как «IMAP INTERNALDATE» по RFC 3501 сек. 2.3.3
и не должно изменяться в соответствии с сек.2.3.1.1.4
- ctime используется DOvceot для внутренних нужд «save/copy date», за
исключением корректного значения в «dovecot.index.cache». Используется
внешними командами, например: 'doveadm expunge savedbefore'
В директориях «cur» и «new», в качестве timestamp используется:
- mtime - для определения изменений mailbox и регенерации индексных
файлов
Структура директорий.
По умолчанию, Dovecot использует свой Maildir++ формат, это означает что все фолдеры находятся внутри директории ~/Maildir:
Описание формата Maildir++ http://www.courier-mta.org/imap/README.maildirquota.html
Основным достижением Maildir++, является реализация maildirquota, однако при этом, считается что лучшей реализацией квот для почтовых ящиков, будет квотирование на уровне файловой системы и использование квот для каждого пользователся системными средствами.
И тем не менее, для формата Maildir имеется собственная реализация квотирования, которая не зависит от квот на уровне файловой системы. Важным условием для использования maildirquota является хранение почты в формате maildir в домашней директории пользователя, другим ньюансом, является использование квот для пользователей виртуального домена, когда для доступа к почте пользователей виртуального домена используется один специальный идентификатор пользователя.
http://www.courier-mta.org/maildir.html - спецификация http://www.courier-mta.org/imap/README.maildirquota.html https://wiki.dovecot.org/Quota/Maildir