您的位置:首页 > 大数据 > 人工智能

使用 flask-mail 扩展发送邮件

2016-03-13 09:50 232 查看
最近在搞 flask 开发一个论坛,用户注册时需要向用户邮箱发送确认邮件,研究了一下 flask-mail 扩展,发现很神奇,数十行代码就能发送一封邮件。

flask-mail 连接到简单邮件传输协议(SMTP)服务器,并把邮件交给这个服务器发送。如果不进行配置,Flask-mail 会连接 localhost 上的端口 25,无需验证即可发送邮件。

在国内还是 qq 邮箱使用比较普遍,查了下 qq 邮箱的 IMAP(Internet Message Access Protocol互联网邮件访问协议)服务,发现配置起来很简单,轻松就能是由 flask-mail 结合 qq 邮箱自动发送邮件

1. flask-mail 初始化

和绝大多数的Flask插件一样,要使用Flask插件的时候需要对插件进行初始化,大都数插件的初始化方式经过Flask封装后变的统一了,大部分情况下都是想如下方式来进行初始化。其中app是Flask应用的实例。

from flask.ext.mail import Mail
mail = Mail(app)


2. 配置 qq 邮箱:

app.config['MAIL_SERVER'] = 'smtp.qq.com'
app.config['MAIL_PORT'] = 587
app.config['MAIL_USE_TLS'] = True
app.config['MAIL_USERNAME'] = 'xxxxxxxx@qq.com'
app.config['MAIL_PASSWORD'] = 'you_mail_password'


3. 发送邮件

初始化好Mail插件后就生成了一个mail的实例,接下来就需要创建一个Message的实例这里面包含了要发送的邮件的所有信息,例如邮件发送的地址,邮件的主题,邮件的内容,邮件的html模板等。

from flask.ext.mail import Message
msg = Message('邮件主题', sender='xxxxxxxx@qq.com', recipients=['example@example.com'])
msg.body = '邮件内容'
msg.html = "<h1>邮件的html模板<h1> body"

with app.app_context():
mail.send(msg)


msg.html = "<h1>邮件的html模板<h1> body"
这里的body是一个占位符将会替换
msg.body
里面的内容。

注意,flask-mail 中的 send() 函数使用
current_app
,因此要在激活的程序上下文中执行。

4. 完整示例

# -*- coding: utf-8 -*-
"""
Created on Sun Mar 13 08:21:43 2016

@author: david
"""
from flask import Flask
from flask.ext.mail import Mail, Message

app = Flask(__name__)
app.config['MAIL_SERVER'] = 'smtp.qq.com' app.config['MAIL_PORT'] = 587 app.config['MAIL_USE_TLS'] = True app.config['MAIL_USERNAME'] = 'xxxxxxxx@qq.com' app.config['MAIL_PASSWORD'] = 'you_mail_password'

mail = Mail(app)

msg = Message('邮件主题', sender='xxxxxxxx@qq.com', recipients=['example@example.com'])
msg.body = '邮件内容'
msg.html = "<h1>邮件的html模板<h1> body"

with app.app_context():
mail.send(msg)


5. 异步发送

上面发送的邮件发送过程是同步的,在开发网站的邮件注册页面测试时,当点击发送邮件的时候页面会卡住好几秒直到邮件发送完毕。为了避免不必要的处理请求过程中不必要的延迟,我们可以把发送邮件的函数移到后台线程中。

from threading import Thread
def send_async_email(app, msg):
with app.app_context():
mail.send(msg)

def send_email():
msg = Message('test', sender=app.config['MAIL_SENDER'], recipients=['xxxx@example.com'])
msg.body = 'text body'
msg.html = '<b>HTML</b> body'
thr = Thread(target=send_async_email, args=[app, msg])
return thr


许多Flask的扩展都是假定自己运行在一个活动的应用和请求上下文中,Flask-Mail的send函数使用到
current_app
这个上下文了,所以当
mail.send()
函数在一个线程中执行的时候需要人为的创建一个上下文。在示例
send_async_email
中使用了
app.app_context()
来创建一个上下文。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  服务器 flask SMTP