Настройка квот в Dovecot + PostfixAdmin

Обновлено Обновлено: Опубликовано Опубликовано:

Используемые термины: DovecotPostfixAdmin, Postfix.

При установке почтового сервера на базе Postfix + Dovecot и использовании панели управления почтовыми ящиками PostfixAdmin, по умолчанию, квотирование не настроено — его можно задавать в последней, но работать квоты не будут. Нужна дополнительная настройка...

Настройка Dovecot

Открываем конфигурационный файл10-mail.conf:

vi /etc/dovecot/conf.d/10-mail.conf

Находим строку с mail_plugins и приводим ее к виду:

...
mail_plugins = $mail_plugins quota
...

* данная строка подключает к плагинам дополнительно плагин для управления квотами (quota).

Открываем конфигурационный файл 20-imap.conf:

vi /etc/dovecot/conf.d/20-imap.conf

Находим опцию protocol imap и добавим в нее также возможность использования плагина с квотами:

protocol imap {
  mail_plugins = $mail_plugins imap_quota
}

Открываем конфигурационный файл 10-master.conf:

vi /etc/dovecot/conf.d/10-master.conf

Находим опцию service dict, в ней unix_listener dict и приводим ее к виду:

service dict {
    unix_listener dict {
    mode = 0660
    user = vmail
    group = vmail
  }
}

Открываем файл 90-quota.conf:

vi /etc/dovecot/conf.d/90-quota.conf

Добавляем:

plugin {
  quota = dict:User quota::proxy::quota
}

Открываем основной конфигурационный файл для dovecot:

vi /etc/dovecot/dovecot.conf

Находим раздел dict и снимаем комментарий или добавляем:

dict {
  quota = mysql:/etc/dovecot/dovecot-dict-sql.conf.ext
}

Теперь создаем файл для настройки выгрузки квот:

vi /etc/dovecot/dovecot-dict-sql.conf.ext

connect = host=localhost dbname=postfix user=postfix password=postfix123
map {
  pattern = priv/quota/storage
  table = quota2
  username_field = username
  value_field = bytes
}
map {
  pattern = priv/quota/messages
  table = quota2
  username_field = username
  value_field = messages
}

* где host — сервер mysql, к которому будем подключаться; dbname — имя базы данных, в которой находятся пользователи postfix; user — пользователь, под которым мы подключаемся к базе; password — пароль для подключения к базе. В данном примере мы подключимся к СУБД, которая находится на том же сервере (localhost) к базе postfix под пользователем postfix с паролем postfix123.

Откроем наш файл, в котором мы описываем настройки выборки данных по пользователям из базы данных:

vi /etc/dovecot/dovecot-sql.conf.ext

Находим запрос user_query и дописываем в SELECT CONCAT('*:bytes=', quota) AS quota_rule — у меня в итоге получилось:

user_query = SELECT CONCAT('/home/mail/',LCASE(`domain`),'/',LCASE(`maildir`)), 1024 AS uid, 1024 AS gid, CONCAT('*:bytes=', quota) AS quota_rule FROM mailbox WHERE username = '%u'

Проверяем конфигурационный файл dovecot:

doveconf

... и если команда не вернет ошибку, перезапускаем его:

systemctl restart dovecot

Проверка работы квот

Для начала в командной строке вводим:

doveadm quota get -u user@domain.net

user@domain.net — почтовый пользователь, для которого нужно показать квоту.

Данная команда отобразит квоту для пользователя, например:

Quota name Type    Value Limit                %
User quota STORAGE  16420  50000               32
User quota MESSAGE    14     -                0

* в данном примере почтовый ящик занимает около 16 Мб, а квота около 50 Мб — ящик заполнен на 32%.

Теперь открываем PostfixAdmin - заходим в настройки почтового ящика и ставим небольшой лимит, например, в 5 Мб:

Задаем квоту в PostfixAdmin

Теперь объем ящика превышает лимит:

doveadm quota get -u user@domain.net

Quota name Type    Value Limit                %
User quota STORAGE  16420  5000               328
User quota MESSAGE    14     -                0

* объем превышен, почти, втрое.

Некоторые почтовые клиенты покажут превышение лимита, например, Thunderbird:

Превышение лимита в Mozilla Thunderbird

Оповещения при превышении квоты

Открываем конфигурационный файл 90-quota.conf:

vi /etc/dovecot/conf.d/90-quota.conf

Снимаем комментарий или добавляем данные строки:

plugin {
  quota_warning = storage=95%% quota-warning 95 %u
  quota_warning2 = storage=80%% quota-warning 80 %u
}

* в данном примере мы указываем на необходимость делать 2 предупреждения — первое при достижении объема ящика в 80%, второе — 95%. Сервис dovecot, который будет это обеспечивать, называется quota-warning.

Теперь находим раздел service quota-warning и приводим его к виду:

service quota-warning {
  executable = script /usr/local/bin/quota-warning.sh
  user = dovecot
  unix_listener quota-warning {
    user = vmail
  }
}

* мы создали сервис quota-warning, который будет запускать скрит /usr/local/bin/quota-warning.sh.

Создаем сам скрипт quota-warning.sh:

vi /usr/local/bin/quota-warning.sh

cat << EOF | /usr/libexec/dovecot/dovecot-lda -d $2 -o "plugin/quota=maildir:User quota:noenforcing"
Content-Type: text/html; charset=utf-8
From: Администратор почты <postmaster@dmosk.ru>
Subject: Предупреждение о превышении квоты на почтовый ящик
X-Priority: 2

<p>Размер Вашего почтового ящика составляет $1% от установленного ограничения.<br>
Чтобы уменьшить его размер Вы можете удалить большие письма с вложениями, старые письма или почистить корзину.</p>
EOF

* где postmaster@dmosk.ru — административный почтовый ящик. Сам текст сообщения можно преобразовать, чтобы оно было более презентабельным.

Задаем права на исполнение скрипта:

chmod +x /usr/local/bin/quota-warning.sh

Проверяем, что нам приходят уведомления, запустив скрипт:

/usr/local/bin/quota-warning.sh 80 user@domain.net

* где user@domain.net — наш почтовый ящик, на который должно будет отправиться уведомление.

Перезапускаем службу dovecot:

systemctl restart dovecot

# Серверы # Почта
Дмитрий Моск — частный мастер
Была ли полезна вам эта инструкция?

Да            Нет