Как посмотреть письма пользователя в postfix
Настроил почтового клиента у пользователя по IMAP, но он говорит, что письма не все, их было больше, какой командой можно посмотреть письма пользователя в ящике… в каталоге cur лежат файлы с расширением .mail:2,S, но если каждый файл это письмо, то их очень мало, где ещё могут находиться письма?
tmpnikl
02.03.21 07:44:47 MSK

Postfix к IMAP отношения не имеет, ты воюешь не в ту сторону. Почитай лучше куда ты коннектишь клиента и кто за эту службу отвечает.
Письма «которых было больше» до переключения на IMAP очевидно где-то в локальном хранилище старого POP3-клиента.
На imap-сервере они все должны быть в Maildir/cur или Maildir/new или Maildir/INBOX.. Опять же это верно только при условии, что до этого с ящиком не поработали по POP3 и не утянули всё с удалением писем с сервера.
BOOBLIK ★★★
( 02.03.21 09:31:22 MSK )
Последнее исправление: BOOBLIK 02.03.21 09:32:29 MSK (всего исправлений: 1)
Ответ на: комментарий от BOOBLIK 02.03.21 09:31:22 MSK
Спасибо за ответ, а не подскажите ещё вот такое чудо, я смотрю каталог mail\пользователь, там три подкаталога cur, new, tmp, копирую на локальную машину ящик этого пользователя, а там появляются ещё каталоги .Sent,.Archives и т.д. с такими же подкаталогами и с этими недостающими письмами, как теперь их перекинуть в каталог mail\пользователь\cur? там же какие-то индексы у каждого письма, надо сделать как-то правильно… Клиент на локальной машине громптица, pop3 не использовали.
tmpnikl
( 02.03.21 10:21:16 MSK ) автор топика
Ответ на: комментарий от tmpnikl 02.03.21 10:21:16 MSK

я смотрю каталог mail\пользователь
Как смотришь? Какой командой?
там появляются ещё каталоги .Sent,.Archives
в Linux файлы и каталоги, начинающиеся с точки являются скрытыми включи отображение скрытых каталогов и увидишь их
как теперь их перекинуть в каталог mail\пользователь\cur
В директории .Sent хранятся отправленные. В cur лежат входящие. Ты уверен, что тебе нужно перекинуть одно в другое?
Почитай теорию. То как работает твой IMAP-сервер, где и как хранит, какая схема организации каталогов включена в его настройках. Я бы начал с этого. Пока что похоже, что ты всё делаешь наугад и ни к чему хорошему это не приведёт.
Пока что очень похоже, что у тебя не включена подписка на нужные тебе почтовые папки в самом клиенте. Попробуй кликнуть правой кнопкой по названию ящика в левой колонке Thunderbird и выбрать там Subscribe (или что-то типа «Подписки»/«Почтовые папки» и т.п., не знаю как это точно в русской локали) и отметить там все что можно галочками.
BOOBLIK ★★★
( 02.03.21 10:39:17 MSK )
Последнее исправление: BOOBLIK 02.03.21 10:39:46 MSK (всего исправлений: 1)
Как восстановить электронные письма с сервера Postfix, Dovecot, и почтового клиента Thunderbird
В это статье мы обсудим, как восстановить файлы электронных сообщений с почтового сервера «postfix» с «dovecot», как сделать резервную копию почты, и вернуть утерянные письма, как перенести электронные письма на новый сервер или другую клиентскую машину.

- Как восстановить данные с резервной копии
- Резервное копирование почты Postfix+Dovecot
- Как восстановить с помощью Hetman Partition Recovery
- Заключение
- Как восстановить почту из резервной копии
- Как восстановить с помощью Hetman Partition Recovery
- Заключение
- Вопросы и ответы
- Комментарии
Резервное копирование является важной частью работ по поддержанию работоспособности сервера и всего домена. Так как сервер является критичной частью сети, производите регулярное резервное копирование. При возникновении нештатных ситуаций, например, выхода из строя оборудования, вы сможете восстановить работоспособное состояние сервера из резервной копии. Но что же делать в том случае если резервной копии нет или восстановление с нее невозможно. В таком случае вам поможет программа для восстановления данных Hetman Partition Recovery. С ее помощью вы сможете вернуть утерянную почту с вашего сервера.
Мы полностью разберем, как сделать резервную копию файлов и восстановить данные на клиентской машине на примере почтового клиента Thunderbird в операционной системе Linux и как восстановить письма на сервере после переустановки или форматирования накопителя, как перенести почту на новый сервер. Для начала рассмотрим причины, по которым вы можете потерять доступ к сообщениям.
Перейти к просмотру

Причины утери электронных писем
Причинами, по которым может быть утеряна электронная почта могут быть самыми разными. Основные причины потери почты, следующие:
- Случайное удаление папки пользователя на клиентской машине;
- Сбои в работе сервера;
- Поломка почтового сервера;
- Неправильное администрирование;
- Потеря доступа к почтовому ящику;
- Затирание данных в случае переустановки или случайного форматирования диска;
Перейти к просмотру

Резервная копия папки пользователя Thunderbird
Перед тем как начать поиск утерянных данных нужно определить, где искать файлы электронных писем.
Как известно вся почта, которая попадает на сервер записывается в определенном каталоге и хранится до тех пор, пока не будет удалена. Письма с сервера удаляются при их удалении с корзины почтового ящика. При использовании почтового клиента на клиентской машине, сообщения помимо сервера хранятся еще и на клиентской машине, на которой используется соответствующий почтовый клиент.
Для примера я покажу, где хранятся файлы данных пользователя почтового клиента Thunderbird, как сделать резервную копию и как их восстановить.
В операционной системе Linux, почтовый клиент Mozilla Thunderbird хранит все настройки пользователя клиента, пароли, адресные книги и файлы электронных писем на клиентской машине пользователя. При первом запуске программы по умолчанию создается каталог по такому пути:
Home/имя пользователя/.thunderbird/ Копировать

Данная папка скрыта поэтому открыть ее содержимое можно из окна почтового клиента или же включить отображение скрытых папок. Меню, установить отметку – отображать скрытые файлы и папки.

