fixing #44 - refactoring how mails are sent

This commit is contained in:
b3yond 2018-10-06 10:20:37 +02:00
parent 4851fc0b63
commit 2068b99b87
3 changed files with 5 additions and 65 deletions

View file

@ -1,7 +1,7 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
import logging import logging
import sendmail from sendmail import sendmail
import datetime import datetime
import mailbox import mailbox
import email import email
@ -37,7 +37,7 @@ class Mailbot(Bot):
if report.author != rec: if report.author != rec:
try: try:
city = user.get_city() city = user.get_city()
sendmail.sendmail(rec, "Ticketfrei " + city + " Report", sendmail(rec, "Ticketfrei " + city + " Report",
city=city, body=body) city=city, body=body)
except Exception: except Exception:
logger.error("Sending Mail failed.", exc_info=True) logger.error("Sending Mail failed.", exc_info=True)

2
db.py
View file

@ -1,7 +1,7 @@
from config import config from config import config
import jwt import jwt
import logging import logging
from os import urandom, system from os import urandom
from pylibscrypt import scrypt_mcf from pylibscrypt import scrypt_mcf
import sqlite3 import sqlite3

View file

@ -1,76 +1,16 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
from config import config from config import config
from email.mime.text import MIMEText from email.mime.text import MIMEText
from email.mime.application import MIMEApplication
from email.mime.multipart import MIMEMultipart from email.mime.multipart import MIMEMultipart
import logging import logging
from getpass import getuser from getpass import getuser
import smtplib import smtplib
from socket import getfqdn from socket import getfqdn
import ssl
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
class Mailer(object):
"""
Maintains the connection to the mailserver and sends text to users.
"""
def __init__(self):
"""
Creates an SMTP client to send a mail. Is called only once
when you actually want to send a mail. After you sent the
mail, the SMTP client is shut down again.
"""
# This generates the From address by stripping the part until the first
# period from the mail server address and won't work always.
self.fromaddr = config["mail"]["user"] + "@" + config["mail"]["mailserver"].partition(".")[2]
# starts a client session with the SMTP server
self.s = smtplib.SMTP(config["mail"]["mailserver"])
try:
context = ssl.create_default_context()
self.s.starttls(context=context)
except BaseException: # TODO: Amend specific exception
logger.error('StartTLS failed.', exc_info=True)
self.s.login(config["mail"]["user"], config["mail"]["passphrase"])
def send(self, text, recipient, subject, attachment=None):
"""
:param text: (string) the content of the mail
:param recipient: (string) the recipient of the mail
:param subject: (string) the subject of the mail
:param attachment: (string) the path to the logfile
:return: string for logging purposes, contains recipient & subject
"""
msg = MIMEMultipart()
msg.attach(MIMEText(text))
msg["From"] = self.fromaddr
msg["To"] = recipient
msg["Subject"] = subject
# attach logfile
if attachment:
with open(attachment, "rb") as fil:
part = MIMEApplication(
fil.read(),
Name="logfile"
)
# After the file is closed
part['Content-Disposition'] = 'attachment; filename="logfile"'
msg.attach(part)
self.s.send_message(msg)
self.s.close()
return "Sent mail to " + recipient + ": " + subject
def sendmail(to, subject, city=None, body=''): def sendmail(to, subject, city=None, body=''):
msg = MIMEMultipart() msg = MIMEMultipart()
if city: if city:
@ -87,5 +27,5 @@ def sendmail(to, subject, city=None, body=''):
# For testing: # For testing:
if __name__ == '__main__': if __name__ == '__main__':
m = Mailer() sendmail(config['mail']['contact'], "Test Mail",
print(m.send("This is a test mail.", m.fromaddr, "Test")) body="This is a test mail.")