Jump to content

Почта

Формат Maildir электронной почты — это распространенный способ хранения электронной почты сообщений в файловой системе , а не в базе данных. Каждому сообщению присваивается файл с уникальным именем, а каждая почтовая папка представляет собой каталог файловой системы, содержащий эти файлы. Maildir был разработан Дэниелом Дж. Бернстайном примерно в 1995 году с основной целью устранить необходимость в программном коде для обработки блокировки и разблокировки файлов за счет использования локальной файловой системы. [1] Дизайн Maildir отражает тот факт, что единственные операции, допустимые для сообщения электронной почты, — это его создание, удаление или каким-либо образом изменение его статуса.

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

Технические характеристики

[ редактировать ]

Maildir Каталог (часто называемый Maildir) обычно имеет три подкаталога с именами tmp, new, и cur. [2]

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

Почтовый каталог++

[ редактировать ]

Сэм Варшавчик, автор Courier Mail Server и другого программного обеспечения, определил Maildir++. расширение [3] [4] в формат Maildir для поддержки подпапок и почтовых квот. Каталоги Maildir++ содержат подкаталоги, имена которых начинаются с «.». (точка), которые также являются папками Maildir++. Расширение соответствует исходной спецификации Maildir, которая позволяет использовать подкаталоги в дополнение к tmp , new и cur .

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

[ редактировать ]

Агент доставки почты — это программа , которая доставляет сообщение электронной почты в Maildir. Агент доставки почты создает новый файл с уникальным именем в папке tmp каталог. [5] [6] [3] Во время его изобретения эффективно гарантировать уникальность имен файлов было сложно. Оригинальный qmail [1] алгоритм для уникальных имен был:

  1. прочитать текущее время Unix
  2. прочитать текущий идентификатор процесса (PID)
  3. прочитать текущее имя хоста
  4. объединить три вышеуказанных значения в строку, разделенную символом точки ; это новое имя файла
  5. если stat() сообщает, что имя файла существует, затем подождите две секунды
  6. переходить к предыдущему шагу до тех пор, пока имя файла не перестанет существовать
  7. создайте файл с уникальным именем и запишите содержимое сообщения в новый файл

К 2000 году автор qmail рекомендовал в обновленной спецификации [5] чтобы добавить значение счетчика каждого процесса к PID, значение которого должно увеличиваться после каждой доставки. Ограничивающая скорость рекомендация «подождать две секунды» была отменена.

К 2003 году в рекомендации были внесены дальнейшие поправки, требующие, чтобы вместо PID и счетчика средняя часть имени файла создавалась путем «объединения достаточного количества следующих строк, чтобы гарантировать уникальность» даже в условиях нескольких одновременных доставок в файл. один и тот же почтовый каталог из одного или нескольких процессов: [7]

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

Этот алгоритм 2003 года подвергся критике [8] , назвал его излишне сложным в 2006 году Тимо Сирайнен , создатель Dovecot .

По состоянию на ноябрь 2023 года автор qmail Дэниел Бернштейн не внес дальнейших изменений в рекомендации по созданию имен файлов 2003 года. [9] В современных системах POSIX временные файлы можно безопасно создавать с помощью команды mkstemp Функция библиотеки C.

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

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

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

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

[ редактировать ]

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

Системы, которые не допускают двоеточия в именах файлов (включая Microsoft Windows и некоторые конфигурации Novell Storage Services ), могут использовать нестандартный альтернативный разделитель, например «;» или "-". Часто бывает просто исправить бесплатное программное обеспечение с открытым исходным кодом, чтобы использовать другой разделитель. [16]

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

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

[ редактировать ]
  • АЭРК [17] (эффективный и расширяемый почтовый клиент)
  • Balsa ранее была официальной программой чтения почты GNOME (до Evolution).
  • Cone — программа для чтения почты на основе проклятий
  • Evolution , официальный почтовый клиент GNOME.
  • GNUMail
  • Отвращение
  • KMail , программа чтения почты KDE.
  • почтаx
  • Матт
  • Немного [18] (быстрая система электронной почты с глобальным поиском и тегами)
  • Сосна/Альпийская
  • Mozilla Thunderbird — экспериментальный и «отключен по умолчанию, поскольку ошибок еще много» [19]

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