Чтобы открыть данную папку в окне приложения перейдите в – Меню – Справка – Информация для решения проблем, в открывшейся вкладке найдите строку – Папка профиля и кликните по кнопке – Открыть папку. После чего папка пользователя откроется в проводнике. В данном каталоге вы найдете папки календаря, настроек, почты и т.д.

В Mozilla Thunderbird нет встроенных инструментов для создания резервной копии данных профиля или файлов переписки пользователя. Поэтому, в случае необходимости перенести профиль пользователя на другой компьютер или выхода компьютера, или операционной системы из строя по какой-то из причин, есть два варианта – использовать стороннее программное обеспечение или создание бэкапа профиля вручную.
Для того чтобы сделать резервную копию данных скопируйте папку — .thunderbird на другой накопитель.

Для каждого пользователя создается отдельная папка со случайно сгенерированным именем. Для переноса данных на другой компьютер нужно будет скопировать содержимое данного каталога на новый ПК в эту же папку.
Как восстановить данные с резервной копии
Для восстановления данных из резервной копии или переноса их на другой ПК установите и запустите программу Thunderbird на новом ПК. При первом запуске приложение создаст новую папку пользователя, по указанному ранее пути. Не внося никаких настроек закройте приложение.

Перейдите по пути, где находится папка профиля и замените содержимое папки нового профиля, файлами из резервной копии. При запросах системы о замене файлов, выберите «Заменить».

После запуска программы вы войдете в старую учетную запись пользователя и найдете все сообщения, которые были на момент создания бэкапа.

Как восстановить данные пользователя с клиентской машины после удаления или форматирования
В том случае если вы случайно удалили пользователя на клиентской машине, сервер не работает, и у вас нет резервной копии данных, для восстановления воспользуйтесь программой Hetman Partition Recovery.
Инструмент восстанавливает файлы с любых устройств, независимо от причины потери данных.
В случае с операционной системой Linux вам нужно подключить диск к ПК с операционной системой Windows. После запуска программа отобразит все накопители, подключенные к компьютеру, в открывшемся окне кликните по диску, где хранилась папка с данными пользователя почтового клиента правой кнопкой мыши и выберите – Открыть. Далее нужно выбрать тип анализа – Быстрое сканирование или Полный анализ.

Для начала рекомендуется выполнить быстрое сканирование это займет меньше времени. Если в результате программе не удалось найти нужных файлов запустите — Полный анализ, укажите файловую систему – Далее. По завершении перейдите по пути, где лежали файлы пользователя, отметьте папку и нажмите — Восстановить, укажите место куда сохранить данные, диск, папку, и кликните по кнопке – Восстановить.

Далее остается заменить файлы нового пользователя как я показывал ранее. После чего вы найдете все восстановленные сообщения в папке входящих.
Если программе не удалось восстановить доступ к учетной записи пользователя и сообщения остались недоступны их можно посмотреть в текстовом редакторе.
Для этого нужно открыть файл входящих сообщений. Перейдите по такому пути
home/user name/.thunderbird/каталог пользователя/mail/mail.hetmansoftware.com Копировать

Файл – Inbox. В этом файле записаны все сообщения, которые приходили на почту. Таким образом вы сможете получить нужный имейл или содержимое важного сообщения. Если восстановить таким способом не получилось, попытайтесь восстановить данные с сервера.
Резервное копирование почты Postfix+Dovecot
В одной из предыдущих статей мы уже рассказывали про установку и настройку сервера Postfix с Dovecot и где хранятся файлы электронных сообщений.
В зависимости от типа хранения электронной почты файлы могут хранить в папке – var/mail с именем пользователя – если используется – mbox.

И в папке maildir – если используется данный тип хранения. Верхний уровень каталога Maildir содержит такие папки — Maildir/cur, Maildir/new и Maildir/tmp.

При доставке сообщения оно помещается в файл в подкаталоге tmp. Имя файла формируется из текущего времени, имени хоста, идентификатора процесса, создавшего этот файл, и некоторого случайного числа — таким образом гарантируется уникальность имен файлов.

После записи сообщения в файл создается ссылка на него в каталоге new, а текущая ссылка из tmp удаляется.
Когда почтовый клиент находит сообщения в папке new, он перемещает их в cur (с помощью rename(), иначе это может привести к дублированию сообщений) при этом добавляет к их именам информационные суффиксы. Информационный суффикс состоит из двоеточия (для разделения уникальной части имени файла и текущей информации), числа ‘2’, запятой и различных флагов. Число ‘2’ указывает версию информации после запятой. Спецификация определяет флаги, которые показывают, было сообщение прочитано, удалено и так далее, для них используются первые (заглавные) буквы следующих слов: Passed, Replied, Seen, Trashed, Draft и Flagged.
Итак, новые письма падают в папку – new, затем после прочтения переносятся в папку – cur переименованием с добавлением суффикса.
Для резервного копирования почтовых файлов откройте каталог соответствующего пользователя и скопируйте файлы сообщений на другой накопитель.

Как восстановить почту из резервной копии
Для восстановления писем из резервной копии нужно перенести файлы сообщений из бэкапа в папку new – home/user name/Maildir/new.

После переноса вы не увидите сообщений в окне клиента, так как нужно внести некоторые изменения. Для того чтобы они отобразились в почтовом клиенте нужно отредактировать имена файлов.
Кликните правой кнопкой мыши по файлу и выберите – Переименовать, здесь нужно удалить все символы, которые стоят после доменного имени вашего сервера. В моем случае это — :2,S (двоеточие два s).

Затем откройте почтовый клиент и нажмите кнопку – принять почту. После чего письма, которые были перенесены из резервной копии, появятся в списке входящих со статусом непрочитанных.

