Flask-Mail
安装
pip install Flask-Mail
配置 Flask-Mail
Flask-Mail 使用标准的 Flask 配置 API 进行配置。下面这些是可用的配置型(每一个将会在文档中进行解释):
- MAIL_SERVER : 默认为 ‘localhost’
- MAIL_PORT : 默认为 25
- MAIL_USE_TLS : 默认为 False
- MAIL_USE_SSL : 默认为 False
- MAIL_DEBUG : 默认为 app.debug
- MAIL_USERNAME : 默认为 None
- MAIL_PASSWORD : 默认为 None
- MAIL_DEFAULT_SENDER : 默认为 None
- MAIL_MAX_EMAILS : 默认为 None
- MAIL_SUPPRESS_SEND : 默认为 app.testing
- MAIL_ASCII_ATTACHMENTS : 默认为 False
### 邮件
MAIL_SERVER = "smtp.qq.com"
MAIL_PORT = 587
MAIL_USERNAME = "xxxx@qq.com"
MAIL_PASSWORD = "xxxxxx"# 授权码不是qq密码
MAIL_DEFAULT_SENDER = "xxxxx@qq.com"
MAIL_USE_TLS = True
如果获取授权码,如下:
相关配置放到配置文件中,通过如下,进行获取配置:
import config
app.config.from_object(config)
初始化实例
邮件是通过一个 Mail
实例进行管理:
from flask import Flask
from flask_mail import Mail
import configapp = Flask(__name__)
app.config.from_object(config)mail = Mail()
mail.init_app(app)
在这个例子中所有的邮件将会使用传入到 Mail
实例中的应用程序的配置项进行发送。
发送邮件
为了能够发送邮件,首先需要创建一个 Message
实例:
from flask_mail import Mail,Message
...
@app.route('/')
def index():msg = Message("Hello World",sender="xxxx@qq.com",recipients= ["xxxx@qq.com","xxxx@qq.com"])
- sender:发送者邮箱
- recipients:接收者的邮箱
设置一个或者多个收件人:
msg.recipients = ["xxxx@qq.com"]
msg.add_recipient("xxxx@qq.com")
如果设置了 MAIL_DEFAULT_SENDER
,就不必再次填写发件人,默认情况下将会使用配置项的发件人:
config.py
MAIL_DEFAUL_SENDER = "xxxx@qq.com"
app.py
@app.route('/')
def index():msg = Message("Hello World",recipients= ["xxxx@qq.com","xxxx@qq.com"])
如果 sender
是一个二元组,它将会被分成姓名和邮件地址:
msg = Message("Hello World",sender=("Me", "me@example.com"))assert msg.sender == "Me <me@example.com>"
邮件内容可以包含主体以及/或者 HTML:
msg.body = "testing"
msg.html = "<b>testing</b>"
最后,发送邮件的时候请使用 Flask 应用设置的 Mail
实例:
mail.send(msg)
大量邮件
通常在一个 Web 应用中每一个请求会同时发送一封或者两封邮件。在某些特定的场景下,有可能会发送数十或者数百封邮件,不过这种发送工作会给交离线任务或者脚本执行。
with mail.connect() as conn:for user in users:message = '...'subject = "hello, %s" % user.namemsg = Message(recipients=[user.email],body=message,subject=subject)conn.send(msg)
- subject:邮件主题
与电子邮件服务器的连接会一直保持活动状态直到所有的邮件都已经发送完成后才会关闭(断开)。
有些邮件服务器会限制一次连接中的发送邮件的上限。你可以设置重连前的发送邮件的最大数,通过配置 MAIL_MAX_EMAILS 。
附件
with app.open_resource("image.png") as fp:msg.attach("image.png", "image/png", fp.read())
如果 MAIL_ASCII_ATTACHMENTS
设置成 True 的话,文件名将会转换成 ASCII 的。 当文件名是以 UTF-8 编码的时候,使用邮件转发的时候会修改邮件内容并且混淆 Content-Disposition 描述,这个时候 MAIL_ASCII_ATTACHMENTS
配置项是十分有用的。转换成 ASCII 的基本方式就是对 non-ASCII 字符的去除。任何一个 unicode 字符能够被 NFKD 分解成一个或者多个 ASCII 字符。
简单测试
app.py
from flask import Flask
from flask_mail import Mail,Message
import configapp = Flask(__name__)
app.config.from_object(config)mail = Mail()
mail.init_app(app)@app.route('/')
def index():msg = Message("Hello World",recipients=["xxxx@qq.com"])mail.send(msg)return "邮件发送成功"if __name__ == '__main__':app.run(debug=True)