与许多其他扩展一样,安装flask-mail 后,您需要在__init__.py 文件中创建一个mail 对象。使用如下所示的结构,其中使用了蓝图,您可以将电子邮件支持添加到您的烧瓶应用程序。
project_folder
| --- app.py
| --- config.py
| --- app/
| --- email.py
| --- models.py
| --- __init__.py
| --- main/
| --- __init__.py
| --- routes.py
| --- email.py
| --- auth/
| --- __init__.py
| --- routes.py
| --- templates/
| --- auth/
| --- register.html
在应用工厂中创建mail对象:
# app/__init.py
from flask import Flask
from flask_mail import Mail
# ...
mail = Mail()
# ...
def create_app():
app = Flask(__name__)
# ...
mail.init_app(app)
# ...
创建一个电子邮件模块,它将处理您的应用程序的所有电子邮件支持需求,如下所示:
# app/email.py
from threading import Thread
from flask import current_app
from flask_mail import Message
from app import mail
def send_async_email(app, msg):
with app.app_context():
mail.send(msg)
def send_email(subject, sender, recipients, text_body, html_body):
msg = Message(subject, sender=sender, recipients=recipients)
msg.body = text_body
msg.html = html_body
Thread(target=send_async_email,
args=(current_app._get_current_object(), msg)).start()
在上面,我已经导入了我们在__init__.py 文件中创建的mail。由于我们使用的是工厂函数,我从flask 中导入current_app,这将有助于访问应用程序的配置变量。这些变量是完成电子邮件支持所必需的。线程确保在执行电子邮件设置时应用程序不会变慢。
我假设您想向已注册的用户发送电子邮件。因此,在auth 包中,您需要创建一个帮助方法来将电子邮件发送给用户。
# app/auth/email.py
from flask import render_template, current_app
from app.email import send_email
def send_congrats_email(user):
send_email('[Congrats] You are registered'),
sender=current_app.config['ADMINS'][0],
recipients=[user.email],
text_body=render_template('email/reset_password.txt',
user=user),
html_body=render_template('email/reset_password.html',
user=user)
在你的auth/routes.py中,创建一个视图函数进行注册:
# app/auth/routes.py
from app.auth.email import send_congrats_email
@bp.route('/register', methods=['GET', 'POST'])
def register():
if current_user.is_authenticated:
return redirect(url_for('main.index'))
form = RegistrationForm()
if form.validate_on_submit():
user = User(username=form.username.data, email=form.email.data)
user.set_password(form.password.data)
db.session.add(user)
db.session.commit()
send_congrats_email(user)
flash('Check your email for our congrats message')
return redirect(url_for('auth.login'))
return render_template('auth/register.html', title='Register',
form=form)
确保在config 模块中设置您的电子邮件配置:
import os
from dotenv import load_dotenv
basedir = os.path.abspath(os.path.dirname(__file__))
load_dotenv(basedir, '.env')
class Config(object):
# Database configuration
SQLALCHEMY_DATABASE_URI = os.environ.get('DATABASE_URL?ssl=require') or \
'sqlite:///' + os.path.join(basedir, 'app.db')
SQLALCHEMY_TRACK_MODIFICATIONS = False
# Form protection
SECRET_KEY = os.environ.get('SECRET_KEY')
# Email configuration
MAIL_SERVER = os.environ.get('MAIL_SERVER')
MAIL_PORT = int(os.environ.get('MAIL_PORT') or 25)
MAIL_USE_TLS = os.environ.get('MAIL_USE_TLS') is not None
MAIL_USERNAME = os.environ.get('MAIL_USERNAME')
MAIL_PASSWORD = os.environ.get('MAIL_PASSWORD')
ADMINS = os.environ.get('ADMINS')
这样,当调用register() 视图函数时,您的电子邮件消息(在app/templates/email/ 中的模板中可见)将发送给新注册的用户。