Назад | Перейти на главную страницу

Postfix на квоту домена

Мы используем комбинацию Postfix 2.11.0 и Dovecot 2.2.9 в качестве MTA / MDA. В качестве интерфейса для управления почтовыми доменами и почтовыми ящиками используется postfix.admin.

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

Так например:

domain example.com >> Domain quoata = 20000 MB

Это затем позволит пользователям свободно настраивать свои почтовые ящики любого желаемого размера, но не позволит им использовать в общей сложности более 20 ГБ (распределенных по всем почтовым ящикам).

Чтобы уточнить, я не хочу устанавливать квоту для почтового ящика, которая принудительно связана с этим. Администраторы получают x МБ пространства и могут назначать его по своему усмотрению.

Моей первой мыслью было добавить эту функцию в postfix.admin самостоятельно, добавив новый столбец в таблицу доменов, в которой хранится квота домена. Затем каждый раз при добавлении нового почтового ящика в определенный домен столбец, содержащий текущие квоты почтовых ящиков, будет запрашиваться и суммироваться, а затем проверяться с помощью этого образца кода (это не настоящий код!):

if (SUM(mailbox_quota) + to_add_mailbox_quota > domain_qouta) {
    throw_warning and don't proceed
} 

Но, возможно, я упускаю какую-то особенность, я рад познакомиться с несколькими подходами к этому.

РЕДАКТИРОВАТЬ:

Оценив код postfix.admins, я обнаружил следующее:

 # TODO: detailed error message ("domain quota exceeded", "mailbox quota too big" etc.) via flash_error? Or "available quota: xxx MB"?
        if ( !Config::bool('domain_quota') ) {
            return true; # enforcing domain_quota is disabled - just allow it
        } elseif ($limit['quota'] <= 0) { # TODO: CHECK - 0 (unlimited) is fine, not sure about <= -1 (disabled)...
            $rval = true;
        } elseif ($quota == 0) { # trying to create an unlimited mailbox, but domain quota is set
            return false;
        } else {
            $table_mailbox = table_by_key('mailbox');
            $query = "SELECT SUM(quota) FROM $table_mailbox WHERE domain = '" . escape_string($domain) . "'";
            $query .= " AND username != '" . escape_string($this->id) . "'";
            $result = db_query ($query);
            $row = db_row ($result['result']);
            $cur_quota_total = divide_quota($row[0]); # convert to MB
            if ( ($quota + $cur_quota_total) > $limit['quota'] ) {
                $rval = false;
            } else {
                $rval = true;
            }
        }

        return $rval;

Это должно, если я правильно понимаю, делать именно то, что я сказал выше, если он установлен таким образом в конфигурации (а это так):

// If you want to enforce domain-level quotas set this to 'YES'.
$CONF['domain_quota'] = 'YES';

Но, тем не менее, я могу добавить почтовые ящики с квотой 4 ГБ в домен с принудительной квотой 2 ГБ, но почему?

РЕШЕНИЕ НАЙДЕНО!

Чтобы использовать функцию квотирования домена в postfix 2.3.8, вы должны не только принудительно установить квоту домена, но и установить квоту для пользователей почтовых ящиков в целом.

Это действительно плохо документировано / недокументировано / неясно с точки зрения администраторов. Надеюсь, это кому-то поможет в будущем.

Это должно быть в вашем config.inc.php:

// When you want to enforce quota for your mailbox users set this to 'YES'.
$CONF['quota'] = 'YES';
// If you want to enforce domain-level quotas set this to 'YES'.
$CONF['domain_quota'] = 'YES';