使用 flask-mail 扩展发送邮件

最近在搞 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'] = '[email protected]'
app.config['MAIL_PASSWORD'] = 'you_mail_password'

3. 发送邮件

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

from flask.ext.mail import Message
msg = Message('邮件主题', sender='[email protected]', recipients=['[email protected]'])
msg.body = '邮件内容'
msg.html = "

邮件的html模板

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

msg.html = "

邮件的html模板

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'] = '[email protected]'
app.config['MAIL_PASSWORD'] = 'you_mail_password'

mail = Mail(app)

msg = Message('邮件主题', sender='[email protected]', recipients=['[email protected]'])
msg.body = '邮件内容'
msg.html = "

邮件的html模板

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=['[email protected]'])
    msg.body = 'text body'
    msg.html = 'HTML 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() 来创建一个上下文。

你可能感兴趣的:(3,Python,7,web,开发,服务器,flask,SMTP)