Дата и время публикации:
Проблемы и решение
1. Суть проблемы
Состоит в различии обоих форматов хранения сообщений электронной почты, а чтобы понять чем они различаются, дадим определение что такое Mailbox и Maildir:
В общем Mailbox и Maildir являются форматами e-mail, которые выступают в качестве директорий для приложений электронной почты. Изначально формат Mailbox относился к оригинальной службе хранения сообщений электронной почты на сервере cPanel, теперь же он использует Maildir в качестве формата по умолчанию. Mailbox складирует все сообщения на серверы в одном и том же файлы, в то время как Maildir хранит сообщения в индивидуальных файлах под уникальными именами [3.1].
Формат Maildir
Представляет собой три поддиректории в одноименной директории Maildir, которая содержит следующие поддиректории с файлами:
- new: все входящие сообщения принятые за небольшой промежуток времени; используется для извещения пользователя, что у него есть новые сообщения; время модификации каждого файла в новой директории являются временем доставки сообщения. Каждое сообщение обычно отвечает формату RFC 822, который начинается со строки "Return-path" и "Delivered-to"
- Cur: теже самые файлы, что и в поддиректории cur, но с одним отличием, что сообщения в них уже не считаются новыми, потому что они были прочитаны пользователем с использованием программ-клиентов электронной почты;
- tmp: временные данные, ассоциирующиеся с директорией расширения файлов Maildir, и используется для обеспечения гарантий надежной доставки сообщения (the reliable delivery of the message).
Формат Mailbox
Более известен под кратким названием Mbox, являющийся типом файла электронной почты, который хранит сообщения в простом текстовом формате(известным более как plain-text) . Содержания всех электронных писем объединяются в форме 7-разрядного ASCII текста и остальной части их компонентов (присоединенные сообщения, метаданные и т. д.), которые храняться в закодированном виде. Таким образом Mbox оперирует с одним единственным форматом файла, в котором сохраняются все сообщения электронных писем в одном и том же файле одной и той же учетной записи, оыбчно называемой inbox.
В таблице 1.1 сведены преимущества и недостатки обоих форматов Mbox и Maildir
Формат хранения сообщений электронных писем | Преимущества | Недостатки |
---|---|---|
Mbox | Имеет универсальный формат кодирования | Содержится в зашифрованном формате и является избыточным в случае организации хранения сообщений электрронной почты в домашней директории пользователя. |
Операции добавления и поиска сообщений осуществляются достаточно быстро | До тех пор пока файл не разрастется до мегалитических размеров или не возникнут проблемы блокировки, связанные с попытками использования сетевых файловых систем. | |
Maildir | Cчитается более стабильным и быстродейственным чем Mbox | На малом числе сообщений вряд ли будет превосходить по этим показателям Mbox |
Возможность фильтрации и перекладывания сообщений в соответствующие поддиректории во время их получения | Потеря сообщений в случае ошибок файловой системы или подсистемы памяти, используемых в ходе фильтрации сообщений электронной почты. | |
Нет проблем совместимости этих файлов,потому что они могут быть переданы по сети в безопасном формате с наименьшим шансом подтасовки результатов. | Сетевые файловые системы должны уметь поддерживать и использовать разграничение прав доступа к объектам для доступа только тех субъектов, имеющие одну и ту же учетную запись. | |
Для каждого входящего сообщения в директории Maildir создается новый отдельный файл | От администратора почтового сервера требуется постоянно следить, чтобы разрастающиеся файлы (сообщения) пользователей не превысили возможности носителя информации, на котором они хранятся. |
2. Решение
2.1 Правила использования форматов хранения
В Postfix предусмотрена опция в основном конфигурационном файле main.cf, которая позволяет устанавливать один из двух форматов хранения в директории пользователя, как показано в листинге 2.1
Листинге 2.1
... home_mailbox = Maildir/
Postfix четко определяет [3.3], что для формата Maildir – значение, устанавливающее формат и одновременно имя директории, в правой части должно заканчиваться слешом (/), соответственно такое окончание считается недопустимым для формата Mbox, как показано в листинге 2.2
Листинге 2.2
... home_mailbox = Mailbox
Поэтому для реализации хранения в формате Maildir необходимо определить значение для опции home_mailbox, равной значению Inbox/ , как показано в дампе 2.1 . Соответственно, для хранения в формате Mbox в опции home_mailbox указать значение Mailbox без символа слэша на конце (/).
Для установки значения Inbox/ ,устанавливающий формат хранения писем формата Maildir для переменной home_mailbox следует воспользоваться postconf, как показано в дампе 2.3
Дамп 2.3
root@debian10-uni:~# postconf -e "home_mailbox = Inbox/"
При этом не забудте перезапустить postfix, как показано в дампе 2.4
Дамп 2.4
root@debian10-uni:~# service postfix restart
После чего остается определить переменную окружения MAIL в каждом пользовательском аккаунте, что конечно проще сделать в файле .profile из /etc/skel до того как будет создана учетка пользователя электронной почты, как показано в листинге 2.5 ниже.
Дамп 2.5
# ~/.profile: executed by the command interpreter for login shells. # This file is not read by bash(1), if ~/.bash_profile or ~/.bash_login # exists. # see /usr/share/doc/bash/examples/startup-files for examples. # the files are located in the bash-doc package. # the default umask is set in /etc/profile; for setting the umask # for ssh logins, install and configure the libpam-umask package. #umask 022 # if running bash if [ -n "$BASH_VERSION" ]; then # include .bashrc if it exists if [ -f "$HOME/.bashrc" ]; then . "$HOME/.bashrc" fi fi # set PATH so it includes user's private bin if it exists if [ -d "$HOME/bin" ] ; then PATH="$HOME/bin:$PATH" fi # set PATH so it includes user's private bin if it exists if [ -d "$HOME/.local/bin" ] ; then PATH="$HOME/.local/bin:$PATH" fi MAILGROUP=$(sed -n -r -e '/(^mail).*+\:+'$(id -g)'+:\.*$/p' /etc/group | sed -r -e 's/:/\n/g' | sed '1!d') MAIL="$HOME/Inbox/" if [ ! -d $MAIL ] && [ "$MAILGROUP" = "mail" ] ; then mkdir -p $MAIL/{cur,new,tmp} fi
Также неплохо с использованием переменной MAILGROUP огородить не входящих в группу mail (GID=8) пользователей от автоматического создания в домашних директориях не нужных им в её корне файла Mbox или директории Maildir/
А затем уже можно начать создавать учетки пользователей электронной почты, например, как показано в дампе 2.6
Дамп 2.6
root@debian10-uni:~# useradd -m -s /bin/bash -g mail user root@debian10-uni:~# useradd -m -s /bin/bash -g mail fmaster
Что и должна, затем нам продемонстрировать утилита env, после того как учетка пользователя электронной почты будет создана и авторизована, например fmaster, как показано в дампе 2.7
Дамп 2.7
fmaster@debian10-uni:~$ env MAIL=/home/fmaster/Inbox/ ...
После чего, можно запузырить тестовую отправку письма /вводимый контент выделен жирным/, как показан в дампе 2.8
Дамп 2.8
fmaster@debian10-uni:~$ telnet mail.maildomain.tld 2525 Trying 192.168.2.10... Connected to mail.maildomain.tld. Escape character is '^]'. 220 maildomain.tld ESMTP Postfix (Debian/GNU) ehlo maildomain.tld Trying 192.168.2.10... 250-maildomain.tld 250-PIPELINING 250-SIZE 10240000 250-VRFY 250-ETRN 250-STARTTLS 250-ENHANCEDSTATUSCODES 250-8BITMIME 250-DSN 250-SMTPUTF8 250 CHUNKING mail from: fmaster@maildomain.tld 250 2.1.0 Ok rcpt to: user@maildomain.tld 450 4.1.1: Recipient address rejected: User unknown in local recipient table rcpt to: user@maildomain.tld 250 2.1.5 Ok data 354 End data with . subject: My first mail on Postfix (local) Hi, Are you there? Regards, Fmaster . 250 2.0.0 Ok: queued as B16884C095 quit 221 2.0.0 Bye Connection closed by foreign host.
Или с использованием утилиты Swaks, как показано в дампе 2.9
Дамп 2.9
fmaster@debian10-uni:~$ swaks -to "user@maildomain.tld" --from "fmaster@maildomain.tld" --server mail.maildomain.tld --port 2525 --ehlo maildomain.tld === Trying mail.maildomain.tld:2525... === Connected to mail.maildomain.tld. <- 220 maildomain.tld ESMTP Postfix (Debian/GNU) -> EHLO maildomain.tld <- 250-maildomain.tld <- 250-PIPELINING <- 250-SIZE 10240000 <- 250-VRFY <- 250-ETRN <- 250-STARTTLS <- 250-ENHANCEDSTATUSCODES <- 250-8BITMIME <- 250-DSN <- 250-SMTPUTF8 <- 250 CHUNKING -> MAIL FROM:<- 250 2.1.0 Ok -> RCPT TO: <- 250 2.1.5 Ok -> DATA <- 354 End data with . -> Date: Mon, 19 Apr 2021 18:17:58 +0300 -> To: user@maildomain.tld -> From: fmaster@maildomain.tld -> Subject: test Mon, 19 Apr 2021 18:17:58 +0300 -> Message-Id: <20210419181758.003104@debian10-uni> -> X-Mailer: swaks v20181104.0 jetmore.org/john/code/swaks/ -> -> This is a test mailing -> -> -> . <- 250 2.0.0 Ok: queued as C446B4C08E -> QUIT <- 221 2.0.0 Bye === Connection closed with remote host.
При этом не нужно парится, а правильно ли ввели команды почтовому сереверу или нет и насколько вводимый контент письма соответствует ранее RFC 822, который поменили на RFC 2822, потому что за Вас это сделает Swaks(Swiss Army Knife smtp или универсальный и простой тестер smtp)
Далее разберем ошибки казалось бы непосредственно связанные с использованием вышеперечисленных форматов, но на самом деле к правилам их установки ни коим боком не касающиеся.
2.2 Устарнение ошибок из журнала postfix (/var/log/mail.log)
2.2.1 Ошибка "Temporary failure in name resolution"
Лечится правильной установкой домена и ip сервера (192.168.2.2) в файл /etc/resolv.conf, как показано в листинге 2.10
Листинг 2.10
# Generated by NetworkManager search maildomain.tld nameserver 192.168.2.2
И перезапуском системного резолвера, который помогает выполнять локальным приложениям, как показано в дампе 2.11
Дамп 2.11
sudo systemctl restart systemd-resolved.service
2.2.2 Ошибка "mail for mydomain.tld loops back to myself"
Лечится правильно установленной конфигурацией доменного имени $mydomain, и транспорта получателя писем (mail delvire transport) $mydestion, как показано в листинге 2.12
Листинг 2.11
mydomain = maildomain.tld myhostname = $mydomain ... myorigin = mail.$mydomain mydestination = $myhostname, localhost.$mydomain $mydomain mynetworks = 127.0.0.0/8 192.168.2.0/24 relay_domains =
3. Библиография
3.1 InterServer.net: Difference Between Maildir and Mbox’s Directory Structure
3.1 Postfix. Option home_mailbox
3.2 Unix & Linux. How to make postfix create maildir?