ticketfrei/sendmail.py

74 lines
2.3 KiB
Python
Raw Normal View History

2018-01-01 10:23:50 +00:00
#!/usr/bin/env python3
import smtplib
import ssl
2018-01-01 10:23:50 +00:00
from email.mime.text import MIMEText
2018-01-05 10:20:07 +00:00
from email.mime.application import MIMEApplication
from email.mime.multipart import MIMEMultipart
2018-01-01 10:23:50 +00:00
class Mailer(object):
"""
Maintains the connection to the mailserver and sends text to users.
"""
def __init__(self, config):
"""
2018-01-05 10:20:07 +00:00
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.
2018-01-01 10:23:50 +00:00
:param config: The config file generated from config.toml
"""
# 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]
2018-01-01 10:23:50 +00:00
# starts a client session with the SMTP server
self.s = smtplib.SMTP(config["mail"]["mailserver"])
context = ssl.create_default_context()
self.s.starttls(context=context)
self.s.login(config["mail"]["user"], config["mail"]["passphrase"])
2018-01-01 10:23:50 +00:00
2018-01-05 10:20:07 +00:00
def send(self, text, recipient, subject, attachment=None):
2018-01-01 10:23:50 +00:00
"""
:param text: (string) the content of the mail
:param recipient: (string) the recipient of the mail
:param subject: (string) the subject of the mail
2018-01-05 10:20:07 +00:00
:param attachment: (string) the path to the logfile
2018-01-01 10:23:50 +00:00
:return: string for logging purposes, contains recipient & subject
"""
2018-01-05 10:20:07 +00:00
msg = MIMEMultipart()
msg.attach(MIMEText(text))
2018-01-01 10:23:50 +00:00
msg["From"] = self.fromaddr
msg["To"] = recipient
msg["Subject"] = subject
2018-01-05 10:20:07 +00:00
# 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)
2018-01-01 10:23:50 +00:00
self.s.send_message(msg)
2018-01-05 10:20:07 +00:00
self.s.close()
2018-01-01 10:23:50 +00:00
return "Sent mail to " + recipient + ": " + subject
2018-01-01 10:23:50 +00:00
# For testing:
if __name__ == '__main__':
import prepare
config = prepare.get_config()
2018-01-01 10:23:50 +00:00
m = Mailer(config)
print(m.send("This is a test mail.", m.fromaddr, "Test"))