mcramer
2013-07-08 ed1260a13c005e5cdbdafacf28fbbdc1ddbe2d56
- Implemented:
- send quota notifications each X days instead of each day
- send notification when quota is ok again
- cleaned up mail sending code


5 files added
8 files modified
433 ■■■■■ changed files
install/sql/incremental/upd_0053.sql 2 ●●●●● patch | view | raw | blame | history
install/sql/ispconfig3.sql 2 ●●●●● patch | view | raw | blame | history
install/tpl/server.ini.master 4 ●●●● patch | view | raw | blame | history
interface/web/admin/form/server_config.tform.php 28 ●●●●● patch | view | raw | blame | history
interface/web/admin/lib/lang/de_server_config.lng 3 ●●●●● patch | view | raw | blame | history
interface/web/admin/lib/lang/en_server_config.lng 5 ●●●● patch | view | raw | blame | history
interface/web/admin/templates/server_config_mail_edit.htm 10 ●●●●● patch | view | raw | blame | history
interface/web/admin/templates/server_config_web_edit.htm 10 ●●●●● patch | view | raw | blame | history
server/conf/mail/mail_quota_ok_notification_de.txt 14 ●●●●● patch | view | raw | blame | history
server/conf/mail/mail_quota_ok_notification_en.txt 14 ●●●●● patch | view | raw | blame | history
server/conf/mail/web_quota_ok_notification_de.txt 14 ●●●●● patch | view | raw | blame | history
server/conf/mail/web_quota_ok_notification_en.txt 14 ●●●●● patch | view | raw | blame | history
server/cron_daily.php 313 ●●●● patch | view | raw | blame | history
install/sql/incremental/upd_0053.sql
New file
@@ -0,0 +1,2 @@
ALTER TABLE `web_domain` ADD `last_quota_notification` DATE NULL DEFAULT NULL;
ALTER TABLE `mail_user` ADD `last_quota_notification` DATE NULL DEFAULT NULL;
install/sql/ispconfig3.sql
@@ -837,6 +837,7 @@
  `disablesieve` enum('n','y') NOT NULL default 'n',
  `disablelda` enum('n','y') NOT NULL default 'n',
  `disabledoveadm` enum('n','y') NOT NULL default 'n',
  `last_quota_notification` date NULL default NULL,
  PRIMARY KEY  (`mailuser_id`),
  KEY `server_id` (`server_id`,`email`),
  KEY `email_access` (`email`,`access`)
