Flask发送邮件

Flask框架 2020-08-25 273

在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

 

标签:Flask框架

文章评论

评论列表

已有0条评论