basic mailer implementation

This commit is contained in:
dandds 2018-10-10 11:28:03 -04:00
parent 5dd55dea55
commit 18bb5b24fd
5 changed files with 108 additions and 1 deletions

View File

@ -22,6 +22,7 @@ from atst.domain.authz import Authorization
from atst.models.permissions import Permissions
from atst.eda_client import MockEDAClient
from atst.uploader import Uploader
from atst.utils.mailer import make_mailer
ENV = os.getenv("FLASK_ENV", "dev")
@ -47,6 +48,7 @@ def make_app(config):
register_filters(app)
make_eda_client(app)
make_upload_storage(app)
make_mailer(app)
db.init_app(app)
csrf.init_app(app)

View File

@ -1,4 +1,12 @@
from flask import Blueprint, request, session, redirect
from flask import (
Blueprint,
request,
session,
redirect,
render_template,
url_for,
current_app as app,
)
from . import redirect_after_login_url
from atst.domain.users import Users
@ -65,3 +73,17 @@ def login_dev():
session["user_id"] = user.id
return redirect(redirect_after_login_url())
@bp.route("/test-email")
def test_email():
app.mailer.send(
[request.args.get("to")], request.args.get("subject"), request.args.get("body")
)
return redirect(url_for("dev.messages"))
@bp.route("/messages")
def messages():
return render_template("dev/emails.html", messages=app.mailer.messages)

77
atst/utils/mailer.py Normal file
View File

@ -0,0 +1,77 @@
import smtplib
from email.message import EmailMessage
from collections import deque
class _HostConnection:
def __init__(self, server, port, username, password, use_tls=False):
self.server = server
self.port = port
self.username = username
self.password = password
self.use_tls = use_tls
self.host = None
def __enter__(self):
self.host = smtplib.SMTP_SSL(self.server, self.port)
if self.use_tls:
self.host.starttls()
self.host.login(self.username, self.password)
return self.host
def __exit__(self, *args):
if self.host:
self.host.quit()
class Mailer:
def __init__(
self, server, port, sender, username, password, use_tls=False, debug=False
):
self.server = server
self.port = port
self.sender = sender
self.username = username
self.password = password
self.use_tls = use_tls
self.debug = debug
self.messages = deque(maxlen=50)
def connection(self):
return _HostConnection(self.server, self.port, self.username, self.password)
def _message(self, recipients, subject, body):
msg = EmailMessage()
msg.set_content(body)
msg["From"] = self.sender
msg["To"] = ", ".join(recipients)
msg["Subject"] = subject
return msg
def send(self, recipients, subject, body):
message = self._message(recipients, subject, body)
if self.debug:
self.messages.appendleft(message)
else:
with self.connection() as conn:
conn.send_message(message)
def _map_config(config):
return {
"server": config.get("MAIL_SERVER"),
"port": config.get("MAIL_PORT"),
"sender": config.get("MAIL_SENDER"),
"username": config.get("MAIL_USERNAME"),
"password": config.get("MAIL_PASSWORD"),
"use_tls": config.get("MAIL_TLS", False),
"debug": config.get("DEBUG", False),
}
def make_mailer(app):
config = _map_config(app.config)
mailer = Mailer(**config)
app.mailer = mailer

View File

@ -0,0 +1,6 @@
{% for msg in messages %}
<div style="white-space: pre-wrap">
{{ msg }}
</div>
<hr>
{% endfor %}