Flask Mail

Flask mail的使用教程,包括发送HTML,附件等等。Flask mail一般是用来做注册时候的邮箱验证,或者改密码的时候的验证,还有就是一些预定信息的通知,或者是tax的一些内容。当然网上的教程很多,但是大部分都不够全面,有的是基础,有的是加深,所以我打算在这里做一个关于flask mail尽量全面的教程。

安装 Flask Mail

如果大家没有使用过flask mail,需要先用pip3安装一下

1
pip3 install flask_mail

Flask Mail 的配置

配置 默认值 功能
MAIL_SERVER localhost 邮件服务器
MAIL_PORT 25 邮件端口(一般是465)
MAIL_USE_TLS False 是否使用TLS协议(一般不使用)
MAIL_USE_SSL False 是否使用SSL协议(大多数使用)
MAIL_DEBUG app.debug 是否为DEBUG模式,打印调试消息(一般默认开启)
MAIL_USERNAME None 用户名
MAIL_PASSWORD None 密码 or 授权码
MAIL_DEFAULT_SENDER None 默认发送者
MAIL_MAX_EMAILS None 一次连接中的发送邮件的上限
MAIL_ASCII_ATTACHMENTS False 如果 MAIL_ASCII_ATTACHMENTS 设置成 True 的话,文件名将会转换成 ASCII 的。一般用于添加附件。

大部分情况下我们只需要设置MAIL_USE_TLS, MAIL_USE_SSL, MAIL_USERNAME, MAIL_PASSWORD, MAIL_DEFAULT_SENDER这些就可以了

使用Flask Mail

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
from flask import Flask
from flask_mail import Mail, Message

app = Flask(__name__)

# 配置邮件服务器
# 如果是163邮箱的话是: smtp.163.com
# 如果是gmail邮箱的话是: smtp.gamil.com
# 如果是自己注册的域名邮箱的话,在购买域名邮箱的时候会给特定的server
app.config['MAIL_SERVER'] = 'smtp.qq.com'

# 端口要根据设置来改,一般是用465
app.config['MAIL_PORT'] = 465

# 应用ssl传输协议,普遍是用ssl
app.config['MAIL_USE_SSL'] = True

# 配置邮件的用户名,只需要@xxqq.com前面的内容,不需要包含@xx.com
app.config['MAIL_USERNAME'] = '123456'

# 在qq邮件里面,这个密码是指的授权码!
# 不是密码,一定要授权码,一般是16位的字符
# 如果是gmail或者别的可以直接是用密码
app.config['MAIL_PASSWORD'] = 'aaaaaaaaaaaaaaaa'

# 设置默认发送的邮箱,需要包含@xx.com
app.config['MAIL_DEFAULT_SENDER'] = '123456@qq.com'

mail = Mail(app)

怎么使用HTML模板

大部分时候不管发送邮件验证还是什么,HTML的模板都是不变的,只是改变了里面的内容,所以我们先说一下怎么使用HTML模板来发送,最主要的一个function就是render_template这个函数,因为flask使用的是Jinja2的模板,render_template函数可以把Jinja2的模板转义成string的格式。所以我们用的return render_template就是把HTML转成string,然后发回给浏览器。

我们用Jinja2在templates的文件夹下定义一个HTML文件叫hello.html, 这样我们就可以传进来参数,来修改username。具体的使用方法下面两种发送方式里面都有例子。

1
<h1>Hello {{ username }}</h1>

不使用异步发送

Flask mail可以是用异步发送,可以不适用,首先讲一下不使用异步发送的做法。也可以用render_template的方法来修改msg.html的值

1
2
3
4
5
6
7
8
9
10
# recipients是list,可以添加多个收件人
# sender 是发件人
# Message第一个变量Hello是邮件的标题
msg = Message('Hello', sender='123456@qq.com', recipients=['123456@qq.com'])
msg.body = 'Hello'
# HTML的内容可以直接写
msg.html = "<h1>Hello world</h1>"
# 也可以用render_template
msg.html = render_template('hello.html',username='xxx')
mail.send(msg)

如果配置什么都没有错误的话可以直接发送出去了。

使用异步发送

从电子邮件发送开始,直到电子邮件交付后,给浏览器发回其响应,在整个过程中,Web服务器会一直阻塞。如果我们试图发送电子邮件到一个服务器是缓慢的,所以使用多线程异步发送电子邮件可以避免处理请求过程中不必要的延迟,将发送电子邮件的函数使用Thread来运行。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
from threading import Thread

# 异步发送function
def async_start(app, msg):
# 获取当前程序的上下文
with app.app_context():
# 发送邮件
mail.send(msg)

# 定义发送函数, message的配置和上面讲的一样
# **kwargs 指传进来的参数, 可以传多个参数进来。eg: username = 'xxx', link = 'xxx.com'
def send(to, subject, template, **args):
msg = Message(subject, sender = '123456@qq.com', recipients=[to])
msg.html = render_template(template, **args)
thread = Thread(target=async_start, args=[app, msg])
thread.start()
# 返回调用的结果
return thread


# 调用send_mail
# 第一个参数是收件人,第二个是标题,第三个是html的名字,第四个是render_template里面需要包含的变量(相当于render_template('hello.html', username='xxx'))
@app.route('/send')
def send_mail():
send('123456@qq.com', 'Hello world', 'hello.html', username='xxx')

关于Flask Mail发送附件

当flask mail需要发送附件的时候,如果MAIL_ASCII_ATTACHMENTS 设置成True 的话,文件名将会转换成ASCII 的。 当文件名是以UTF-8 编码的时候,使用邮件转发的时候会修改邮件内容并且混淆Content-Disposition 描述,这个时候MAIL_ASCII_ATTACHMENTS 配置项是十分有用的。转换成ASCII 的基本方式就是对non-ASCII 字符的去除。任何一个unicode 字符能够被NFKD 分解成一个或者多个ASCII 字符。

发送照片:

1
2
with app.open_resource("image.png") as fp:
    msg.attach("image.png", "image/png", fp.read())

发送PDF:

1
2
with app.open_resource('xx.pdf') as fp:
msg.attach('xx.pdf', "application/pdf", fp.read())

注:如果想在HTML里面使用css,需要自己在<style></style>里面写css,不可以直接用bootstrap这些框架。

demo 文件提供下载。

关于怎么使用Gmail

  1. 首先开启安全性较低的应用的访问权限 URL

  1. 启用IMAP URL:

关于怎么使用QQ邮箱

  1. 首先开启IMAP/SMTP服务。在邮箱”设置->账户“ 里面设置。

  1. 需要生成授权码,也在同一个页面

----- End Thanks for reading-----