diff --git a/app/email.py b/app/email.py
new file mode 100644
index 0000000000000000000000000000000000000000..a3c6a3a4048d9799241723e97d36c2776796526c
--- /dev/null
+++ b/app/email.py
@@ -0,0 +1,20 @@
+from threading import Thread
+from flask import current_app, render_template
+from flask_mail import Message
+from . import mail
+
+
+def send_async_email(app, msg):
+    with app.app_context():
+        mail.send(msg)
+
+
+def send_email(to, subject, template, **kwargs):
+    app = current_app._get_current_object()
+    msg = Message(app.config['OPAQUE_MAIL_SUBJECT_PREFIX'] + ' ' + subject,
+                  sender=app.config['OPAQUE_MAIL_SENDER'], recipients=[to])
+    msg.body = render_template(template + '.txt', **kwargs)
+    msg.html = render_template(template + '.html', **kwargs)
+    thr = Thread(target=send_async_email, args=[app, msg])
+    thr.start()
+    return thr
diff --git a/config.py b/config.py
index 4a1c3ab007e92436ec4996f62a432fb51e4dfda9..fdc2318daa51eee7004901e98f1d42e5c0047d3f 100644
--- a/config.py
+++ b/config.py
@@ -5,6 +5,14 @@ basedir = os.path.abspath(os.path.dirname(__file__))
 
 
 class Config:
+    MAIL_SERVER = os.environ.get('MAIL_SERVER', 'smtp.uni-bielefeld.de')
+    MAIL_PORT = int(os.environ.get('MAIL_PORT', '587'))
+    MAIL_USE_TLS = os.environ.get('MAIL_USE_TLS', 'true').lower() in \
+        ['true', 'on', '1']
+    MAIL_USERNAME = os.environ.get('MAIL_USERNAME')
+    MAIL_PASSWORD = os.environ.get('MAIL_PASSWORD')
+    OPAQUE_MAIL_SUBJECT_PREFIX = '[Opaque]'
+    OPAQUE_MAIL_SENDER = 'Opaque Admin <inf_sfb1288@uni-bielefeld.de>'
     SECRET_KEY = os.environ.get('SECRET_KEY') or 'hard to guess string'
     SQLALCHEMY_TRACK_MODIFICATIONS = False