Таки образом из файлов резервной копии можно восстановить случайно удаленное письмо или перенести почту на новый сервер.
Как восстановить с помощью Hetman Partition Recovery
В случае выхода из строя сервера, случайного удаления пользователя, форматирования диска, переустановки операционной системы, потери файлов электронной почты, и отсутствии резервной копии, их можно восстановить с помощью программы Hetman Partition Recovery.
В случае с операционной системой Linux вам нужно достать диск из сервера и подключить его к ПК с операционной системой Windows. Запустить программу и просканировать подключенный диск. Затем перейти по пути, где хранились файлы электронных сообщений, выделить каталог или его содержимое и нажать кнопку – Восстановить. Далее указать диск, папку куда сохранить файлы и еще раз нажать – Восстановить.

При сохранении программа попросит изменить имена файлов, так как в нем присутствует символ двоеточия, который не поддерживается в именах файлов некоторых операционных систем, включая Windows. В этом нет ничего страшного так как файлы в итоге все равно будут переименованы при копировании на сервер и эти символы будут удалены. Установите отметку напротив- заменять неизвестные символы и нажмите – Переименовать.

После восстановления, в папке будут лежать файлы электронных сообщений, далее их можно перенести на новый сервер.
Перед тем как скопировать файлы нужно настроить сервер и создать пользователя с таким же именем. Файлы копируем в папку – new, и редактируем имена как было рассказано ранее, удалив суффикс из нескольких символов – *_2,S. После открываем почтовый клиент и проверяем почту, жмем здесь получить письма. Мы восстановили все сообщения.
Заключение
Если по каким-то причинам у пользователя безвозвратно утерян доступ к своему профилю Thunderbird или другого почтового клиента, содержимое файлов можно посмотреть в текстовом редакторе. Открыв его, вы увидите оригинальное содержимое письма, с эмейлами отправителя, получателя, текстом и другими данными. Таким образом вы сможете достать из восстановленной почты необходимые данные.

Автор: Dmytriy Zhura, Технический писатель
Дмитрий Жура – автор и один из IT-инженеров компании Hetman Software. Имеет почти 10 летний опыт работы в IT-сфере: администрирование и настройка серверов, установка операционных систем и различного программного обеспечения, настройка сети, информационная безопасность, внедрения и консультация по использованию специализированного ПО. Является экспертом в области восстановления данных, файловых систем, устройств хранения данных и RAID массивов.

Редактор: Andrey Mareev, Технический писатель
В далеком 2005 году, я получил диплом по специальности «Прикладная математика» в Восточноукраинском национальном университете. А уже в 2006 году, я создал свой первый проект по восстановлению данных. С 2012 года, начал работать в компании «Hetman Software», отвечая за раскрутку сайта, продвижение программного обеспечения компании, и как специалист по работе с клиентами.
- Обновлено:
- 18.10.2023 16:22
Установка и настройка почтового сервера postfix с хранением почтовых паролей в файле
![]()
Устанавливаем и настраиваем postfix
Устанавливаем и настраиваем dovecot
Создаём почтовый ящик В прошлой статье мы рассказали о том, как подготовить базу для нашего почтового сервера, теперь настало время установить и настроить сам почтовик. На этом этапе мы рассмотрим настройку почтового сервера с виртуальными пользователями и хранением паролей от почтовых ящиков в файле. Этот метод несложен и не требует много действий в консоли, но если вы планируете заводить больше 10–15 почтовых ящиков, управлять ими будет не очень удобно — для этого лучше подойдёт второй вариант настройки с хранением паролей в базе данных.
Устанавливаем и настраиваем postfix
Устанавливаем postfix на сервер: Centos (обычно в Centos 7 он уже установлен):
yum install epel-release -y yum install postfix -y
Debian/Ubuntu:
apt install postfix -y

Далее откроется окно, где нужно выбрать Internet Site :
И в следующем окне указать ваш домен, с которого будет отправляться почта:

Запускаем и добавляем в автозагрузку службу postfix :
systemctl start postfix systemctl enable postfix
Вносим изменения в настройку postfix, в консоли вводим следующие команды:
postconf -e 'inet_interfaces=all' postconf -e 'mydestination=' postconf -e 'myhostname=mailtest.fvds.ru' postconf -e 'virtual_mailbox_domains=mailtest.fvds.ru' postconf -e 'virtual_transport=lmtp:unix:private/dovecot-lmtp' postconf -e 'virtual_mailbox_maps=hash:/etc/postfix/virtual_recipients' postconf -e 'virtual_alias_maps=hash:/etc/postfix/virtual_alias_recipients' postconf -e 'virtual_mailbox_base=/var/mail/vmail/' postconf -e 'local_recipient_maps=$virtual_mailbox_maps' postconf -e 'smtpd_sasl_auth_enable=yes' postconf -e 'smtpd_sasl_type=dovecot' postconf -e 'smtpd_sasl_path=private/auth' postconf -e 'broken_sasl_auth_clients=yes' postconf -e 'smtpd_sasl_security_options=noanonymous' postconf -e 'smtpd_use_tls=yes' postconf -e 'smtpd_tls_cert_file=/etc/postfix/certs/cert.pem' postconf -e 'smtpd_tls_key_file=/etc/postfix/certs/key.pem' postconf -e 'smtpd_sasl_tls_security_options=noanonymous' postconf -e 'smtpd_tls_auth_only=yes' postconf -e 'smtpd_relay_restrictions=permit_mynetworks,permit_sasl_authenticated,reject_unauth_destination' postconf -e 'smtpd_recipient_restrictions=permit_mynetworks,permit_sasl_authenticated,reject_non_fqdn_helo_hostname,reject_non_fqdn_sender,reject_unknown_sender_domain,reject_non_fqdn_recipient,reject_unknown_recipient_domain' postconf -e 'smtpd_banner=$myhostname ESMTP' postconf -e 'biff=no' postconf -e 'strict_rfc821_envelopes=yes' postconf -e 'disable_vrfy_command=yes' postconf -e 'smtpd_helo_required=yes'
Конфигурация будет добавлена в файл /etc/postfix/main.cf . В конец файла /etc/postfix/master.cf дописываем следующие строки:
submission inet n - n - - smtpd -o smtpd_tls_security_level=encrypt -o smtpd_sasl_auth_enable=yes -o smtpd_sasl_type=dovecot -o smtpd_sasl_path=private/auth -o syslog_name=postfix/submission -o smtpd_tls_wrappermode=no -o smtpd_recipient_restrictions=permit_mynetworks,permit_sasl_authenticated,reject -o smtpd_relay_restrictions=permit_mynetworks,permit_sasl_authenticated,defer_unauth_destination -o milter_macro_daemon_name=ORIGINATING smtps inet n - n - - smtpd -o smtpd_sasl_auth_enable=yes -o smtpd_sasl_type=dovecot -o smtpd_sasl_path=private/auth -o syslog_name=postfix/smtps -o smtpd_tls_wrappermode=yes -o smtpd_recipient_restrictions=permit_mynetworks,permit_sasl_authenticated,reject -o smtpd_relay_restrictions=permit_mynetworks,permit_sasl_authenticated,defer_unauth_destination -o milter_macro_daemon_name=ORIGINATING
Для Centos в конец этого же файла нужно добавить:
dovecot unix — n n — — pipe flags=DRhu user=vmail:vmail argv=/usr/libexec/dovecot/deliver -f $ -d $
Для Debian/Ubuntu в конец этого же файла нужно добавить:
dovecot unix — n n — — pipe flags=DRhu user=vmail:vmail argv=/usr/lib/dovecot/deliver -f $ -d $
Теперь сгенерируем самоподписанный сертификат, чтобы данные не передавались в открытом виде. При генерации сертификата система задаст несколько вопросов. На них можно ответить всё, что угодно, — особой роли это не играет.
mkdir /etc/postfix/certs openssl req -new -x509 -days 3650 -nodes -out /etc/postfix/certs/cert.pem -keyout /etc/postfix/certs/key.pem

