Maildir - Maildir

В Maildir Эл. почта формат - это распространенный способ хранения Эл. адрес сообщения, в которых каждое сообщение хранится в отдельном файл с уникальным именем, а каждая почтовая папка является каталогом файловой системы. Местный файловая система ручки блокировка файлов по мере добавления, перемещения и удаления сообщений. Основная цель разработки Maildir - устранить необходимость в программном коде для обработки блокировка файлов и разблокировка.[1]

Внутренняя структура

Характеристики

Maildir каталог (часто называют Maildir) обычно имеет три подкаталога с именем tmp, новый, и дворняга.

В tmp в подкаталоге временно хранятся сообщения электронной почты, которые находятся в процессе доставки. В этом подкаталоге также могут храниться другие типы временных файлов. В новый в подкаталоге хранятся сообщения, которые были доставлены, но еще не были просмотрены каким-либо почтовым приложением. В дворняга в подкаталоге хранятся сообщения, которые уже были просмотрены почтовыми приложениями.[2]

Maildir ++

Сам Варшавчик, автор Курьерский почтовый сервер и другое программное обеспечение, написал расширение[2][3] в формат Maildir, называемый Maildir ++ для поддержки подпапок и почтовых квот. Каталоги Maildir ++ содержат подкаталоги с именами, начинающимися с символа '.' (точка), которые также являются папками Maildir ++. Это расширение не является нарушением спецификации Maildir, которая явно предусматривает возможность добавлять в maildir больше, чем tmp, new, cur.

Техническая эксплуатация

В программа который доставляет сообщение электронной почты, агент доставки почты, записывает его в файл в tmp каталог с уникальным именем файла.[4][5][2] Примерно в 1995 г. алгоритм, рекомендованный qmail для создания уникальных имен файлов нужно было объединить, разделив их характер периода, электрический ток Время Unix, электрический ток идентификатор процесса (PID), а текущий имя хоста; проверьте, существует ли это имя файла (используя stat () ); и, если имя файла существует, отложите доставку на две секунды, а затем повторите попытку.[1] (Этот алгоритм подвергся критике в 2006 г. Тимо Сирайнен, создатель Dovecot.[6]) К 2000 г. было рекомендовано добавлять к PID значение счетчика каждого процесса, значение которого должно увеличиваться после каждой доставки; и предложение об ограничении скорости было снято.[4] К 2003 году в рекомендации были внесены дополнительные поправки, согласно которым вместо PID и счетчика должна создаваться средняя часть имени файла путем «конкатенации достаточного количества следующих строк, чтобы гарантировать уникальность» даже в условиях множественных одновременных доставок на адрес тот же maildir из одного или нескольких процессов:[7]

  • #п, где п является (в шестнадцатеричном формате) выводом системного вызова unix_sequencenumber () операционной системы[нужна цитата ], который возвращает число, которое увеличивается на 1 каждый раз при вызове, начиная с 0 после перезагрузки.
  • Иксп, где п является (в шестнадцатеричном формате) выводом системного вызова unix_bootnumber () операционной системы[нужна цитата ], который сообщает, сколько раз система была загружена. Вместе с # это гарантирует уникальность; к сожалению, большинство операционных систем не поддерживают unix_sequencenumber () и unix_bootnumber.
  • рп, где п является (в шестнадцатеричном формате) выводом системного вызова unix_cryptorandomnumber () операционной системы[нужна цитата ]или аналогичный источник, например / dev / urandom. К сожалению, некоторые операционные системы не включают криптографические генераторы случайных чисел.
  • яп, где п - это (в шестнадцатеричном формате) номер inode UNIX этого файла. К сожалению, номера inode не всегда доступны через NFS.
  • Vп, где п - это (в шестнадцатеричном формате) номер устройства UNIX этого файла. К сожалению, номера устройств не всегда доступны через NFS. (Номера устройств также бесполезны со стандартной файловой системой UNIX: maildir должен находиться на одном устройстве UNIX для работы link () и rename ().)
  • Mп, где п представляет собой (в десятичном формате) счетчик микросекунд из того же метода gettimeofday (), который используется для левой части уникального имени.
  • пп, где п - это (в десятичном формате) идентификатор процесса.
  • Qп, где п - это (в десятичном формате) количество доставок, выполненных этим процессом.

По состоянию на ноябрь 2018 г.[требуется разъяснение ] не внес никаких дальнейших изменений в эти рекомендации по созданию файлов.[8]

Процесс доставки сохраняет сообщение в maildir, создавая и записывая в tmp /уникальное имя файла, а затем переместите этот файл в новый /уникальное имя файла. Перемещение может быть выполнено с помощью переименовать, который является атомарным во многих системах.[9] В качестве альтернативы это можно сделать, жестко связав файл с новый а затем отключите файл от tmp. Любой оставшийся файл со временем будет удален. Эта последовательность гарантирует, что программа, читающая maildir, не увидит частично написанное сообщение. Одновременно может быть несколько программ, читающих maildir. Они варьируются от почтовые пользовательские агенты (MUA), которые обращаются к файловой системе сервера напрямую через Протокол доступа к Интернет-сообщениям или Почтовый протокол серверы, действующие от имени удаленных MUA, таким утилитам, как biff и rsync, который может знать или не знать о структуре maildir. Читатели никогда не должны заглядывать tmp.

