- 28
- 08月
Flask-Mail扩展用于在Flask应用程序中发送邮件。
[TOC]
安装
pip install flask-mail
使用步骤
- 配置一些发送邮件的参数例如邮件发送服务器的地址,端口,是否加密等。
- 初始化flask-mail插件。
- 创建
Message
实例,设置发送的内容,地址和主题等信息 - 使用
Mail
实例针对Message
的实例来发送
配置参数详解
下面这是在使用mail的时候需要指定的一些配置参数,需要在使用mail之前来设置相关的参数。
配置值 | 默认值 | 说明 |
---|---|---|
MAIL_HOSTNAME | localhost | Hostname or IP address of the email server |
MAIL_PORT | 25 | Port of the email server |
MAIL_USE_TLS | False | Enable Transport Layer Security (TLS) security |
MAIL_USE_SSL | False | Enable Secure Sockets Layer (SSL) security |
MAIL_USERNAME | None | Mail account username |
MAIL_PASSWORD | None | Mail account passwor |
和绝大多数的Flask插件一样,要使用Flask插件的时候需要对插件进行初始化,大都
数插件的初始化方式经过Flask封装后变的统一了,大部分情况下都是想如下方式来
进行初始化。其中app
是Flask应用的实例。
from flask.ext.mail import Mail
mail = Mail(app)
发送邮件
初始化好Mail
插件后就生成了一个mail
的实例,接下来就需要创建一个
Message
的实例这里面包含了要发送的邮件的所有信息,例如邮件发送的地址,邮
件的主题,邮件的内容,邮件的html模板等。
from flask.ext.mail import Message
def send_email():
msg = Message("邮件的subject", sender="xxx@xxx.com",
recipients=["xxx@xx.com"])
msg.body = "邮件的主题内容"
msg.html = "<h1>邮件的html模板<h1> body"
#发送邮件
mail.send(msg)
msg.html = "<h1>邮件的html模板<h1> body"
这里的body是一个占位符将会替换
msg.body
里面的内容。
发面的邮件发送过程是同步的,当点击发送邮件的时候页面会卡住好几秒直到邮件发送完毕。
异步发送邮件
这里通过线程的方式来实现邮件发送,主进程继续完成页面的输出的。从而达到异步的效果。
from threading import Thread
def send_async_email(app, msg):
with app.app_context():
mail.send(msg)
def send_email():
msg = Message("邮件的subject", sender="xxx@xxx.com",
recipients=["xxx@xxx.com"])
msg.body = "邮件的主题内容"
msg.html = "<h1>邮件的html模板<h1> body"
# 发送邮件
thr = Thread(target=send_async_email, args=[app,msg])
thr.start()
return "OK"
许多Flask的扩展都是假定自己运行在一个活动的应用和请求上下文中,Flask-Mail
的send
函数使用到current_app
这个上下文了,所以当mail.send()
函数在一个
线程中执行的时候需要人为的创建一个上下文,所有在send_async_email
中使用了
app.app_context()
来创建一个上下文。
原文如下:
Many Flask extensions operate under the assumption that there are active application and request contexts. Flask-Mail's
send()
function usescurrent_app
, so it requires the application context to be active. But when themail.send()
function executes in a different thread, the application context needs to be created artificially usingapp.app_context()
.
完整实例
下面是一个完整的简单异步发送邮件的实例:
from flask import Flask
from flask import current_app
from flask.ext.sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config.from_object(__name__)
db = SQLAlchemy(app)
from flask.ext.mail import Mail
from flask.ext.mail import Message
from threading import Thread
mail = Mail(app)
app.config['MAIL_SERVER']='localhost'
app.config['MAIL_PORT']=25
def send_async_email(app, msg):
with app.app_context():
mail.send(msg)
@app.route("/mail")
def SendMail():
msg = Message('test',sender='zyfforlinux@163.com',recipients=['445188383@qq.com'])
msg.body = "text body"
msg.html = "<b>HTML</b>body"
thr = Thread(target=send_async_email, args=[app, msg])
thr.start()
return "OK"
原文:http://www.linuxidc.com/Linux/2014-07/104740.htm