95 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			95 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
| #!/usr/bin/python3
 | |
| 
 | |
| import smtplib
 | |
| import os
 | |
| from email.mime.multipart import MIMEMultipart
 | |
| from email.mime.text import MIMEText
 | |
| from email.utils import COMMASPACE, formatdate
 | |
| import jinja2
 | |
| from jinja2 import Template
 | |
| import redis
 | |
| import time
 | |
| import json
 | |
| import sys
 | |
| import html2text
 | |
| 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)
 | |
| text = html2text.html2text(html)
 | |
| 
 | |
| 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_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/lib/dovecot/dovecot-lda', '-d', username, '-o', '"plugin/quota=maildir:User quota:noenforcing"'], stdout=PIPE, stdin=PIPE, stderr=STDOUT)
 | |
|   p.communicate(input=bytes(msg.as_string(), 'utf-8'))
 | |
| 
 | |
|   domain = username.split("@")[-1]
 | |
|   if domain and r.hget('QW_BCC', domain):
 | |
|     bcc_data = json.loads(r.hget('QW_BCC', domain))
 | |
|     bcc_rcpts = bcc_data['bcc_rcpts']
 | |
|     if bcc_data['active'] == 1:
 | |
|       for rcpt in bcc_rcpts:
 | |
|         msg = MIMEMultipart('alternative')
 | |
|         msg['From'] = username
 | |
|         subject = r.get('QW_SUBJ') or "Quota warning"
 | |
|         msg['Subject'] = subject + ' (' + username + ')'
 | |
|         msg['Date'] = formatdate(localtime = True)
 | |
|         text_part = MIMEText(text, 'plain', 'utf-8')
 | |
|         html_part = MIMEText(html, 'html', 'utf-8')
 | |
|         msg.attach(text_part)
 | |
|         msg.attach(html_part)
 | |
|         msg['To'] = rcpt
 | |
|         server = smtplib.SMTP('postfix', 588, 'quotanotification')
 | |
|         server.ehlo()
 | |
|         server.sendmail(msg['From'], str(rcpt), msg.as_string())
 | |
|         server.quit()
 | |
| 
 | |
| 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
 |