nyaa/nyaa/email.py

85 lines
2.6 KiB
Python

import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from flask import current_app as app
import requests
from nyaa import models
class EmailHolder(object):
''' Holds email subject, recipient and content, so we have a general class for
all mail backends. '''
def __init__(self, subject=None, recipient=None, text=None, html=None):
self.subject = subject
self.recipient = recipient # models.User or string
self.text = text
self.html = html
def format_recipient(self):
if isinstance(self.recipient, models.User):
return '{} <{}>'.format(self.recipient.username, self.recipient.email)
else:
return self.recipient
def recipient_email(self):
if isinstance(self.recipient, models.User):
return self.recipient.email
else:
return self.recipient.email
def as_mimemultipart(self):
msg = MIMEMultipart()
msg['Subject'] = self.subject
msg['From'] = app.config['MAIL_FROM_ADDRESS']
msg['To'] = self.format_recipient()
msg.attach(MIMEText(self.text, 'plain'))
if self.html:
msg.attach(MIMEText(self.html, 'html'))
return msg
def send_email(email_holder):
mail_backend = app.config.get('MAIL_BACKEND')
if mail_backend == 'mailgun':
_send_mailgun(email_holder)
elif mail_backend == 'smtp':
_send_smtp(email_holder)
elif mail_backend:
# TODO: Do this in logging.error when we have that set up
print('Unknown mail backend:', mail_backend)
def _send_mailgun(email_holder):
mailgun_endpoint = app.config['MAILGUN_API_BASE'] + '/messages'
auth = ('api', app.config['MAILGUN_API_KEY'])
data = {
'from': app.config['MAIL_FROM_ADDRESS'],
'to': email_holder.format_recipient(),
'subject': email_holder.subject,
'text': email_holder.text,
'html': email_holder.html
}
r = requests.post(mailgun_endpoint, data=data, auth=auth)
# TODO real error handling?
assert r.status_code == 200
def _send_smtp(email_holder):
# NOTE: Unused, most likely untested! Should work, however.
msg = email_holder.as_mimemultipart()
server = smtplib.SMTP(app.config['SMTP_SERVER'], app.config['SMTP_PORT'])
server.set_debuglevel(1)
server.ehlo()
server.starttls()
server.ehlo()
server.login(app.config['SMTP_USERNAME'], app.config['SMTP_PASSWORD'])
server.sendmail(app.config['SMTP_USERNAME'], email_holder.recipient_email(), msg.as_string())
server.quit()