× К оглавлению На главную Об авторе

   Дата и время публикации:

Проблемы и решение

1. Суть проблемы

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

В общем Mailbox и Maildir являются форматами e-mail, которые выступают в качестве директорий для приложений электронной почты. Изначально формат Mailbox относился к оригинальной службе хранения сообщений электронной почты на сервере cPanel, теперь же он использует Maildir в качестве формата по умолчанию. Mailbox складирует все сообщения на серверы в одном и том же файлы, в то время как Maildir хранит сообщения в индивидуальных файлах под уникальными именами [3.1].

Формат Maildir

Представляет собой три поддиректории в одноименной директории Maildir, которая содержит следующие поддиректории с файлами:

Формат Mailbox

Более известен под кратким названием Mbox, являющийся типом файла электронной почты, который хранит сообщения в простом текстовом формате(известным более как plain-text) . Содержания всех электронных писем объединяются в форме 7-разрядного ASCII текста и остальной части их компонентов (присоединенные сообщения, метаданные и т. д.), которые храняться в закодированном виде. Таким образом Mbox оперирует с одним единственным форматом файла, в котором сохраняются все сообщения электронных писем в одном и том же файле одной и той же учетной записи, оыбчно называемой inbox.

 

В таблице 1.1 сведены преимущества и недостатки обоих форматов Mbox и Maildir

Таблица 1.1
Формат хранения сообщений электронных писем Преимущества Недостатки
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?

3.3 LinuxQuestions.org: how to create Maildir postfix

3.4 WiKi.dovecot.org: mbox configuration