每个域的 Postfix 配额

每个域的 Postfix 配额

我们结合使用 Postfix 2.11.0 和 Dovecot 2.2.9 作为 MTA/MDA。使用 postfix.admin 作为管理邮件域和邮箱的前端。

由于允许用户向其域添加邮箱很容易失控,因此我想为每个域设置最大邮箱大小。

例如:

domain example.com >> Domain quoata = 20000 MB

这样,用户可以自由设置其邮箱的大小,但总共不能超过 20 GB(分布在所有邮箱中)。

澄清一下,我不想设置强制的每个邮箱配额。管理员获得 x MB 的空间,并可以根据自己的喜好进行分配。

我的第一个想法是自己将此功能添加到 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 GB 配额的邮箱添加到强制执行 2 GB 配额的域,但是为什么呢?

答案1

找到解决方案!

要使用 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';

相关内容