#!/usr/bin/env python2 # -*- coding: utf-8 -*- from __future__ import print_function import sys, os, random, MySQLdb, subprocess, time, string, argparse import urllib, smtplib, email.mime.text, email.utils from settings import * from templates import * # setup random.seed = os.urandom(32) # DB stuff db = MySQLdb.connect(user=DB_USER, passwd=DB_PW, db=DB_NAME, charset='utf8') def db_execute(query, args): cursor = db.cursor(MySQLdb.cursors.DictCursor) if len(args) == 1 and isinstance(args[0], dict): args = args[0] # einzelnes dict weiterreichen cursor.execute(query, args) return cursor def db_fetch_one_row(query, *args): cursor = db_execute(query, args) result = cursor.fetchone() if cursor.fetchone() is not None: raise Exception("Found more than one result, only one was expected") cursor.close() return result def db_run(query, *args): cursor = db_execute(query, args) cursor.close() def new_user(name, hash, ): db_run('INSERT INTO users (username, password, active) VALUES (%s, %s, -1)', name, hash) def new_alias(name, alias): db_run('INSERT INTO aliases (mail, user) VALUES (%s, %s)', name, alias) # interaction with dbadm pw def gen_hash(plain): return subprocess.check_output(["doveadm", "pw", "-s", "SHA512-CRYPT", "-r", str(64*1024), "-p", plain]).decode('utf-8').strip() # more tools def gen_pw(length = 12): chars = string.ascii_letters + string.digits return ''.join(random.choice(chars) for i in range(length)) def send_mail(user, mail, password, forward): assert password is not None, "Sending mail for non-password accounts not yet supported." incoming = (INCOMING_FORWARD if forward else INCOMING_IMAP).format(password=password, user=user, host=HOST, forward=forward) text = TEMPLATE.format(password=password, user=user, host=HOST, forward=forward, incoming=incoming) subject = SUBJECT.format(user=user, host=HOST) # construct mail content msg = email.mime.text.MIMEText(text, 'plain', 'utf-8') msg['Subject'] = subject msg['Date'] = email.utils.formatdate(localtime=True) msg['From'] = MAIL_ADDR msg['To'] = mail msg['Bcc'] = MAIL_ADDR # put into envelope and send s = smtplib.SMTP('localhost') s.sendmail(MAIL_ADDR, [mail, MAIL_ADDR], msg.as_string()) s.quit() # read command-line arguments parser = argparse.ArgumentParser(description='Create a new e-mail user') parser.add_argument("-u", "--username", dest="username", required=True, help="The name of the user (that's also its address).") parser.add_argument("-f", "--forward", dest="forward", help="Where to forward emails to.") #parser.add_argument("-p", "--password", # action="store_true", dest="password", # help="Whether to create an account and password for this user.") parser.add_argument("-m", "--mail", nargs='?', action="store", dest="mail", const=True, help="Whether to notify the user about their new account.") args = parser.parse_args() # sanity check if args.mail == True: if args.forward: args.mail = args.forward else: print("Whom should I send the mail to? Please use `-m
`.") sys.exit(1) domain = args.username.split('@')[-1] if domain not in DOMAINS: print("{} is not a domain we can handle mail for.".format(domain)) sys.exit(1) # do stuff password = gen_pw() new_user(args.username, gen_hash(password)) print("Created {} with password {}".format(args.username, password)) if args.forward: new_alias(args.username, args.forward) print("Forwarded {} to {}".format(args.username, args.forward)) if args.mail: send_mail(args.username, args.mail, password, args.forward) print("Sent mail about the new account to {}".format(args.mail))