Вот пример выполнения команды: Если у вас есть платный сертификат на домен с не истекшим сроком действия, используйте его. Файлы сертификата нужно разместить в директории /etc/postfix/certs/ и заменить имена файлов на свои в конфигурационном файле postfix /etc/postfix/main.cf в следующих строках:
smtpd_tls_cert_file smtpd_tls_key_file
Проверить корректность настроек postfix можно через команду:
postfix check
Устанавливаем и настраиваем dovecot
Centos:
yum install dovecot -y
Debian/Ubuntu:
apt install dovecot-imapd dovecot-pop3d dovecot-lmtpd -y
Активируем службу и добавляем в автозапуск:
systemctl start dovecot systemctl enable dovecot
Создаём локальный файл настроек:
touch /etc/dovecot/local.conf
Открываем его текстовым редактором и указываем в нём следующие настройки:
protocols = pop3 imap lmtp auth_mechanisms = plain login mail_gid = vmail mail_uid = vmail first_valid_uid = 5000 last_valid_uid = 5000 mail_location = maildir:/var/mail/vmail/%d/%n/ mbox_write_locks = fcntl disable_plaintext_auth = yes passdb < args = scheme=ssha512 username_format=%u /etc/dovecot/users driver = passwd-file >userdb < args = username_format=%u /etc/dovecot/users driver = passwd-file >service auth < unix_listener /var/spool/postfix/private/auth < group = postfix mode = 0660 user = postfix >unix_listener auth-userdb < mode = 0600 user = vmail >> service lmtp < unix_listener /var/spool/postfix/private/dovecot-lmtp < group = postfix mode = 0600 user = postfix >user = vmail > protocol lmtp < postmaster_address = postmaster@mailtest.fvds.ru >ssl = required ssl_cert =Файл пользователей почтовых ящиков находится здесь — /etc/dovecot/users , формат файла аналогичен формату пользователей системы — /etc/passwd . Сертификат используется тот, что генерировали при настройке postfix , если используете свой сертификат, то нужно указать путь до него в следующих строках конфигурационного файла dovecot /etc/dovecot/local.conf :
ssl_cert ssl_keyСоздаём почтовый ящик
Основа почтового сервера готова, теперь можно создать первый почтовый ящик. Ящики и пароли от них хранятся в файле /etc/dovecot/users . Генерируем пароль для почтового ящика командой:
doveadm pw -s ssha512
Команда запросит пароль и подтверждение, придумываем его и вводим. На выходе увидим следующую строку: Обязательно скопируйте её, это пароль от ящика в зашифрованном виде. Далее открываем файл с пользователями /etc/dovecot/users — если его нет, то создайте его с помощью команды touch /etc/dovecot/users — и вносим туда имя почтового ящика, наш сгенерированный пароль и номера uid (5000) и gid (5000) через двоеточие в следующем формате:
admin@mailtest.fvds.ru:v8cRBy17QPdVE91MRQ1MsuMtCUENXZuWGuX5o51we/V1YG3MgJnC+9qHRw488U4W5ZR6eAlxuQiKco41U5swvXVMDRg=:5000:5000Теперь создадим файл получателей локальной почты:
touch /etc/postfix/virtual_recipientsИ файл псевдонимов для почтовых ящиков, чтобы настроить переадресацию на тот почтовый ящик, с которого вам удобнее получать письма:
touch /etc/postfix/virtual_alias_recipientsВ нашем примере формат файла псевдонимов следующий:
admin@mailtest.fvds.ru admin.mailtest@ya.ruПисьма, отправленные на admin@mailtest.fvds.ru, будут перенаправляться на admin.mailtest@ya.ru. Почтовые ящики можно использовать любые, здесь для примера используется admin@mailtest.fvds.ru. Вы указываете тот почтовый ящик, который у вас создан на сервере и с которого нужно настроить переадресацию, и тот, на который хотите получать письма. Далее в файле /etc/postfix/virtual_recipients укажем созданный почтовый ящик в таком виде:
admin@mailtest.fvds.ru admin/Проиндексируем базу пользователей postfix :
postmap /etc/postfix/virtual_recipients postmap /etc/postfix/virtual_alias_recipientsПримечание: После каждого изменения файлов /etc/postfix/virtual_recipients и /etc/postfix /virtual_alias_recipients выполняйте их переиндексацию, чтобы данные обновились:
postmap /etc/postfix/virtual_recipients postmap /etc/postfix/virtual_alias_recipientsПерезапускаем почтовые службы:
systemctl restart dovecot systemctl restart postfixНа этом базовая настройка почтового сервера завершена: можно отправлять и получать письма. Если не планируете переписываться с огромным количеством людей, у которых в почте настроены жёсткие проверки на спам, то можете на этом остановиться — протестировать отправку и пользоваться. Но, помните, что для полноценной работы почтового сервера только базовой настройки недостаточно. Такие сервисы, как gmail.com , mail.ru или yandex.ru , могут расценивать ваши письма, как спам, из-за того, что они не прошли проверку, и отклонять их. Чтобы этого не случилось и письма доходили до адресата, советуем выполнить ещё пару настроек, о которых расскажем далее.
Очистка и обслуживание почтовой базы postfix
Мне приходится много работать с почтовыми серверами на базе postfix с базой почты формата maildir. За несколько лет работы накопилось множество различных приемов по оптимизации работы и настройке. Сегодня решил собрать в кучу все более ли менее универсальные и полезные скрипты по автоматической очистке почтовой базы в postfix.
Если у вас есть желание научиться строить и поддерживать высокодоступные и надежные системы, рекомендую познакомиться с онлайн-курсом «DevOps практики и инструменты» в OTUS. Курс не для новичков, для поступления нужно пройти вступительный тест.
Введение
Данная статья будет актуальна для тех, кто сам выполнил установку и настройку postfix или воспользовался готовой сборкой на базе iredmail. Это что касается материалов моего сайта. А в целом все описанное ниже будет актуально для любого почтового сервера, который хранит почту в формате maildir.
Скажу пару слов, почему именно maildir. Лично я этот формат использую за его удобство. В нем каждое письмо это отдельный файл, который можно посмотреть любым текстовым редактором. Эти файлы удобно бэкапить, анализировать содержимое, сортировать по каким-то признакам. В общем, с ними можно работать как с обычными текстовыми файлами. На основе этих плюсов и выполняется вся дальнейшая работа в статье. Из минусов вижу только один - огромное количество мелких файлов создают большую нагрузку на дисковую подсистему.
Приведу для наглядности пример, который позволит оценить нагрузку на диски. Для синхронизации с помощью rsync почтовой базы объемом примерно 1 терабайт, расположенной на raid10 обычных 3.5 sata дисков, на одиночный такой же диск для бэкапа, уходит где-то пару часов в основном на сравнение файлов между источником и приемником. Само копирование файлов проходит быстро, но чтобы сравнить изменения за день, приходится выполнять длительную операцию. При этом в целом работа пользователей (~30-40 человек) с этой базой вполне комфортна, каких-то тормозов не наблюдается.
То есть по сути, для такого количества пользователей, сервером может быть обычный десктопный компьютер с 2-4 обычными sata дисками. Хватит производительности любого процессора и примерно 2-4 гигабайта оперативной памяти. Отдельный вопрос, конечно, к надежности обычного системника. Я сервера на них не рекомендую собирать, но при большом желании можно.
Приведенные далее скрипты для очистки почтовой базы писались в разное время на разных серверах. Иногда может показаться, что все сделано нелогично или как-то сложно. Громоздкие конструкции часто возникали там, где появлялись проблемы с пробелами или спецсимволами в именах папок на русском языке, которые при переводе в UTF-7 (кодировка названия imap папок в dovecot) превращаются в весьма неудобные для обработки строки. Дальше будет понятно, что я имею ввиду.
Перейдем теперь к конкретным примерам.
Простое удаление старых писем из ящика
Начнем с самого простого примера. Допустим, у вас есть какой-то ящик, хранить письма в котором старше определенного срока не имеет смысла. К примеру, это может быть ящик для оповещений системы мониторинга. После того, как оповещение было прочитано, оно теряет актуальность. Все события и так фиксируются и хранятся на самом сервере, поэтому хранить долго письма нет никакого смысла. Очистим этот ящик, удалив из него все письма, старше 30 дней.
/usr/bin/find /data/mail/virtual/zabbix@mailsrv.ru/Maildir/*/ -type f -mtime +30 -exec rm <> \;
| /usr/bin/find | Путь до утилиты find. Проверьте его актуальность в своем дистрибутиве. |
| /data/mail/virtual/reports@eme.ru/Maildir/*/ | Путь до конкретного ящика. Конструкция /*/ позволяет сразу проверить обе папки new и cur. |
| -type f | Говорим find, что ищем только файлы. |
| -mtime +30 | Указываем срок более 30 дней с последнего изменения файла. То есть все файлы старше 30-ти дней. |
| -exec rm <> \; | Выполняем удаление. |
В данном случае мы просто используем стандартный синтаксис утилиты для поиска файлов find. Подробности ее использования можно найти в интернете, примеров масса. Во время отладки я рекомендую не использовать удаление, а просто направить вывод в файл, чтобы можно было оценить, что утилита нашла и собирается удалить. В простых примерах, как этот, может показаться, что нет смысла проверять, но в более сложных конструкциях рекомендую всегда это делать, например, вот так.
/usr/bin/find /data/mail/virtual/zabbix@mailsrv.ru/Maildir/*/ -type f -mtime +30 >> /root/dellist.txt
После этого смотрите файл /root/dellist.txt и проверяйте, что собираетесь удалить. После того, как проверили, не обязательно заново выполнять поиск по базе и лишний раз нагружать диски. Можно удалить все указанные в dellist.txt письма следующим скриптом.
#!/bin/bash cat /root/dellist.txt | while read i ; do rm -f "$i" done
Сам процесс поиска по почтовой базе postfix не такой длительный, как поиск и удаление. На сильно нагруженных базах я рекомендую выполнять удаление, когда сервер нагружен меньше всего, а поиск в любое время. Конечно, искать тоже лучше в нерабочее время, но мне не нравится работать ночью, поэтому все, что можно, я делаю днем, а на ночь оставляю по возможности минимум работы.
Массовая очистка корзин в почтовой базе postfix

