resting-mailer/app.py

72 lines
2.0 KiB
Python

from flask import Flask, jsonify, request
from flask_restful import Resource, Api
from flask_restful import reqparse
from smtplib import SMTP, SMTPException
from email.message import EmailMessage
app = Flask(__name__)
api = Api(app)
parser = reqparse.RequestParser()
parser.add_argument("host", type=str)
parser.add_argument("port", type=int)
parser.add_argument("tls", type=bool)
parser.add_argument("username", type=str)
parser.add_argument("password", type=str)
parser.add_argument("from", type=str)
parser.add_argument("to", type=str)
parser.add_argument("subject", type=str)
parser.add_argument("content", type=str)
def mk_msg(toaddr, fromaddr, subj, content):
msg = EmailMessage()
msg["To"] = toaddr
msg["From"] = fromaddr
msg["Subject"] = subj
if content is not None:
msg.set_content(content)
return msg
class SendEmail(Resource):
def post(self):
args = parser.parse_args(strict=True)
for key, msg in [
("host", "no host provided"),
("username", "no username provided"),
("to", "no 'to' address"),
("from", "no 'from' address"),
]:
if args[key] is None:
return msg, 400
# just assume we will want TLS (for obvious reasons)
port = 587 if args["port"] is None else args["port"]
use_tls = args["tls"] is not False
try:
with SMTP(host=args["host"], port=port) as s:
if use_tls:
s.starttls()
s.login(args["username"], args["password"])
msg = mk_msg(
args["to"],
args["from"],
args["subject"],
args["content"],
)
s.send_message(msg)
return "send successful", 201
except SMTPException as e:
return str(e), 400
api.add_resource(SendEmail, "/send")
if __name__ == "__main__":
app.run(debug=True)