[ редактировать ]
  1. ^ Перейти обратно: а б Бернштейн, Дэниел Дж. (1995). "maildir(5)" . Архивировано из оригинала 12 октября 1997 г. Проверено 23 ноября 2018 г.
  2. ^ Блюм, Ричард (2001). Постфикс . Издательство Самс. ISBN  978-0-672-32114-6 .
  3. ^ Перейти обратно: а б с Сэм Варшавчик (2009). "почтовый каталог" . Проверено 24 июля 2016 г.
  4. ^ Сэм Варшавчик (2011). "Майлдир++" . Проверено 24 июля 2016 г.
  5. ^ Перейти обратно: а б Бернштейн, Дэниел Дж. (ок. 2000 г.) [Впервые опубликовано в 2000 г. или ранее]. «Использование формата maildir» . Архивировано из оригинала 2 сентября 2000 г. Проверено 23 ноября 2018 г.
  6. ^ Перейти обратно: а б Dovecot Wiki: формат maildir
  7. ^ Перейти обратно: а б Бернштейн, Дэниел Дж. (2003) [Самая ранняя версия этого документа была впервые опубликована в 2000 году или ранее]. «Использование формата maildir» . Архивировано из оригинала 1 апреля 2003 г. Проверено 23 ноября 2018 г.
  8. ^ Сирайнен, Тимо (5 декабря 2006 г.). «Разница для 'MailboxFormat/Maildir' » . Проверено 23 ноября 2018 г. Все эти хлопоты довольно бессмысленны. Только первый шаг действительно гарантирует, что письма не будут перезаписаны, остальное звучит красиво. Несмотря на то, что они могут время от времени обнаруживать проблему, они не обеспечивают гарантированной защиты и с такой же легкостью пропускают повторяющиеся имена файлов, чтобы перезаписать существующие письма. Шаг 2 бессмысленен, поскольку между шагами 2 и 3 существует состояние гонки. Комбинация PID/хост сама по себе уже должна гарантировать, что такой файл никогда не будет найден. Если да, то что-то сломано, и проверка stat() не поможет, поскольку другой процесс может делать то же самое в то же время, и в конечном итоге вы будете писать в тот же файл в tmp/, что приведет к повреждению почты. На шаге 4 функция link() также не сработает, если идентичный файл уже находится в почтовом каталоге, верно? Неправильный. Возможно, файл уже был перемещен в каталог cur/, и, поскольку к тому времени он может содержать любое количество флагов, вы больше не сможете проверить с помощью простой функции stat(), существует он или нет. Так что на самом деле все, что важно для предотвращения перезаписи писем в вашем почтовом каталоге, — это шаг 1: всегда создавайте имена файлов, которые гарантированно будут уникальными. Забудьте о двухсекундном ожидании и тому подобном, о чем говорится на странице руководства Qmail.
  9. ^ «Снимки файла cr.yp.to/proto/maildir.html Wayback Machine» . Интернет-архив . 2023 . Проверено 23 ноября 2023 г.
  10. ^ «переименовать» . Открытая группа . 2013 . Проверено 23 июля 2016 г. Эта спецификация требует, чтобы действие функции было атомарным.
  11. ^ Сэм Варшавчик (25 июля 2016 г.). «Управление структурами maildir» . пользователи-курьеры (список рассылки) . Проверено 26 июля 2016 г.
  12. ^ «Домашняя страница почтовой системы Notmuch» . notmuchmail.org . Проверено 22 июня 2019 г.
  13. ^ «не так много документации по 0.38.3» . notmuch-config . Проверено 17 апреля 2024 г.
  14. ^ Сирайнен, Тимо (5 декабря 2006 г.). «Разница для 'MailboxFormat/Maildir' » . Проверено 23 ноября 2018 г.
  15. ^ «mailbox — Управление почтовыми ящиками в различных форматах» . Документация Python . Проверено 19 июня 2023 г.
  16. ^ Поддержка mutt maildir: обходной путь для файловых систем, которые не принимают двоеточия.
  17. ^ «aerc — домашняя страница лучшего в мире почтового клиента» . aerc-mail.org .
  18. ^ «Домашняя страница почтовой системы Notmuch» . notmuchmail.org . Проверено 22 июня 2019 г.
  19. ^ «Maildir в Thunderbird» . сайт mozilla.org . Проверено 6 декабря 2020 г.

См. также

[ редактировать ]
[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: fd64bd8d63d9e60d33590c993a5002dd__1719644040
URL1:https://arc.ask3.ru/arc/aa/fd/dd/fd64bd8d63d9e60d33590c993a5002dd.html
Заголовок, (Title) документа по адресу, URL1:
Maildir - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)