Формат электронной почты Maildir - это распространенный способ хранения сообщений электронной почты, в котором каждое сообщение хранится в отдельном файле с уникальным именем, а каждая почтовая папка является каталогом файловой системы. Локальная файловая система обрабатывает блокировку файлов при добавлении, перемещении и удалении сообщений. Основная цель разработки Maildir - устранить необходимость в программном коде для обработки блокировки и разблокировки файлов.
Внутренняя структура Maildir каталог (часто называют Maildir
), как правило, имеет три подкаталога с именем tmp
, new
и cur
.
В tmp
подкаталоге временно хранятся сообщения электронной почты, которые находятся в процессе доставки. В этом подкаталоге также могут храниться другие типы временных файлов. В new
подкаталоге хранятся сообщения, которые были доставлены, но еще не были просмотрены каким-либо почтовым приложением. В cur
подкаталоге хранятся сообщения, которые уже были просмотрены почтовыми приложениями.
Сэм Варшавчик, автор Courier Mail Server и другого программного обеспечения, написал расширение для формата Maildir под названием Maildir ++ для поддержки подпапок и почтовых квот. Каталоги Maildir ++ содержат подкаталоги с именами, начинающимися с символа '.' (точка), которые также являются папками Maildir ++. Это расширение не является нарушением спецификации Maildir, которая явно предусматривает возможность добавлять в maildir больше, чем tmp, new, cur.
Программа, которая обеспечивает сообщение по электронной почте, на агент доставки почты, записывает его в файл в tmp
каталоге с уникальным именем. Примерно в 1995 г. алгоритм, рекомендованный qmail для генерации уникальных имен файлов, заключался в объединении, разделенных символом точки, текущего времени Unix, идентификатора текущего процесса (PID) и текущего имени хоста ; проверьте, существует ли это имя файла (используя stat()
); и, если имя файла существует, отложите доставку на две секунды, а затем повторите попытку. (Этот алгоритм подвергся критике в 2006 году Тимо Сирайненом, создателем Dovecot. ) К 2000 году было рекомендовано добавлять к PID значение счетчика каждого процесса, значение которого должно увеличиваться после каждой доставки; и предложение об ограничении скорости было снято. К 2003 году в рекомендации были внесены дополнительные поправки, согласно которым вместо PID и счетчика должна создаваться средняя часть имени файла путем «конкатенации достаточного количества следующих строк, чтобы гарантировать уникальность» даже в условиях нескольких одновременных доставок на адрес. тот же maildir из одного или нескольких процессов:
По состоянию на ноябрь 2018 года автор qmail Бернштейн не вносил дальнейших изменений в рекомендации по созданию файлов. В современных системах POSIX временные файлы можно безопасно создавать с помощью mkstemp
функции библиотеки C.
Процесс доставки сохраняет сообщение в maildir, создавая и записывая этот файл, а затем перемещая его в. Перемещение может быть выполнено с помощью переименования, которое во многих системах является атомарным. В качестве альтернативы это можно сделать, жестко связав файл с файлом, а затем отключив его. Любой оставшийся файл в конечном итоге будет удален. Эта последовательность гарантирует, что программа, читающая maildir, не увидит частично написанное сообщение. Одновременно может быть несколько программ, читающих maildir. Они варьируются от почтовых пользовательских агентов (MUA), которые обращаются к файловой системе сервера напрямую через протокол доступа к сообщениям Интернета или серверы протокола почтового отделения, действующие от имени удаленных MUA, до таких утилит, как biff и rsync, которые могут знать или не знать о них. структура maildir. Читатели никогда не должны заглядывать внутрь. tmp/uniquefilename
new/uniquefilename
new
tmp
tmp
Когда осведомленный процесс чтения maildir ( POP- или IMAP- сервер или почтовый пользовательский агент, действующий локально) находит сообщения в new
каталоге, он должен их переместить cur
. Это просто средство уведомить пользователя «у вас X новых сообщений». Это перемещение должно выполняться с использованием rename()
, так как метод неатомарной ссылки и разрыва связи может привести к дублированию сообщений. На этом этапе к именам файлов добавляется информационный суффикс. Он состоит из двоеточия (чтобы отделить уникальную часть имени файла от фактической информации), «2», запятой и различных флагов. «2» указывает версию информации, которая следует за запятой. «2» - единственная официально указанная в настоящее время версия, «1» - экспериментальная версия. Спецификация определяет флаги, которые показывают, было ли сообщение прочитано, удалено и т. Д.: Начальная (заглавная) буква «Пропущено», «Ответлено», «Просмотрено», «Удалено», «Черновик» и «Помечено». Dovecot использует строчные буквы для соответствия 26 ключевым словам IMAP, которые могут включать стандартные ключевые слова, такие как $ MDNSent, и пользовательские флаги.
Хотя Maildir был предназначен для использования без блокировки, на практике некоторые программы, использующие Maildirs, также используют блокировки, например Dovecot.
Стандарт Maildir может быть реализован только в системах, которые принимают двоеточия в именах файлов.
Системы, в которых не допускается использование двоеточий в именах файлов (включая Microsoft Windows и некоторые конфигурации Novell Storage Services ), могут использовать альтернативный разделитель, например ";" или же "-". Часто бывает тривиально исправить бесплатное программное обеспечение с открытым исходным кодом, чтобы использовать другой разделитель.
Поскольку в настоящее время нет соглашения о том, каким должен быть этот альтернативный разделитель, могут возникнуть трудности взаимодействия между различными программами, поддерживающими Maildir, в этих системах. Однако не все программное обеспечение, связанное с Maildir, должно знать, что такое символ-разделитель, потому что не все программное обеспечение, связанное с Maildir, должно иметь возможность читать или изменять флаги сообщения («читать», «отвечать на» и т. Д.); Программное обеспечение, которое просто доставляет в Maildir или архивирует старые сообщения только по дате, должно работать независимо от того, какой разделитель используется. Если только MUA необходимо читать или изменять флаги сообщений и используется только один, то можно использовать нестандартные альтернативные разделители без проблем совместимости.