Im aktuellen Stand von ISPConfig ist leider noch kein Automatismus für das Warnen von Benutzern beim Erreichen des E-Mail Quota vorhanden. Das ist nicht wirklich intuitiv und kann zu Ärger führen.
Um dieses Problem zu umgehen kann man bereits vorhandene Monitoring Daten von ISPConfig auswerten und den Benutzer sowie den Administrator darüber informieren.
Das von mir dafür verwendete Skript ist unter /usr/local/ispconfig/server/quota_warning.php abzulegen:
<?php
/*
Send quota warnings
*/
define('SCRIPT_PATH', dirname($_SERVER["SCRIPT_FILENAME"]));
require(SCRIPT_PATH."/lib/config.inc.php");
require(SCRIPT_PATH."/lib/app.inc.php");
set_time_limit(0);
// make sure server_id is always an int
$conf['server_id'] = intval($conf['server_id']);
// Load required base-classes
$app->uses('ini_parser,file,services,getconf');
#######################################################################################################
// send quota warnings
#######################################################################################################
$tmp_rec = $app->db->queryAllRecords("SELECT data from monitor_data WHERE type = 'email_quota' ORDER BY created DESC");
$monitor_data = array();
if(is_array($tmp_rec)) {
foreach ($tmp_rec as $tmp_mon) {
$monitor_data = array_merge_recursive($monitor_data,unserialize($app->db->unquote($tmp_mon['data'])));
}
}
$quota_rec = $app->db->queryAllRecords("SELECT email,quota from mail_user");
$warn_quota10 = array();
$warn_quota5 = array();
if (is_array($quota_rec)) {
foreach ($quota_rec as $qrec) {
$quota = $qrec['quota'];
// <=0 -> skip
if ($quota <= 0) continue;
$email = $qrec['email'];
$monitor_data[$email]['quota'] = $quota;
// Add to warning array
$used = $monitor_data[$email]['used'];
$q10 = $quota*0.9;
$q5 = $quota*0.95;
if ($used>=$q10 && $used<$q5) {
// 10 % warning
$warn_quota10[$email]=array('used'=>$used, 'quota'=>$quota);
} elseif ($used>=$q5) {
// 5 % warning
$warn_quota5[$email]=array('used'=>$used, 'quota'=>$quota);
}
}
}
function humanize($str)
{
if (!is_numeric($str)) return "n/a";
if (round($str/1024,0)<1) return $size . " B";
if (round($str/1048576,0)<1) return round($str/1024,2) . " KB";
if (round($str/1073741824,0)<1) return round($str/1048576,2) . " MB";
return round($str/1073741824,2) . " GB";
}
foreach ($warn_quota10 as $email => $rec)
{
$quota = humanize($rec['quota']);
$used = humanize($rec['used']);
$to = "root";
$subject = "Maildir quota at 10%";
$message = "Maildir quota for ".$email." is at " . $used . " of max " . $quota . "!";
$headers = "From: root";
mail($to,$subject,$message,$headers);
mail($email,$subject,$message,$headers);
}
foreach ($warn_quota5 as $email => $rec)
{
$quota = humanize($rec['quota']);
$used = humanize($rec['used']);
$to = "root";
$subject = "Maildir quota at 5%";
$message = "Maildir quota for ".$email." is at " . $used . " of max " . $quota . "!";
$headers = "From: root";
mail($to,$subject,$message,$headers);
mail($email,$subject,$message,$headers);
}
Das Skript führt man am Besten über ein Shell Skript aus (/usr/local/ispconfig/server/quota_warning.sh):
#!/bin/sh PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/sbin:/usr/local/bin:/usr/X11R6/bin /usr/bin/php -q /usr/local/ispconfig/server/quota_warning.php
Und das führt man über Crontab aus (crontab -e):
3 0 * * * /usr/local/ispconfig/server/quota_warning.sh