为什么需要使用Flask-Mail组件?
在我们开发完web系统后,一些特定的事件发生时,系统要自动发送相关邮件至管理员,运维人员和其他相关人员。python标准库中的smtplib包也可以用在Flask程序中发送邮件,但包装了smtplib的falsk-mail扩展能更好的与Flask集成。
如何使用Flask-Mail扩展发送邮件?
- 安装flask-mail扩展
pip install flask-mail
- 查看安装情况
pip show flask-mail
发送邮件的时候需要设置什么?
- 发件人账户
- 密码
- 收件人
- 邮件标题
- 邮件正文
- QQ邮件(163)服务器的域名或者IP
详细代码
主程序代码:app.py
from flask import Flask, render_template, request, flash, redirect
from flask_mail import Mail,Message
app = Flask(__name__)
# 配置发送邮件的相关信息
# 指定邮件服务器的域名或者IP https://service.mail.qq.com/cgi-bin/help?subtype=1&&id=28&&no=369
app.config.from_pyfile('config.py')
def send_mail(to,subject,filename,**kwargs):
"""
:param to: 收件人
:param subject: 邮件主题
:param filename: 邮件正文对应的html名称
:param kwargs: 关键字参数,模板中需要的变量名
:return:
"""
# 初始化mail对象,一定要先配置邮件信息
mail = Mail(app)
msg = Message(subject=subject,
sender='wangtuo1115@163.com',
recipients=to)
# 邮件正文内容为后者,也就是html的内容
# msg.body = info
msg.html = render_template(filename + '.html',**kwargs)
with app.app_context():
mail.send(msg)
# send_mail(to=['854429157@qq.com','401748480@qq.com'],subject='狗老师走好',
# info='六弟发来贺电')
@app.route('/register/', methods=['GET','POST'])
def register():
if request.method == 'GET':
return render_template('register.html')
else:
email = request.form.get('email')
# password = request.form.get('password')
try:
send_mail(to=[email], subject='注册通知邮件', filename='registerok',username=email)
except Exception as e:
flash('注册失败')
return redirect('/register/')
else:
flash("注册成功")
return redirect('/login/')
@app.route('/login/')
def login():
return 'login'
if __name__ == '__main__':
app.run()
配置文件:config.py
MAIL_SERVER = 'smtp.163.com'
# 指定端口,163邮箱端口默认是25,QQ邮箱默认是465
MAIL_PORT = 25
"""
如果使用QQ邮箱,QQ邮箱不支持非加密的协议,那么使用加密协议
# MAIL_USE_SSL = True
"""
MAIL_USERNAME = 'wangtuo1115'
# 此处的密码不是登录密码,而是开启pop3时的授权码
MAIL_PASSWORD = 'xxxxxxx'
# 调试模式打开
DEBUG = True
SECRET_KEY = 'westos'
注意: 配置文件通常单独写成一个py文件,然后在主程序中导入即可。
app.config.from_pyfile(‘config.py’)
注册页面:register.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{% for message in get_flashed_messages() %}
<p style="color: red">{{ message }}</p>
{% endfor %}
<form action='/register/' method="POST">
<input type="email" name="email" placeholder="email"><br>
<input type="password" name="password" placeholder="password"><br>
<input type="submit" value="注册">
</form>
</body>
</html>
注册成功发送邮件内容页面:registerok.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1 style="color: grey">注册成功</h1>
尊敬的用户<strong>{{ username }}</strong>:<br>
您已经注册成功,请直接登录网站.
</body>
</html>