Когда осознанный процесс чтения maildir (либо Поп или IMAP сервер или почтовый пользовательский агент, действующий локально) находит сообщения в новый каталог это должен переместить их в дворняга. Это просто способ уведомить пользователя «у вас X новых сообщений».[10] Это перемещение необходимо выполнить с помощью переименовать (), как неатомный связать, затем отменить связь метод может привести к дублированию сообщений. На этом этапе к именам файлов добавляется информационный суффикс. Он состоит из двоеточие (чтобы отделить уникальную часть имени файла от фактической информации), '2', запятая и различные флаги. «2» указывает версию информации, которая следует за запятой. «2» - единственная официально указанная версия, а «1» - экспериментальная версия. Спецификация определяет флаги, которые показывают, было ли сообщение прочитано, удалено и т. Д.: Начальная (заглавная) буква «Пропущено», «Ответлено», «Просмотрено», «Удалено», «Черновик» и «Помечено».[7] Dovecot использует строчные буквы для соответствия 26 ключевым словам IMAP,[5] который может включать стандартные ключевые слова, например $MDNSent, и пользовательские флаги.

Хотя Maildir был предназначен для использования без блокировки, на практике некоторые программы, использующие Maildirs, также используют блокировки, например Dovecot.[11]

Проблемы совместимости файловой системы

Стандарт Maildir может быть реализован только в системах, которые принимают двоеточия в именах файлов.

Системы, в которых не допускается использование двоеточий в именах файлов (включая Майкрософт Виндоус и некоторые конфигурации Novell Storage Services.) можно использовать альтернативный разделитель, например ";" или "-". Патчить часто бывает тривиально бесплатное программное обеспечение с открытым исходным кодом использовать другой разделитель.[12]

Поскольку в настоящее время нет соглашения о том, каким должен быть этот альтернативный разделитель, могут возникнуть трудности взаимодействия между различными программами, поддерживающими Maildir, в этих системах. Однако не все программное обеспечение, связанное с Maildir, должно знать, что такое символ-разделитель, потому что не все программное обеспечение, связанное с Maildir, должно иметь возможность читать или изменять флаги сообщения («читать», «отвечать на» и т. Д.); Программное обеспечение, которое просто доставляет в Maildir или архивирует старые сообщения только по дате, должно работать независимо от того, какой разделитель используется. Если бы только MUA необходимо читать или изменять флаги сообщений, и используется только один, тогда можно использовать нестандартные альтернативные разделители без проблем совместимости.

Программное обеспечение, которое напрямую поддерживает Maildir

Почтовые серверы

Агенты по доставке

Читатели почты

Примечания и ссылки

  1. ^ а б Бернштейн, Дэниел Дж. (1995). "майлдир (5)". Архивировано из оригинал на 1997-10-12. Получено 2018-11-23.
  2. ^ а б c Сам Варшавчик (2009). "майлдир". Получено 24 июля 2016.
  3. ^ Сам Варшавчик (2011). "Maildir ++". Получено 24 июля 2016.
  4. ^ а б Бернштейн., Дэниел Дж. (ок. 2000 г.) [Впервые опубликовано в 2000 г. или ранее]. "Использование формата maildir". В архиве из оригинала от 02.09.2000. Получено 2018-11-23.
  5. ^ а б Dovecot Wiki: формат maildir
  6. ^ Сирайнен, Тимо (2006-12-05). "Diff for" MailboxFormat / Maildir'". Получено 2018-11-23. Вся эта неприятность бессмысленна. Только первый шаг - это то, что действительно гарантирует, что письма не будут перезаписаны, остальное просто звучит хорошо. Несмотря на то, что они могут время от времени обнаруживать проблему, они не обеспечивают гарантированной защиты и так же легко будут передавать повторяющиеся имена файлов для перезаписи существующих писем. Шаг 2 бесполезен, потому что между шагами 2 и 3 существует состояние гонки. Сама по себе комбинация PID / хост уже должна гарантировать, что он никогда не найдет такой файл. Если это так, что-то сломалось, и проверка stat () не поможет, поскольку другой процесс может делать то же самое в то же время, и вы в конечном итоге записываете в тот же файл в tmp /, вызывая повреждение почты. На шаге 4 ссылка () также не сработает, если идентичный файл уже был в maildir, верно? Неправильно. Возможно, файл уже был перемещен в каталог cur /, и, поскольку он может содержать любое количество флагов, вы больше не сможете проверить с помощью простого stat (), существует он или нет. Итак, на самом деле, все, что важно для предотвращения перезаписи писем в вашем maildir, - это шаг 1. Всегда создавайте имена файлов, которые гарантированно будут уникальными. Забудьте о двухсекундном ожидании и о том, что на странице руководства Qmail говорится о
  7. ^ а б Бернштейн., Дэниел Дж. (2003) [Самая ранняя версия этого документа была впервые опубликована в 2000 году или ранее]. "Использование формата maildir". В архиве из оригинала от 01.04.2003. Получено 2018-11-23.
  8. ^ "Снимки cr.yp.to/proto/maildir.html Wayback Machine". Интернет-архив. 2018. Получено 2018-11-23.
  9. ^ "переименовать". Открытая группа. 2013. Получено 23 июля 2016. Эта спецификация требует, чтобы действие функции было атомарным.
  10. ^ Сам Варшавчик (25 июля 2016). «Управление майлдирскими структурами». курьеры-пользователи (Список рассылки). Получено 26 июля 2016.
  11. ^ Сирайнен, Тимо (2006-12-05). "Diff for" MailboxFormat / Maildir'". Получено 2018-11-23.
  12. ^ Поддержка mutt maildir: обходной путь для файловых систем, которые не принимают двоеточия
  13. ^ "aerc - лучшая в мире домашняя страница почтового клиента". aerc-mail.org.
  14. ^ "Домашняя страница почтовой системы Notmuch". notmuchmail.org. Получено 2019-06-22.

Смотрите также

внешние ссылки