@@ -1758,6 +1759,7 @@
  `traffic_quota_lock` enum('n','y') NOT NULL default 'n',
  `fastcgi_php_version` varchar(255) DEFAULT NULL,
  `proxy_directives` mediumtext,
  `last_quota_notification` date NULL default NULL,
  PRIMARY KEY  (`domain_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
install/tpl/server.ini.master
@@ -35,6 +35,8 @@
realtime_blackhole_list=
overquota_notify_admin=y
overquota_notify_client=y
overquota_notify_freq=7
overquota_notify_onok=n
[getmail]
getmail_config_dir=/etc/getmail
@@ -83,6 +85,8 @@
web_folder_protection=y
overquota_notify_admin=y
overquota_notify_client=y
overquota_notify_freq=7
overquota_notify_onok=n
[dns]
bind_user=root
interface/web/admin/form/server_config.tform.php
@@ -339,6 +339,20 @@
            'default' => 'y',
            'value' => array(0 => 'n', 1 => 'y')
        ),
        'overquota_notify_freq' => array(
            'datatype' => 'INTEGER',
            'formtype' => 'TEXT',
            'default' => '7',
            'value' => '',
            'width' => '20',
            'maxlength' => '255'
        ),
        'overquota_notify_onok' => array(
            'datatype' => 'VARCHAR',
            'formtype' => 'CHECKBOX',
            'default' => 'n',
            'value' => array(0 => 'n', 1 => 'y')
        ),
    ##################################
    # ENDE Datatable fields
    ##################################
@@ -565,6 +579,20 @@
            'default' => 'y',
            'value' => array(0 => 'n', 1 => 'y')
        ),
        'overquota_notify_freq' => array(
            'datatype' => 'INTEGER',
            'formtype' => 'TEXT',
            'default' => '7',
            'value' => '',
            'width' => '20',
            'maxlength' => '255'
        ),
        'overquota_notify_onok' => array(
            'datatype' => 'VARCHAR',
            'formtype' => 'CHECKBOX',
            'default' => 'n',
            'value' => array(0 => 'n', 1 => 'y')
        ),
        'user' => array(
            'datatype' => 'VARCHAR',
            'formtype' => 'TEXT',
interface/web/admin/lib/lang/de_server_config.lng
@@ -173,4 +173,7 @@
$wb['rbl_error_regex'] = 'Bitte geben Sie gültige RBL-Hostnamen an.';
$wb['overquota_notify_admin_txt'] = 'Quota-Warnungen an den Administrator senden';
$wb['overquota_notify_client_txt'] = 'Quota-Warnungen an den Kunden senden';
$wb['overquota_notify_onok_txt'] = 'Meldung an den Kunden senden, wenn Belegung wieder ok';
$wb['overquota_notify_freq_txt'] = 'Quota-Warnung alle X Tage versenden';
$wb['overquota_notify_freq_note_txt'] = '0 = Meldung nur einmalig versenden, keine Wiederholung';
?>
interface/web/admin/lib/lang/en_server_config.lng
@@ -172,5 +172,8 @@
$wb["overtraffic_notify_client_txt"] = 'Send overtraffic notification to client';
$wb["rbl_error_regex"] = 'Please specify valid RBL hostnames.';
$wb["overquota_notify_admin_txt"] = 'Send quota warnings to admin';
$wb["overquota_notify_client_txt"] = 'Send quota warnings to client';
$wb["overquota_notify_client_txt"] = 'Send quota warnings to client';
$wb["overquota_notify_onok_txt"] = 'Send quota ok message to client';
$wb['overquota_notify_freq_txt'] = 'Send quota warning each X days';
$wb['overquota_notify_freq_note_txt'] = '0 = send message just once, no repeated messages';
?>
interface/web/admin/templates/server_config_mail_edit.htm
@@ -93,6 +93,16 @@
                    {tmpl_var name='overquota_notify_client'}
                </div>
            </div>
            <div class="ctrlHolder">
                <label for="overquota_notify_freq">{tmpl_var name='overquota_notify_freq_txt'}</label>
                <input name="overquota_notify_freq" id="overquota_notify_freq" value="{tmpl_var name='overquota_notify_freq'}" size="40" maxlength="255" type="text" class="textInput" />&nbsp;{tmpl_var name='overquota_notify_freq_note_txt'}
            </div>
            <div class="ctrlHolder">
                <p class="label">{tmpl_var name='overquota_notify_onok_txt'}</p>
                <div class="multiField">
                    {tmpl_var name='overquota_notify_onok'}
                </div>
            </div>
        </fieldset>
            
        <input type="hidden" name="id" value="{tmpl_var name='id'}">
interface/web/admin/templates/server_config_web_edit.htm
@@ -127,6 +127,16 @@
                    {tmpl_var name='overquota_notify_client'}
                </div>
            </div>
            <div class="ctrlHolder">
                <label for="overquota_notify_freq">{tmpl_var name='overquota_notify_freq_txt'}</label>
                <input name="overquota_notify_freq" id="overquota_notify_freq" value="{tmpl_var name='overquota_notify_freq'}" size="40" maxlength="255" type="text" class="textInput" />&nbsp;{tmpl_var name='overquota_notify_freq_note_txt'}
            </div>
            <div class="ctrlHolder">
                <p class="label">{tmpl_var name='overquota_notify_onok_txt'}</p>
                <div class="multiField">
                    {tmpl_var name='overquota_notify_onok'}
                </div>
            </div>
            <div class="subsectiontoggle"><span></span>{tmpl_var name='ssl_settings_txt'}<em></em></div>
            <div style="display:none;">
                <div class="ctrlHolder">
server/conf/mail/mail_quota_ok_notification_de.txt
New file
@@ -0,0 +1,14 @@
MIME-Version: 1.0
Content-type: text/plain; charset=utf-8
Content-Transfer-Encoding: 8bit
From: {admin_mail}
Reply-To: {admin_mail}
Subject: E-Mail Kontobelegungshinweis
Der belegte Speicherplatz Ihres E-Mail Kontos {email} ist wieder ok.
E-Mail Konto:             {email}
Name:                {name}
Belegter Speicher:        {used}
Verfügbarer Speicher:        {quota}
Belegt:                {ratio}
server/conf/mail/mail_quota_ok_notification_en.txt
New file
@@ -0,0 +1,14 @@
MIME-Version: 1.0
Content-type: text/plain; charset=utf-8
Content-Transfer-Encoding: 8bit
From: {admin_mail}
Reply-To: {admin_mail}
Subject: Mailbox quota ok
The mailbox {email} is no longer near or over quota.
Mailbox:            {email}
Name:                {name}
Used space:            {used}
Quota:                {quota}
Usage ratio:            {ratio}
server/conf/mail/web_quota_ok_notification_de.txt
New file
@@ -0,0 +1,14 @@
MIME-Version: 1.0
Content-type: text/plain; charset=utf-8
Content-Transfer-Encoding: 8bit
From: {admin_mail}
Reply-To: {admin_mail}
Subject: Webseiten-Speicherhinweis
Der belegte Speicherplatz Ihrer Webseite {domain} ist wieder ok.
Webseite:                        {domain}
Belegter Speicherplatz:                    {used}
Verfügbarer Speicherplatz:                {soft}
Verfügbarer Speicherplatz (hard quota):            {hard}
Belegter Speicher in %:                    {ratio}
server/conf/mail/web_quota_ok_notification_en.txt
New file
@@ -0,0 +1,14 @@
MIME-Version: 1.0
Content-type: text/plain; charset=utf-8
Content-Transfer-Encoding: 8bit
From: {admin_mail}
Reply-To: {admin_mail}
Subject: Website quota ok
The website {domain} is no longer near or over quota.
Domain:         {domain}
Used space:        {used}
Soft limit:        {soft}
Hard limit:        {hard}
Usage ratio:        {ratio}
server/cron_daily.php
@@ -641,6 +641,64 @@
    }
}
#########
// function for sending notification emails
#########
function send_notification_email($template, $placeholders, $recipients) {
    global $conf;
    if(!is_array($recipients) || count($recipients) < 1) return false;
    if(!is_array($replacements)) $replacements = array();
    if(file_exists($conf['rootpath'].'/conf-custom/mail/' . $template . '_'.$conf['language'].'.txt')) {
        $lines = file($conf['rootpath'].'/conf-custom/mail/' . $template . '_'.$conf['language'].'.txt');
    } elseif(file_exists($conf['rootpath'].'/conf-custom/mail/' . $template . '_en.txt')) {
        $lines = file($conf['rootpath'].'/conf-custom/mail/' . $template . '_en.txt');
    } elseif(file_exists($conf['rootpath'].'/conf/mail/' . $template . '_'.$conf['language'].'.txt')) {
        $lines = file($conf['rootpath'].'/conf/mail/' . $template . '_'.$conf['language'].'.txt');
    } else {
        $lines = file($conf['rootpath'].'/conf/mail/' . $template . '_en.txt');
    }
    //* get mail headers, subject and body
    $mailHeaders = '';
    $mailBody = '';
    $mailSubject = '';
    $inHeader = true;
    for($l = 0; $l < count($lines); $l++) {
        if($lines[$l] == '') {
            $inHeader = false;
            continue;
        }
        if($inHeader == true) {
            $parts = explode(':', $lines[$l], 2);
            if(strtolower($parts[0]) == 'subject') $mailSubject = trim($parts[1]);
            unset($parts);
            $mailHeaders .= trim($lines[$l]) . "\n";
        } else {
            $mailBody .= trim($lines[$l]) . "\n";
        }
    }
    $mailBody = trim($mailBody);
    //* Replace placeholders
    $mailHeaders = strtr($mailHeaders, $placeholders);
    $mailSubject = strtr($mailSubject, $placeholders);
    $mailBody = strtr($mailBody, $placeholders);
    for($r = 0; $r < count($recipients); $r++) {
        mail($recipients[$r], $mailSubject, $mailBody, $mailHeaders);
    }
    unset($mailSubject);
    unset($mailHeaders);
    unset($mailBody);
    unset($lines);
    return true;
}
#######################################################################################################
// enforce traffic quota (run only on the "master-server")
#######################################################################################################
@@ -683,50 +741,15 @@
                $app->log('Traffic quota for '.$rec['domain'].' exceeded. Disabling website.',LOGLEVEL_DEBUG);
                
                //* Send traffic notifications
                if($web_config['overtraffic_notify_admin'] == 'y' || $web_config['overtraffic_notify_client'] == 'y') {
                    if(file_exists($conf['rootpath'].'/conf-custom/mail/web_traffic_notification_'.$conf['language'].'.txt')) {
                        $lines = file($conf['rootpath'].'/conf-custom/mail/web_traffic_notification_'.$conf['language'].'.txt');
                    } elseif(file_exists($conf['rootpath'].'/conf-custom/mail/web_traffic_notification_en.txt')) {
                        $lines = file($conf['rootpath'].'/conf-custom/mail/web_traffic_notification_en.txt');
                    } elseif(file_exists($conf['rootpath'].'/conf/mail/web_traffic_notification_'.$conf['language'].'.txt')) {
                        $lines = file($conf['rootpath'].'/conf/mail/web_traffic_notification_'.$conf['language'].'.txt');
                    } else {
                        $lines = file($conf['rootpath'].'/conf/mail/web_traffic_notification_en.txt');
                    }
                    //* get mail headers, subject and body
                    $mailHeaders = '';
                    $mailBody = '';
                    $mailSubject = '';
                    $inHeader = true;
                    for($l = 0; $l < count($lines); $l++) {
                        if($lines[$l] == '') {
                            $inHeader = false;
                            continue;
                        }
                        if($inHeader == true) {
                            $parts = explode(':', $lines[$l], 2);
                            if(strtolower($parts[0]) == 'subject') $mailSubject = trim($parts[1]);
                            unset($parts);
                            $mailHeaders .= trim($lines[$l]) . "\n";
                        } else {
                            $mailBody .= trim($lines[$l]) . "\n";
                        }
                    }
                    $mailBody = trim($mailBody);
                if($rec['traffic_quota_lock'] != 'y' && ($web_config['overtraffic_notify_admin'] == 'y' || $web_config['overtraffic_notify_client'] == 'y')) {
                    
                    $placeholders = array('{domain}' => $rec['domain'],
                                          '{admin_mail}' => $global_config['admin_mail']);
                    
                    //* Replace placeholders
                    $mailHeaders = strtr($mailHeaders, $placeholders);
                    $mailSubject = strtr($mailSubject, $placeholders);
                    $mailBody = strtr($mailBody, $placeholders);
                    //* send email to admin
                    $recipients = array();
                    //* send email to admin
                    if($global_config['admin_mail'] != '' && $web_config['overtraffic_notify_admin'] == 'y') {
                        mail($global_config['admin_mail'], $mailSubject, $mailBody, $mailHeaders);
                        $recipients[] = $global_config['admin_mail'];
                    }
                    
                    //* Send email to client
@@ -734,13 +757,11 @@
                        $client_group_id = $rec["sys_groupid"];
                        $client = $app->db->queryOneRecord("SELECT client.email FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id");
                        if($client['email'] != '') {
                            mail($client['email'], $mailSubject, $mailBody, $mailHeaders);
                            $recipients[] = $client['email'];
                        }
                    }
                    unset($mailSubject);
                    unset($mailHeaders);
                    unset($mailBody);
                    unset($lines);
                    send_notification_email('web_traffic_notification', $placeholders, $recipients);
                }
                
                
@@ -767,7 +788,7 @@
    $global_config = $app->getconf->get_global_config('mail');
    //* Check website disk quota
    $sql = "SELECT sys_groupid,domain,system_user FROM web_domain WHERE hd_quota > 0 and (type = 'vhost' OR type = 'vhostsubdomain')";
    $sql = "SELECT domain_id,sys_groupid,domain,system_user,last_quota_notification,DATEDIFF(CURDATE(), last_quota_notification) as `notified_before` FROM web_domain WHERE hd_quota > 0 and (type = 'vhost' OR type = 'vhostsubdomain')";
    $records = $app->db->queryAllRecords($sql);
    if(is_array($records) && !empty($records)) {
    
@@ -809,7 +830,39 @@
            }
            
            // send notifications only if 90% or more of the quota are used
            if($used_ratio < 0.9) continue;
            if($used_ratio < 0.9) {
                // reset notification date
                if($rec['last_quota_notification']) $app->dbmaster->datalogUpdate('web_domain', "last_quota_notification = NULL", 'domain_id', $rec['domain_id']);
                // send notification - everything ok again
                if($rec['last_quota_notification'] && $web_config['overquota_notify_onok'] == 'y' && ($web_config['overquota_notify_admin'] == 'y' || $web_config['overquota_notify_client'] == 'y')) {
                    $placeholders = array('{domain}' => $rec['domain'],
                                          '{admin_mail}' => $global_config['admin_mail'],
                                          '{used}' => $rec['used'],
                                          '{soft}' => $rec['soft'],
                                          '{hard}' => $rec['hard'],
                                          '{ratio}' => $rec['ratio']);
                    $recipients = array();
                    //* send email to admin
                    if($global_config['admin_mail'] != '' && $web_config['overquota_notify_admin'] == 'y') {
                        $recipients[] = $global_config['admin_mail'];
                    }
                    //* Send email to client
                    if($web_config['overquota_notify_client'] == 'y') {
                        $client_group_id = $rec["sys_groupid"];
                        $client = $app->db->queryOneRecord("SELECT client.email FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id");
                        if($client['email'] != '') {
                            $recipients[] = $client['email'];
                        }
                    }
                    send_notification_email('web_quota_ok_notification', $placeholders, $recipients);
                }
                continue;
            }
            $rec['ratio'] = number_format($used_ratio * 100, 2, '.', '').'%';
        
            if($rec['used'] > 1024) {
@@ -829,41 +882,15 @@
            } else {
                $rec['hard'] .= ' KB';
            }
            // could a notification be sent?
            $send_notification = false;
            if(!$rec['last_quota_notification']) $send_notification = true; // not yet notified
            elseif($web_config['overquota_notify_freq'] > 0 && $rec['notified_before'] >= $web_config['overquota_notify_freq']) $send_notification = true;
            //* Send quota notifications
            if($web_config['overquota_notify_admin'] == 'y' || $web_config['overquota_notify_client'] == 'y') {
                if(file_exists($conf['rootpath'].'/conf-custom/mail/web_quota_notification_'.$conf['language'].'.txt')) {
                    $lines = file($conf['rootpath'].'/conf-custom/mail/web_quota_notification_'.$conf['language'].'.txt');
                } elseif(file_exists($conf['rootpath'].'/conf-custom/mail/web_quota_notification_en.txt')) {
                    $lines = file($conf['rootpath'].'/conf-custom/mail/web_quota_notification_en.txt');
                } elseif(file_exists($conf['rootpath'].'/conf/mail/web_quota_notification_'.$conf['language'].'.txt')) {
                    $lines = file($conf['rootpath'].'/conf/mail/web_quota_notification_'.$conf['language'].'.txt');
                } else {
                    $lines = file($conf['rootpath'].'/conf/mail/web_quota_notification_en.txt');
                }
                //* get mail headers, subject and body
                $mailHeaders = '';
                $mailBody = '';
                $mailSubject = '';
                $inHeader = true;
                for($l = 0; $l < count($lines); $l++) {
                    if($lines[$l] == '') {
                        $inHeader = false;
                        continue;
                    }
                    if($inHeader == true) {
                        $parts = explode(':', $lines[$l], 2);
                        if(strtolower($parts[0]) == 'subject') $mailSubject = trim($parts[1]);
                        unset($parts);
                        $mailHeaders .= trim($lines[$l]) . "\n";
                    } else {
                        $mailBody .= trim($lines[$l]) . "\n";
                    }
                }
                $mailBody = trim($mailBody);
            if(($web_config['overquota_notify_admin'] == 'y' || $web_config['overquota_notify_client'] == 'y') && $send_notification == true) {
                $app->dbmaster->datalogUpdate('web_domain', "last_quota_notification = CURDATE()", 'domain_id', $rec['domain_id']);
                
                $placeholders = array('{domain}' => $rec['domain'],
                                      '{admin_mail}' => $global_config['admin_mail'],
@@ -871,15 +898,12 @@
                                      '{soft}' => $rec['soft'],
                                      '{hard}' => $rec['hard'],
                                      '{ratio}' => $rec['ratio']);
                //* Replace placeholders
                $mailHeaders = strtr($mailHeaders, $placeholders);
                $mailSubject = strtr($mailSubject, $placeholders);
                $mailBody = strtr($mailBody, $placeholders);
                $recipients = array();
                
                //* send email to admin
                if($global_config['admin_mail'] != '' && $web_config['overquota_notify_admin'] == 'y') {
                    mail($global_config['admin_mail'], $mailSubject, $mailBody, $mailHeaders);
                    $recipients[] = $global_config['admin_mail'];
                }
                
                //* Send email to client
@@ -887,15 +911,11 @@
                    $client_group_id = $rec["sys_groupid"];
                    $client = $app->db->queryOneRecord("SELECT client.email FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id");
                    if($client['email'] != '') {
                        mail($client['email'], $mailSubject, $mailBody, $mailHeaders);
                        $recipients[] = $client['email'];
                    }
                }
                unset($mailSubject);
                unset($mailHeaders);
                unset($mailBody);
                unset($lines);
            }
                send_notification_email('web_quota_notification', $placeholders, $recipients);
            }
        }
    }
}
@@ -910,7 +930,7 @@
    $global_config = $app->getconf->get_global_config('mail');
    //* Check email quota
    $sql = "SELECT sys_groupid,email,name,quota FROM mail_user WHERE quota > 0";
    $sql = "SELECT mailuser_id,sys_groupid,email,name,quota,last_quota_notification,DATEDIFF(CURDATE(), last_quota_notification) as `notified_before` FROM mail_user WHERE quota > 0";
    $records = $app->db->queryAllRecords($sql);
    if(is_array($records) && !empty($records)) {
    
@@ -940,7 +960,39 @@
            $used_ratio = $rec['used']/$rec['quota'];
            
            // send notifications only if 90% or more of the quota are used
            if($used_ratio < 0.9) continue;
            if($used_ratio < 0.9) {
                // reset notification date
                if($rec['last_quota_notification']) $app->dbmaster->datalogUpdate('mail_user', "last_quota_notification = NULL", 'mailuser_id', $rec['mailuser_id']);
                // send notification - everything ok again
                if($rec['last_quota_notification'] && $mail_config['overquota_notify_onok'] == 'y' && ($mail_config['overquota_notify_admin'] == 'y' || $mail_config['overquota_notify_client'] == 'y')) {
                    $placeholders = array('{email}' => $rec['email'],
                              '{admin_mail}' => $global_config['admin_mail'],
                              '{used}' => $rec['used'],
                              '{name}' => $rec['name'],
                              '{quota}' => $rec['quota'],
                              '{ratio}' => $rec['ratio']);
                    $recipients = array();
                    //* send email to admin
                    if($global_config['admin_mail'] != '' && $mail_config['overquota_notify_admin'] == 'y') {
                        $recipients[] = $global_config['admin_mail'];
                    }
                    //* Send email to client
                    if($mail_config['overquota_notify_client'] == 'y') {
                        $client_group_id = $rec["sys_groupid"];
                        $client = $app->db->queryOneRecord("SELECT client.email FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id");
                        if($client['email'] != '') {
                            $recipients[] = $client['email'];
                        }
                    }
                    send_notification_email('mail_quota_ok_notification', $placeholders, $recipients);
                }
                continue;
            }
            $rec['ratio'] = number_format($used_ratio * 100, 2, '.', '').'%';
            
            $rec['quota'] = round($rec['quota'] / 1048576,4).' MB';
@@ -953,69 +1005,38 @@
                
            //* Send quota notifications
            $mail_config = $app->getconf->get_server_config($conf['server_id'], 'mail');
            if($mail_config['overquota_notify_admin'] == 'y' || $mail_config['overquota_notify_client'] == 'y') {
                if(file_exists($conf['rootpath'].'/conf-custom/mail/mail_quota_notification_'.$conf['language'].'.txt')) {
                    $lines = file($conf['rootpath'].'/conf-custom/mail/mail_quota_notification_'.$conf['language'].'.txt');
                } elseif(file_exists($conf['rootpath'].'/conf-custom/mail/mail_quota_notification_en.txt')) {
                    $lines = file($conf['rootpath'].'/conf-custom/mail/mail_quota_notification_en.txt');
                } elseif(file_exists($conf['rootpath'].'/conf/mail/mail_quota_notification_'.$conf['language'].'.txt')) {
                    $lines = file($conf['rootpath'].'/conf/mail/mail_quota_notification_'.$conf['language'].'.txt');
                } else {
                    $lines = file($conf['rootpath'].'/conf/mail/mail_quota_notification_en.txt');
                }
                //* get mail headers, subject and body
                $mailHeaders = '';
                $mailBody = '';
                $mailSubject = '';
                $inHeader = true;
                for($l = 0; $l < count($lines); $l++) {
                    if($lines[$l] == '') {
                        $inHeader = false;
                        continue;
                    }
                    if($inHeader == true) {
                        $parts = explode(':', $lines[$l], 2);
                        if(strtolower($parts[0]) == 'subject') $mailSubject = trim($parts[1]);
                        unset($parts);
                        $mailHeaders .= trim($lines[$l]) . "\n";
                    } else {
                        $mailBody .= trim($lines[$l]) . "\n";
                    }
                }
                $mailBody = trim($mailBody);
            // could a notification be sent?
            $send_notification = false;
            if(!$rec['last_quota_notification']) $send_notification = true; // not yet notified
            elseif($mail_config['overquota_notify_freq'] > 0 && $rec['notified_before'] >= $mail_config['overquota_notify_freq']) $send_notification = true;
            if(($mail_config['overquota_notify_admin'] == 'y' || $mail_config['overquota_notify_client'] == 'y') && $send_notification == true) {
                $app->dbmaster->datalogUpdate('mail_user', "last_quota_notification = CURDATE()", 'mailuser_id', $rec['mailuser_id']);
                
                $placeholders = array('{email}' => $rec['email'],
                                      '{admin_mail}' => $global_config['admin_mail'],
                                      '{used}' => $rec['used'],
                                      '{name}' => $rec['name'],
                                      '{quota}' => $rec['quota'],
                                      '{ratio}' => $rec['ratio']);
                //* Replace placeholders
                $mailHeaders = strtr($mailHeaders, $placeholders);
                $mailSubject = strtr($mailSubject, $placeholders);
                $mailBody = strtr($mailBody, $placeholders);
                          '{admin_mail}' => $global_config['admin_mail'],
                          '{used}' => $rec['used'],
                          '{name}' => $rec['name'],
                          '{quota}' => $rec['quota'],
                          '{ratio}' => $rec['ratio']);
                $recipients = array();
                //* send email to admin
                if($global_config['admin_mail'] != '' && $web_config['overquota_notify_admin'] == 'y') {
                    mail($global_config['admin_mail'], $mailSubject, $mailBody, $mailHeaders);
                if($global_config['admin_mail'] != '' && $mail_config['overquota_notify_admin'] == 'y') {
                    $recipients[] = $global_config['admin_mail'];
                }
                
                //* Send email to client
                if($web_config['overquota_notify_client'] == 'y') {
                if($mail_config['overquota_notify_client'] == 'y') {
                    $client_group_id = $rec["sys_groupid"];
                    $client = $app->db->queryOneRecord("SELECT client.email FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id");
                    if($client['email'] != '') {
                        mail($client['email'], $mailSubject, $mailBody, $mailHeaders);
                        $recipients[] = $client['email'];
                    }
                }
                
                unset($mailSubject);
                unset($mailHeaders);
                unset($mailBody);
                unset($lines);
                send_notification_email('mail_quota_notification', $placeholders, $recipients);
            }    
        }
    }