Рассмотрим более сложный пример. Нам нужно автоматически очистить все корзины пользователей от писем, старше 30-ти дней. Я рекомендую всегда настраивать такую очистку. Дело в том, что если сервер сильно нагружен, то он не всегда корректно удаляет содержимое корзины. Например, пользователь отправил в корзину очень много писем (десятки тысяч), нажал "очистить корзину" и закрыл почтовый imap клиент. Есть вероятность, что реально письма не удалятся, а так и будут висеть в корзине. Imap сервер dovecot не удаляет мгновенно письма, а ставит их в очередь и потихоньку удаляет. Иногда этот процесс прерывается и удаление не происходит. Можно попытаться это сделать снова и рано или поздно они таки удалятся.
Есть пользователи, которые сами не чистят корзины, за годы работы у них накапливается там солидное количество бесполезных писем, которые только занимают место на сервере и замедляют работу тех же бэкапов или скриптов очистки. Надо помочь расстаться с этой почтой раз и навсегда.
Сложность с очисткой корзин в том, что названий папок для удаленной почты может быть много. Каждый почтовый клиент создает какую-то свою папку, имя которой может не совпадать с уже существующими. Сейчас могут использоваться одновременно 3 вида почтовых клиентов: web, десктопная или мобильная программа. Каждая из них создает свой набор папок. Ко всему прочему, русские имена imap папок хранятся в кодировке UTF-7, что осложняет работу скриптов. Необходимо экранировать спецсимволы и пробелы.
Вот мой список возможных названий папок для удаленной почты.
| Удаленные | .&BCMENAQwBDsENQQ9BD0ESwQ1- |
| Удаленные элементы | .&BCMENAQwBDsENQQ9BD0ESwQ1- &BE0EOwQ1BDwENQQ9BEIESw- |
| Корзина | .&BBoEPgRABDcEOAQ9BDA- |
| Deleted Messages | .Deleted Messages |
| Deleted Items | .Deleted Items |
| Trash | .Trash |
Я обычно выполняю поиск по такому набору папок. Если у вас есть дополнение этого списка, прошу поделиться. А вот скрипт для автоматической очистки корзин с указанными именами папок.
#!/bin/bash # текущая дата в формате Год-месяц-день data=`date +"%Y-%m-%d"` # формируем список почтовых ящиков для поиска mailbox=`ls -l /data/mail/virtual | grep vmail | awk ''` for box1 in $mailbox do /usr/bin/find /data/mail/virtual/$box1/Maildir/'.&BCMENAQwBDsENQQ9BD0ESwQ1-'/*/ -type f -mtime +30 | while read a ; do ls "$a" >> /root/mailclean/trashclean-log/$data.txt done done for box2 in $mailbox do /usr/bin/find /data/mail/virtual/$box2/Maildir/'.Deleted Messages'/*/ -type f -mtime +30 | while read b ; do ls "$b" >> /root/mailclean/trashclean-log/$data.txt done done for box3 in $mailbox do /usr/bin/find /data/mail/virtual/$box3/Maildir/.Trash/*/ -type f -mtime +30 | while read c ; do ls "$c" >> /root/mailclean/trashclean-log/$data.txt done done for box4 in $mailbox do /usr/bin/find /data/mail/virtual/$box4/Maildir/'.&BCMENAQwBDsENQQ9BD0ESwQ1- &BE0EOwQ1BDwENQQ9BEIESw-'/*/ -type f -mtime +30 | while read d ; do ls "$d" >> /root/mailclean/trashclean-log/$data.txt done done for box5 in $mailbox do /usr/bin/find /data/mail/virtual/$box5/Maildir/'.&BBoEPgRABDcEOAQ9BDA-'/*/ -type f -mtime +30 | while read e ; do ls "$e" >> /root/mailclean/trashclean-log/$data.txt done done for box6 in $mailbox do /usr/bin/find /data/mail/virtual/$box6/Maildir/'.Deleted Items'/*/ -type f -mtime +30 | while read f ; do ls "$f" >> /root/mailclean/trashclean-log/$data.txt done done cat /root/mailclean/trashclean-log/$data.txt | while read i ; do rm -f "$i" done
Конечно, тут для компактности можно было сделать еще один вложенный цикл и перебирать имена папок. Я не стал этого делать для наглядности. К тому же список небольшой, можно оставить так. Некоторые комментарии к скрипту.
mailbox=`ls -l /data/mail/virtual | grep vmail | awk ''`
формирует список ящиков для очистки. В данном случае берутся все существующие ящики. vmail тут владелец директорий с ящиками. Получить список актуальных ящиков можно разными способами. Я сделал это вот так. Вы можете вручную составить список ящиков в текстовом файле в формате один ящик в каждой новой строке и работать по своему списку. Примерно вот так:
mailbox=/root/mailclean/mailboxlist.txt
Возможно путь к файлу нужно взять в кавычки, сейчас точно не помню, надо проверять. Я логирую списки удаленных писем на всякий случай, чтобы можно было из архива быстро восстановить удаленные письма, если вдруг это будет необходимо. Во время отладки я рекомендую закомментировать последний этап работы скрипта, где выполняется удаление. Для начала просто сформируйте списки файлов на удаление и убедитесь, что там не попало ничего лишнего, что поиск по папкам прошел корректно.
Аналогичным образом можно очистить папки со спамом. Вот мой список для таких папок.
| Нежелательная почта | .&BB0ENQQ2BDUEOwQwBEIENQQ7BEwEPQQwBE8- &BD8EPgRHBEIEMA- |
| Spam | .Spam |
| Junk E-mail | .Junk E-mail |
| Junk | .Junk |
Более подробно вопрос автоматического удаления спама рассмотрим отдельно.
Удаление писем на основе содержимого письма
Перейдем к еще более сложному примеру, но в самой простой его модификации. Допустим, вам нужно удалить все письма, адресованные на какой-то адрес. Это может быть актуально в тех случаях, если используется алиас, а с него идет перенаправление на множество ящиков. В итоге, письма, адресованные на этот алиас распространяются по всей почтовой базе в разные ящики. При этом данные письма теряют актуальность со временем, и хранить их нет необходимости.
В данном примере я сделаю еще одно усложнение. Мало того, что мы будем логировать все удаления писем из базы, мы еще будем их сохранять и раскладывать по папкам с названиями ящиков, из которых они были удалены. Дополнительно, удаленные письма будут складываться в директории с именами в виде даты удаления. Таким образом мы полностью застрахуем себя от удаления нужного письма. Даже если это произойдет, то быстро сможем найти это удаленное письмо. Дополнительно будем записывать в лог файл время начала и завершения поиска и удаления. Так как процесс поиска по содержимому достаточно длительный, рекомендую следить за временем его выполнения, чтобы укладываться в окна с малой нагрузкой сервера.
#!/bin/bash # формируем список ящиков для очистки mailbox=`ls -l /data/mail/virtual | grep vmail | awk ''` # дата в формате Год-месяц-день_час-минута-секунда data_full=`date +"%Y-%m-%d_%H-%M-%S"` # дата в формате Год-месяц-день data=`date +"%Y-%m-%d"` # директория для хранения копий удаленных писем copydir=/backup/mailclean # адрес лог файла с информацией о времени работы скрипта logfile=/backup/mailclean/log.txt echo "============`date +"%Y-%m-%d"`============" >> $logfile echo "`date +"%H-%M-%S"` Start mail clean" >> $logfile for box in $mailbox do # создаем директории с именами ящиков и текущей даты для копий удаленных писем mkdir -p $copydir/$box/mail/$data # формируем список всех писем в ящике /usr/bin/find /data/mail/virtual/$box/Maildir -type f -name "*mailsrv*" -mtime +30 -daystart | while read a ; do # ищем в содержимом письма адрес получателя zabbix@mailsrv.ru и записываем имена таких писем в индивидуальный файл для каждого ящика grep -E -R -l -I "*for ;*" "$a" >> $copydir/$box/copy-$data_full.txt done # пишем название ящика в общий лог файл echo "=========$box=========" >> $copydir/$data_full-all.txt # записываем в общий лог файл все удаленные письма каждого ящика за конкретную дату очистки cat $copydir/$box/copy-$data_full.txt >> $copydir/$data_full-all.txt # формируем список писем ящика на удаление cat $copydir/$box/copy-$data_full.txt | while read i ; do # копируем письмо из реального ящика в папку архива (рекомендую использовать во время отладки) cp -p "$i" $copydir/$box/mail/$data # перемещаем письмо из реального ящика в архив (использовать после отладки) # mv "$i" $copydir/$box/mail/$data done done # записываем время завершения работы скрипта echo "`date +"%H-%M-%S"` End mail clean" >> $logfile echo "================================= *mailsrv*" -mtime +30 -daystart | while read a ; do
В данном случае mailsrv это часть имени сервера. В формате maildir в именах файлов писем всегда присутствует имя сервера. Эта маска позволяет найти только файлы почты, отбросив остальные служебные файлы, которые могут там быть. А они там точно будут, например, индексы dovecot, правила sieve и др. Не забудьте поменять эту маску на свою в соответствии с именем сервера.
Строка для поиска получателя письма *for ;* именно в таком виде взята из служебных заголовков. Даже если письма различными фильтрами будут перемещаться в другие ящики, первоначальный получатель писем все равно будет зафиксирован этой строкой.
Предупреждаю, что не нужно слепо использовать этот и другие скрипты. Они приведены в основном для того, чтобы показать принципы и идеи, которые я использую. Эти скрипты нужно внимательно посмотреть, понять, что происходит в каждой строке, и изменить под свои нужды. В готовом виде вряд ли вам нужен будет именно такой скрипт. Тут все очень индивидуально и требует осознания всех выполняемых действий.
Если вам нужно автоматом удалить в почтовом архиве все спам письма, которые ваша антиспам система помечает как спам, то можете взять служебный заголовок, который ставит эта система и использовать его. Например, Касперский антиспам вот так помечает все спамовые письма:
X-KLMS-AntiSpam-Status: spam
Соответственно я ищу все письма с таким служебным заголовком и что-то с ними делаю. Например, перемещаю в папку spam или удаляю. Но тут нужно быть внимательным и делать все аккуратно. Например, если какое-то письмо фильтр по ошибке пометил спамом, у пользователя не будет никакой возможности его сохранить, если вы будете автоматически удалять эти письма. Тут нужно думать в конкретной ситуации как поступить. На текущий момент я не использую подобные правила для удаления или перемещения почты, только для поиска, чтобы оценить объем спамовой почты. Если он слишком велик и его чистка позволит высвободить значительные объемы дискового пространства, то я начинаю что-то делать с ящиками пользователей. Чаще всего напрягать админов на местах, чтобы они стимулировали пользователей к самостоятельной ручной очистке спама. Если же спама не много, то я просто ничего не делаю.
Фильтрация писем на основе темы письма
Рассмотрим более сложный вариант предыдущего скрипта. Там мы фильтровали письма на основе содержимого служебных заголовков. Но если мы захотим отфильтровать почту по теме письма, то сходу у нас ничего не получится. С темой письма возникают сложности из-за того, что она закодирована в base64, если в ней используются русский язык. Вот простой пример. У нас есть письмо с темой "Как дела?". Используем base64 декодер и смотрим, как будет выглядеть тема сообщения в исходнике письма.
Как дела? - 0JrQsNC6INC00LXQu9CwPw==
А вот, что вы увидите в заголовке письма со всеми служебными добавлениями:
Subject: =?UTF-8?B?0JrQsNC6INC00LXQu9CwPw==?=
Вам нужно будет отбросить сначала кодировку =?UTF-8?, потом не знаю, что означающие символы B?, затем в конце еще вот это ?=. Так вы получаете искомую фразу. Теперь представьте, что кто-то ответит на это письмо. Тема сообщения станет Re: Как дела?. В base64 эта фраза будет выглядеть совершенно по-иному:
Re: Как дела? UmU6INCa0LDQuiDQtNC10LvQsD8=
И вот как в реальном заголовке:
Subject: =?UTF-8?B?UmU6INCa0LDQuiDQtNC10LvQsD8=?=
Сложность добавляет еще то, что разные почтовые клиенты используют разную кодировку в теме письма. Мне встречались как UTF-8, так и WIN-1251. То есть для того, чтобы нормально раскодировать и читать тему сообщения, вам нужно сделать обработку на декодирование, на отбрасывание служебных символов. Еще в процессе тестирования я заметил, что если вы используете не весь текст темы, а только ее часть, то закодированная строка поиска может немного не совпадать с той, что будет в теме письма. Изменения могут возникнуть из-за заглавных/строчных букв, пробелов, запятых и т.д. В общем, я не осилил эту тему, так как надо очень плотно погрузиться в предмет и написать много различных проверок и условий. У меня просто не хватило терпения все сделать красиво, чтобы скрипт работал надежно.
Поступил я в итоге по-другому, более просто и топорно, зато надежно. Допустим, вам нужно, чтобы какая-то переписка не хранилась на сервере дольше определенного времени. Это может быть конфиденциальная информация. Например, вы сканируете документы с отправкой на почту и вам нужно, чтобы сканы там не хранились бесконечно долго. Настраиваете на МФУ шаблон темы сообщения, добавляя в начало такую строку - !del. Затем переводите его в base64, добавляя еще фразы с Re: и Fwd: на случай, если эти письма могут куда-то пересылаться или писаться ответы. Конечно, сканеру вряд ли кто-то будет отвечать, но, возможно, для вашей темы сообщения это будет актуально.
| !del | IWRlbA== |
| Re: !del | UmU6ICFkZWw= |
| Fwd: !del | RndkOiAhZGVs |
Дальше берете скрипт из предыдущего примера и меняете там строку поиска на новую:
grep -E -R -l -I "Subject:.*IWRlb.*|Subject:.*RndkOiAhZGVs.*|Subject:.*UmU6ICFkZWw.*" "$a" >> $copydir/$box/copy-$data_full.txt
Эта строка найдет во всех письмах, сформированных в список предыдущей командой, темы сообщения !del, Re: !del, Fwd: !del и скопирует пути и имена файлов в список. Потом вы можете на свое усмотрение работать с этим списком.
Еще несколько примеров работы с почтовой базой
Этот пример будет актуален, если вы используете почтовые ящики, куда копируется абсолютно вся переписка вашего сервера. Допустим, у вас есть ящик out@mailsrv.ru, куда сохраняется вся уходящая корреспонденция. Если на сервере идет активная переписка, то писем в ящике будет много и искать с помощью какого-то imap клиента будет неудобно, так как он может либо тормозить на большом списке писем, либо вообще отваливаться по таймауту и поиск или сортировка будут невозможны с его помощью. Тогда на помощь придут простые скрипты в консоли сервера. Найдем в этом ящике все письма, отправленные в период между первым и седьмым сентября 2017 года и скопируем их в отдельный ящик.
find /data/mail/virtual/out@mailsrv.ru/Maildir/*/ -newerBt '2017-09-01 00:00' -and -not -newerBt '2017-09-07 00:00' -and -type f | cpio -pdmv /data/mail/virtual/user@mailsrv.ru/Maildir/new
По сути тут просто использовались ключи к команде find. У нее их так много, что я для всех прикладных задач всегда храню готовые конструкции, чтобы заново не вспоминать все ключи и возможности.
Еще полезно бывает посмотреть размер почтовых ящиков. Некоторые пользователи имеют в разы больший объем ящика, чем все остальные. Есть любители хранить в почте презентации, пересылать разбитые на части архивы и т.д. Иногда приходится вручную проверять размеры ящиков, чтобы отдать команду на очистку заполненных сверх меры. Сделать это можно простой командой в директории с ящиками:
# du --max-depth=1 | sort -n -r
Команда выведет размеры всех ящиков и отсортирует их по мере увеличения объема, но при этом объем покажет в байтах, что не очень удобно. Можно вывести директории по алфавиту, но с размером в привычных мегабайтах или гигабайтах, но уже без сортировки.
# du -h --max-depth=1
Еще удобнее отправить сразу вывод в текстовый файл с датой в имени файла, чтобы потом было удобно сравнить с тем, что получилось после чистки почтовой базы.
# du -h --max-depth=1 >> "dirsize_`date +"%Y-%m-%d_%H:%M"`.txt"
Тут можно придумать много всяких способов отсортировать данные для более удобного восприятия, или потом автоматически сравнить размеры ящиков. Я не занимался этим.
Заключение
Поделился тем, что использовал последнее время в работе с почтовыми серверами. По большому счету - ничего особенного. Почтовые сервера на postfix + dovecot чаще всего не требуют частого присмотра. Работают надежно, не требуют к себе повышенного внимания. Достаточно настроить мониторинг postfix и следить за свободным местом, периодически очищая почтовую базу, которая представляет из себя набор обычных файлов.
Так же рекомендую обязательно бэкапить почтовую базу тем или иным способом (можно простым rsync по директории с ящиками) и настроить мониторинг размера бэкапа, чтобы беглым взглядом можно было оценить динамику изменения размера почтовой базы. При желании, можно настроить триггер, реагирующий на те или иные значения базы.
Если у вас есть свои наработки, примеры или замечания к тому, что делаю я, прошу поделиться информацией в комментариях. Если есть вопросы по настройке почтового сервера, создавайте тему на форуме.
Если у вас есть желание научиться строить и поддерживать высокодоступные и надежные системы, научиться непрерывной поставке ПО, мониторингу и логированию web приложений, рекомендую познакомиться с онлайн-курсом «DevOps практики и инструменты» в OTUS. Курс не для новичков, для поступления нужны базовые знания по сетям и установке Linux на виртуалку. Обучение длится 5 месяцев, после чего успешные выпускники курса смогут пройти собеседования у партнеров.
Проверьте себя на вступительном тесте и смотрите подробнее программу по ссылке.
