我们结合使用 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';