import smtplib from datetime import datetime from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText from email.header import Header from geruecht.logger import getDebugLogger from . import mailConfig debug = getDebugLogger() class EmailController(): def __init__(self): debug.info("init email controller") self.smtpServer = mailConfig['URL'] self.port = mailConfig['port'] self.user = mailConfig['user'] self.passwd = mailConfig['passwd'] self.crypt = mailConfig['crypt'] self.email = mailConfig['email'] debug.debug("smtpServer is {{ {} }}, port is {{ {} }}, user is {{ {} }}, crypt is {{ {} }}, email is {{ {} }}".format(self.smtpServer, self.port, self.user, self.crypt, self.email)) def __connect__(self): debug.info('connect to email server') if self.crypt == 'SSL': self.smtp = smtplib.SMTP_SSL(self.smtpServer, self.port) log = self.smtp.ehlo() debug.debug("ehlo is {{ {} }}".format(log)) if self.crypt == 'STARTTLS': self.smtp = smtplib.SMTP(self.smtpServer, self.port) log = self.smtp.ehlo() debug.debug("ehlo is {{ {} }}".format(log)) log = self.smtp.starttls() debug.debug("starttles is {{ {} }}".format(log)) log = self.smtp.login(self.user, self.passwd) debug.debug("login is {{ {} }}".format(log)) def jobTransact(self, user, jobtransact): debug.info("create email jobtransact {{ {} }}for user {{ {} }}".format(jobtransact, user)) date = '{}.{}.{}'.format(jobtransact['on_date']['day'], jobtransact['on_date']['month'], jobtransact['on_date']['year']) from_user = '{} {}'.format(jobtransact['from_user']['firstname'], jobtransact['from_user']['lastname']) job_kind = jobtransact['job_kind'] subject = 'Dienstanfrage am {}'.format(date) text = MIMEText( "Hallo {} {},\n" "{} fragt, ob du am {} den Dienst {} übernehmen willst.\nBeantworte die Anfrage im Userportal von Flaschengeist.".format(user.firstname, user.lastname, from_user, date, job_kind['name']), 'plain') debug.debug("subject is {{ {} }}, text is {{ {} }}".format(subject, text.as_string())) return (subject, text) def jobInvite(self, user, jobtransact): debug.info("create email jobtransact {{ {} }}for user {{ {} }}".format(jobtransact, user)) date = '{}.{}.{}'.format(jobtransact['on_date']['day'], jobtransact['on_date']['month'], jobtransact['on_date']['year']) from_user = '{} {}'.format(jobtransact['from_user']['firstname'], jobtransact['from_user']['lastname']) subject = 'Diensteinladung am {}'.format(date) text = MIMEText( "Hallo {} {},\n" "{} fragt, ob du am {} mit Dienst haben willst.\nBeantworte die Anfrage im Userportal von Flaschengeist.".format(user.firstname, user.lastname, from_user, date), 'plain') debug.debug("subject is {{ {} }}, text is {{ {} }}".format(subject, text.as_string())) return (subject, text) def credit(self, user): debug.info("create email credit for user {{ {} }}".format(user)) subject = Header('Gerücht, bezahle deine Schulden!', 'utf-8') sum = user.getGeruecht(datetime.now().year).getSchulden() if sum < 0: type = 'Schulden' add = 'Bezahle diese umgehend an den Finanzer.' else: type = 'Guthaben' add = '' text = MIMEText( "Hallo {} {},\nDu hast {} im Wert von {:.2f} €. {}\n\nDiese Nachricht wurde automatisch erstellt.".format( user.firstname, user.lastname, type, abs(sum) / 100, add), 'plain') debug.debug("subject is {{ {} }}, text is {{ {} }}".format(subject, text.as_string())) return (subject, text) def passwordReset(self, user, data): debug.info("create email passwort reset for user {{ {} }}".format(user)) subject = Header("Password vergessen") text = MIMEText( "Hallo {} {},\nDu hast dein Password vergessen!\nDies wurde nun mit Flaschengeist zurückgesetzt.\nDein neues Passwort lautet:\n{}\n\nBitte ändere es sofort in deinem Flaschengeistprolif in https://flaschengeist.wu5.de.".format( user.firstname, user.lastname, data['password'] ), 'plain' ) debug.debug("subject is {{ {} }}, text is {{ {} }}".format(subject, text.as_string())) return (subject, text) def sendMail(self, user, type='credit', jobtransact=None, **kwargs): debug.info("send email to user {{ {} }}".format(user)) try: if user.mail == 'None' or not user.mail: debug.warning("user {{ {} }} has no email-address".format(user)) raise Exception("no valid Email") msg = MIMEMultipart() msg['From'] = self.email msg['To'] = user.mail if type == 'credit': subject, text = self.credit(user) elif type == 'jobtransact': subject, text = self.jobTransact(user, jobtransact) elif type == 'jobinvite': subject, text = self.jobInvite(user, jobtransact) elif type == 'passwordReset': subject, text = self.passwordReset(user, kwargs) else: raise Exception("Fail to send Email. No type is set. user={}, type={} , jobtransact={}".format(user, type, jobtransact)) msg['Subject'] = subject msg.attach(text) debug.debug("send email {{ {} }} to user {{ {} }}".format(msg.as_string(), user)) self.__connect__() self.smtp.sendmail(self.email, user.mail, msg.as_string()) return {'error': False, 'user': {'userId': user.uid, 'firstname': user.firstname, 'lastname': user.lastname}} except Exception: debug.warning("exception in send email", exc_info=True) return {'error': True, 'user': {'userId': user.uid, 'firstname': user.firstname, 'lastname': user.lastname}}