48 lines
1.5 KiB
Python
48 lines
1.5 KiB
Python
|
#!/usr/bin/env python3
|
||
|
|
||
|
from email import encoders
|
||
|
from email.mime.base import MIMEBase
|
||
|
from email.mime.multipart import MIMEMultipart
|
||
|
from email.mime.text import MIMEText
|
||
|
import smtplib
|
||
|
|
||
|
|
||
|
class FastMailSMTP(smtplib.SMTP_SSL):
|
||
|
"""A wrapper for handling SMTP connections to FastMail."""
|
||
|
|
||
|
def __init__(self, username, password):
|
||
|
super().__init__("mail.messagingengine.com", port=465)
|
||
|
self._username = username
|
||
|
self._password = password
|
||
|
self._has_logged_in = False
|
||
|
|
||
|
def login(self):
|
||
|
if not self._has_logged_in:
|
||
|
super().login(self._username, self._password)
|
||
|
self._has_logged_in = True
|
||
|
|
||
|
def send_message(self, *, from_addr, to_addrs, msg, subject, attachments=None):
|
||
|
self.login()
|
||
|
|
||
|
msg_root = MIMEMultipart()
|
||
|
msg_root["Subject"] = subject
|
||
|
msg_root["From"] = from_addr
|
||
|
msg_root["To"] = ", ".join(to_addrs)
|
||
|
|
||
|
msg_alternative = MIMEMultipart("alternative")
|
||
|
msg_root.attach(msg_alternative)
|
||
|
msg_alternative.attach(MIMEText(msg, "html"))
|
||
|
|
||
|
if attachments:
|
||
|
for attachment in attachments:
|
||
|
prt = MIMEBase("application", "octet-stream")
|
||
|
prt.set_payload(open(attachment, "rb").read())
|
||
|
encoders.encode_base64(prt)
|
||
|
prt.add_header(
|
||
|
"Content-Disposition",
|
||
|
'attachment; filename="%s"' % attachment.replace('"', ""),
|
||
|
)
|
||
|
msg_root.attach(prt)
|
||
|
|
||
|
self.sendmail(from_addr, to_addrs, msg_root.as_string())
|