在Flask中发送邮件常使用'Flask-Mail'库:
pip install flask-mail
1.配置Flask-Mail
常用配置
配置键 | 说明 |
MAIL_SERVER | 用于发送邮件的SMTP服务器,默认localhost |
MAIL_PORT | 发信端口,默认25 |
MAIL_USE_TLS | 是否使用STRTTLS,默认Flase |
MAIL_USE_SSL | 是否使用SSL/TLS,默认False |
MAIL_USERNAME | 发信服务器用户名,默认None |
MAIL_PASSWORD | 发信服务器的密码,默认None |
MAIL_DEFAULT_SENDER | 默认发信人,默认None |
对于发送邮件加密可以避免邮件被拦截和篡改。SSL(安全套接字层)和TLS(传输层安全)是两种常用的邮件安全协议。
TLS继承自SSL,所以大多数情况下,二者可以互换使用。STARTTLS是另一种加密方式,它会对不安全的连接进行升级(使用SSL/TLS),尽管名字带有TLS,但是使用后,它可能使用SSL,也可能是TLS
例子:
# SSL/TLS加密
MAIL_USE_SSL = True
MAIL_PORT = 465
# STARTTLS加密
MAIL_USE_TLS = True
MAIL_PORT = 587
不加密时,默认25端口
完整例子:
from flask import Flask
from flask_mail import Mail, Message
app = Flask(__name__)
app.config.update(
MAIL_SERVER='smtp.qq.com',
MAIL_PORT=587,
MAIL_USE_TLS=True,
MAIL_USERNAME='xxxx@qq.com',
MAIL_PASSWORD='xxxxxxxx',
# (姓名, 发信地址)
MAIL_DEFAULT_SENDER=('hh', 'xxxxx@qq.com'), # 设置默认发信人后,发信时不用制定了
)
mail = Mail(app)
@app.route('/')
def hello_world():
# 主题, 收件人, 正文, 发信人
# recipients为列表,可以指定多个邮箱
message = Message(subject='hello', recipients=['xxxxx@qq.com'], body='welcome to')
mail.send(message)
return 'Hello World!'
进阶
提供HTML正文
电子邮件的正文可以是纯文本,可以是html格式文本,当2者都存在时,优先显示html格式的正文。
对于编写html的正文,以下为最佳实践:
- 使用table布局,而非div
- 使用行内样式定义
- 尽量使用比较基础的css属性,避免使用快捷属性如background,定位属性float等
- 正文宽度不应超过600px
- 避免使用js代码
- 避免使用背景图片
传入html正文,可以在Message中指定html属性
编写纯文本正文和html正文,可以使用Jinja2模板。
异步发送邮件
直接在视图中使用邮件发送会产生延迟,影响用户体验,可以将发信函数放入后台线程异步执行
from threading import Thread
def _send_async_mail(app, message):
with app.app_context():# 将Flask的app推入栈中
mail.send(message)
def send_mail(subject, to, body):
message = Message(subject, recipients=[to], body=body)
thr = Thread(target=_send_async_mail, args=[app, message])
thr.start()
return thr
评论列表
已有0条评论