1.普通的邮件发送
- 说明:专门用来实现邮件发送的扩展库,使用非常方便。
- 安装:pip install flask-mail
- 使用:
基本模板搭建
from flask_mail import Mail, Message
import os
# 邮件配置,一定要放在对象创建之前
# 邮箱服务器(163.com qq.com 等)
app.config['MAIL_SERVER'] = 'smtp.邮箱后缀'
# 用户名
app.config['MAIL_USERNAME'] = '邮箱用户名'
# 密码
app.config['MAIL_PASSWORD'] = os.getenv('MAIL_PASSWORD', '123456')
# 可以将密码设置在环境变量里,可以在终端设置set 名字=值
# 创建发送邮件的对象
mail = Mail(app)
- 视图函数
@app.route('/send/')
def send():
# 创建邮件消息对象
msg = Message('账户激活',
recipients=['接收的邮箱'],
#指定发送者,也就是上面配置的用户
sender=app.config['MAIL_USERNAME'])
# 设置邮件内容
msg.html = '恭喜你,中奖了!'
# 发送邮件
mail.send(msg)
return '邮件发送成功'
总结:书写邮箱相关配置
创建发送邮件的Mail对象
创建邮件消息Message对象
使用mail的send方法发送邮件
2.优化:
- 封装函数发送邮件
# 封装函数发送邮件
def send_mail(subject, to, template, **kwargs):
# 处理邮件接收者
if isinstance(to, list):
recipients = to
elif isinstance(to, str):
recipients = to.split(',')
else:
raise Exception('邮件接收者参数有误')
# 创建邮件消息对象
msg = Message(subject=subject, recipients=recipients,
sender=app.config['MAIL_USERNAME'])
# 设置邮件内容
msg.html = render_template(template, **kwargs)
# 发送邮件
mail.send(msg)
@app.route('/send/')
def send():
# 调用函数即可发送邮件
send_mail('账户激活', '接收邮箱', 'activate.html', name='可以写用户名')
return '邮件发送成功'
- 异步发送邮件(为了更好的用户体验)
from flask import current_app
from threading import Thread
# 异步发送邮件
def async_send_mail(app, msg):
# 邮件发送必须在程序上下文中进行
# 新的线程没有上下文,因此需要手动创建上下文
with app.app_context():
mail.send(msg)
在封装好的函数基础上,没有直接发送消息内容,
# 发送邮件:同步发送,会阻塞运行
# mail.send(msg)
# 创建一个线程,在新的线程中发送邮件
thr = Thread(target=async_send_mail, args=(app, msg))
# 启动线程
thr.start()
# 返回线程
return thr
- QQ邮箱发送配置
# 密码,QQ邮箱需要使用授权码
app.config['MAIL_PASSWORD'] = os.getenv('MAIL_PASSWORD', '123456')
# QQ邮箱配置
# app.config['MAIL_PORT'] = 465
# 加密传输
# app.config['MAIL_USR_SSL'] = True