|
@@ -0,0 +1,70 @@
|
|
|
+#!/usr/bin/python
|
|
|
+
|
|
|
+import smtplib
|
|
|
+import os
|
|
|
+from email.MIMEMultipart import MIMEMultipart
|
|
|
+from email.MIMEText import MIMEText
|
|
|
+from email.Utils import COMMASPACE, formatdate
|
|
|
+import jinja2
|
|
|
+from jinja2 import Template
|
|
|
+import redis
|
|
|
+import time
|
|
|
+import sys
|
|
|
+from subprocess import Popen, PIPE, STDOUT
|
|
|
+
|
|
|
+if len(sys.argv) > 2:
|
|
|
+ percent = int(sys.argv[1])
|
|
|
+ username = str(sys.argv[2])
|
|
|
+else:
|
|
|
+ print "Args missing"
|
|
|
+ sys.exit(1)
|
|
|
+
|
|
|
+while True:
|
|
|
+ try:
|
|
|
+ r = redis.StrictRedis(host='redis', decode_responses=True, port=6379, db=0)
|
|
|
+ r.ping()
|
|
|
+ except Exception as ex:
|
|
|
+ print '%s - trying again...' % (ex)
|
|
|
+ time.sleep(3)
|
|
|
+ else:
|
|
|
+ break
|
|
|
+
|
|
|
+if r.get('QW_HTML'):
|
|
|
+ try:
|
|
|
+ template = Template(r.get('QW_HTML'))
|
|
|
+ except:
|
|
|
+ print "Error: Cannot parse quarantine template, falling back to default template."
|
|
|
+ with open('/templates/quota.tpl') as file_:
|
|
|
+ template = Template(file_.read())
|
|
|
+else:
|
|
|
+ with open('/templates/quota.tpl') as file_:
|
|
|
+ template = Template(file_.read())
|
|
|
+
|
|
|
+html = template.render(username=username, percent=percent)
|
|
|
+try:
|
|
|
+ msg = MIMEMultipart('alternative')
|
|
|
+ msg['From'] = r.get('QW_SENDER') or "quota-warning@localhost"
|
|
|
+ msg['Subject'] = r.get('QW_SUBJ') or "Quota warning"
|
|
|
+ msg['Date'] = formatdate(localtime = True)
|
|
|
+ text = "Your mailbox is almost full, currently %d%% are in use. Please consider deleting old messages." % (percent)
|
|
|
+ text_part = MIMEText(text, 'plain', 'utf-8')
|
|
|
+ html_part = MIMEText(html, 'html', 'utf-8')
|
|
|
+ msg.attach(text_part)
|
|
|
+ msg.attach(html_part)
|
|
|
+ msg['To'] = username
|
|
|
+ p = Popen(['/usr/local/libexec/dovecot/dovecot-lda', '-d', username, '-o', '"plugin/quota=maildir:User quota:noenforcing"'], stdout=PIPE, stdin=PIPE, stderr=STDOUT)
|
|
|
+ p.communicate(input=msg.as_string())
|
|
|
+
|
|
|
+except Exception as ex:
|
|
|
+ print 'Failed to send quota notification: %s' % (ex)
|
|
|
+ sys.exit(1)
|
|
|
+
|
|
|
+try:
|
|
|
+ sys.stdout.close()
|
|
|
+except:
|
|
|
+ pass
|
|
|
+
|
|
|
+try:
|
|
|
+ sys.stderr.close()
|
|
|
+except:
|
|
|
+ pass
|