2014-01-26 11 views
5

Ich versuche, einige E-Mails asynchron zu senden (basierend auf dem Code in The Flask Mega-Tutorial, Part XI: Email Support). Ich bekomme jedoch den folgenden Fehler beim Arbeiten außerhalb eines Anwendungskontextes. Wie behebe ich dieses Problem?Die asynchrone Verwendung von Flask-Mail führt zu "RuntimeError: außerhalb des Anwendungskontexts arbeiten".

Traceback (most recent call last): 
    File "C:\Users\Primoz\Desktop\RecycleFlaskServer\recycleserver\helpers.py", line 17, in send_async_email 
    mail.send(msg) 
    File "C:\Python33\lib\site-packages\flask_mail-0.9.0-py3.3.egg\flask_mail.py", line 434, in send 
    message.send(connection) 
    File "C:\Python33\lib\site-packages\flask_mail-0.9.0-py3.3.egg\flask_mail.py", line 369, in send 
    connection.send(self) 
    File "C:\Python33\lib\site-packages\flask_mail-0.9.0-py3.3.egg\flask_mail.py", line 173, in send 
    email_dispatched.send(message, app=current_app._get_current_object()) 
    File "C:\Python33\lib\site-packages\werkzeug-0.9.4-py3.3.egg\werkzeug\local.py", line 297, in _get_current_object 
    return self.__local() 
    File "C:\Python33\lib\site-packages\flask-0.10.1-py3.3.egg\flask\globals.py", line 34, in _find_app 
    raise RuntimeError('working outside of application context') 
RuntimeError: working outside of application context 
from flask import Flask 
from flask.ext.mail import Mail 
app = Flask(__name__) 
app.config.from_object('recycleserver.settings') 
mail = Mail(app) 

def async(f): 
    def wrapper(*args, **kwargs): 
     thr = Thread(target = f, args = args, kwargs = kwargs) 
     thr.start() 
    return wrapper 

@async 
def send_async_email(msg): 
    mail.send(msg) 

def send_simple_mail(subject, sender, to_who, text_body="", html_body=""): 
    msg = Message(subject=subject,sender=sender, recipients=to_who) 
    msg.body = text_body 
    msg.html = html_body 
    send_async_email(msg) 

Antwort

14

Der Code sollte in einem App Kontext ausgeführt. Add with app.app_context():

@async 
def send_async_email(msg): 
    with app.app_context(): 
     mail.send(msg) 
Verwandte Themen