使用 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 邮箱自动发送邮件
注意,flask-mail 中的 send() 函数使用
许多Flask的扩展都是假定自己运行在一个活动的应用和请求上下文中,Flask-Mail的send函数使用到
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()来创建一个上下文。
相关文章推荐
- 小心服务器内存居高不下的元凶--WebAPI服务
- 运维入门
- 如何使用 Flask 编写 Python Web API
- 利用开源软件打造自己的全功能远程工具
- Linux5.9无人值守安装
- 数据中心和云未来的十二大趋势
- 用vsftp快速搭建ftp服务器
- Linux快速构建apache web服务器
- 服务器监控策略浅谈
- 信息安全聚合 Sec-News 的重构之路
- 如何降低服务器采购成本 原理分析
- 建议的服务器分区办法
- 服务器托管六大优势分析
- Erlang实现的一个Web服务器代码实例
- 服务器技术全面解析
- 保护DNS服务器的几点方法小结
- 我国成为全球第二大服务器消费国
- 服务器 安全检查要点[星外提供]