diff --git a/README.md b/README.md index 36f298e9..cb2cdf86 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,16 @@ There is baisc support for quotas in the control panel now. To set quotas from column for the user in the `users.sqlite` database. The `quota` column is text and allows for the `M` and `G` suffixes for megabytes and gigabytes respectively. No spaces should be used in the quota value (e.g. `2G` or `100M`). +Todo +---- + +* Get `postfix` to support quotas. See https://blog.sys4.de/postfix-dovecot-mailbox-quota-en.html for a start. Right + now the quota message store size is not calculated unless the user accesses the IMAP server (Dovecot). Right now postfix + does not take quotas into account before delivering a message. + +* Allow Trash to have a grace percentage to allow users whose quota is full to delete messages. + + \[BEGIN Official README] Mail-in-a-Box diff --git a/management/mailconfig.py b/management/mailconfig.py index 3a471a80..9cb79b0d 100755 --- a/management/mailconfig.py +++ b/management/mailconfig.py @@ -105,6 +105,18 @@ def get_mail_users(env): users = [ row[0] for row in c.fetchall() ] return utils.sort_email_addresses(users, env) +def sizeof_fmt(num): + for unit in ['','K','M','G','T']: + if abs(num) < 1024.0: + if abs(num) > 99: + return "%3.0f%s" % (num, unit) + else: + return "%2.1f%s" % (num, unit) + + num /= 1024.0 + + return str(num) + def get_mail_users_ex(env, with_archived=False): # Returns a complex data structure of all user accounts, optionally # including archived (status="inactive") accounts. @@ -136,22 +148,24 @@ def get_mail_users_ex(env, with_archived=False): box_size = 0 box_count = 0 box_quota = '' - # try: - # with open('/home/user-data/mail/mailboxes/%s/%s/maildirsize' % (domain, user), 'r') as f: - # box_quota = f.readline() - # for line in f.readlines(): - # (size, count) = line.split(' ') - # box_size += int(size) - # box_count += int(count) - # except: - # box_size = '?' + try: + dirsize_file = os.path.join(env['STORAGE_ROOT'], 'mail/mailboxes/%s/%s/maildirsize' % (domain, user)) + with open(dirsize_file, 'r') as f: + box_quota = f.readline() + for line in f.readlines(): + (size, count) = line.split(' ') + box_size += int(size) + box_count += int(count) + except: + box_size = '?' + box_count = '?' user = { "email": email, "privileges": parse_privs(privileges), "quota": quota, "box_quota": box_quota, - "box_size": '%iK' % int(box_size / 1024), + "box_size": sizeof_fmt(box_size) if box_size != '?' else box_size, "box_count": box_count, "status": "active", } diff --git a/management/templates/users.html b/management/templates/users.html index 0175b929..ee22b316 100644 --- a/management/templates/users.html +++ b/management/templates/users.html @@ -42,7 +42,8 @@ Email Address - Box Size + Messages + Size Quota Actions @@ -56,6 +57,7 @@ + @@ -163,6 +165,7 @@ function show_users() { n.attr('data-email', user.email); n.attr('data-quota', user.quota); n.find('.address').text(user.email); + n.find('.box-count').text(user.box_count); n.find('.box-size').text(user.box_size); n.find('.quota').text((user.quota == '0') ? 'unlimited' : user.quota); n2.find('.restore_info tt').text(user.mailbox);