Mail activation

本文会教大家怎么做邮箱验证,以及怎么发送好看一点的邮箱的HTML模板。很久没写过有用的教程,本来今天我应该在干经济,实在写不下去了,我跑来写这些了。(⊙︿⊙)关于怎么使用flask发送邮件,我在之前的教程有说的。传送门

技术:

  • flask
  • html
  • css

HTML Template

首先我们需要知道flask使用的是Jinja2的模板。

  1. 需要首先设计一个HTML来展示你相对应的邮箱验证的界面。我已经提前做好了一个,所有的源代码我都放到最后面了,到时候大家可以下载跑一下看看。

  1. 设置一下HTML所需要的参数,激活所需要的URL,用户名等。
  2. 写flask部分的代码

首先初始化flask:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from itsdangerous import TimedJSONWebSignatureSerializer as Serializer
from flask import Flask, render_template, request, session
from flask_mail import Mail, Message
from threading import Thread
import os

app = Flask(__name__)

app.config['SECRET_KEY'] = os.urandom(24)
app.config['MAIL_SERVER'] = 'smtp.qq.com'
app.config['MAIL_PORT'] = 465
app.config['MAIL_USE_SSL'] = True
app.config['MAIL_USERNAME'] = 'xxxx'
app.config['MAIL_PASSWORD'] = 'xxxx'
app.config['MAIL_DEFAULT_SENDER'] = 'xxxx@qq.com'

mail = Mail(app)

初始化发送邮件的function:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 异步发送function
def async_send_mail(app, msg):
# 获取当前程序的上下文
with app.app_context():
# 发送邮件
mail.send(msg)


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

初始化加密fucntion:

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
def encryption(data, expires_in=3600):
"""
加密json
:param data: 需要加密的数据
:param expires_in: 过期时间
:return: 返回加密的str
"""
s = Serializer(app.config['SECRET_KEY'], expires_in=expires_in)
return s.dumps(data).decode("utf-8")


def decryption(token):
"""
解密token到json数据
:param token: 密文
:return: 解密的数据
"""
s = Serializer(app.config['SECRET_KEY'])

try:
data = s.loads(token)
return data
except SignatureExpired:
print('Token expired')
except:
print('Unknown error')

最后开始写flask路由部分的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
@app.route('/', methods=["POST", "GET"])
def index():

if request.method == "POST":
email = request.form.get('email')
if email is not None:
session[email] = email
token = encryption(email)
send_mail(email, 'Activate you account', 'activate', action_url='127.0.0.1:5000/activate/{}'.format(token))
return '<h1>success</h1>'
return render_template('index.html')


@app.route('/activate/<token>', methods=["POST", "GET"])
def check(token):
if token is None:
return "False"

email = decryption(token)
if session.get(email) is None:
return "False"

return "True"

结果如下:

具体代码可以下载查看:下载

ps:需要修改相对应的邮箱和邮箱的配置

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