73 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			73 lines
		
	
	
		
			1.8 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 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'))
 | 
						|
 | 
						|
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
 |