关于flask mail的教程
如果没有安装flask mail, 执行:
pip3 install flask_mail
配置Flask-Mail
配置 | 默认值 | 功能 |
---|---|---|
MAIL_SERVER | localhost | 邮件服务器 |
MAIL_PORT | 25 | 端口(一般465) |
MAIL_USE_TLS | False | 是否使用TLS协议 |
MAIL_USE_SSL | False | 是否使用SSL协议 |
MAIL_DEBUG | app.debug | 是否为DEBUG模式,打印调试消息 |
MAIL_SUPPRESS_SEND | app.testing | 设置是否真的发送邮件,True不发送 |
MAIL_USERNAME | None | 用户名,填邮箱 |
MAIL_PASSWORD | None | 授权码 |
MAIL_DEFAULT_SENDER | None | 默认发送者,填邮箱 |
MAIL_MAX_EMAILS | None | 一次连接中的发送邮件的上限 |
MAIL_ASCII_ATTACHMENTS | False | 如果 MAIL_ASCII_ATTACHMENTS 设置成 True 的话,文件名将会转换成 ASCII 的。一般用于添加附件。 |
from flask import Flask
from flask_mail import Mail, Message
app = Flask(__name__)
# 邮箱服务器, 每个邮箱的配置不一样
# 因为使用了qq的邮箱所以是smtp.qq.com
# 如果使用了163是smtp.163.com
# 我在这里用的qq
app.config['MAIL_SERVER'] = 'smtp.qq.com'
# 端口要根据设置来改
# 端口一般是465
app.config['MAIL_PORT'] = 465
# qq使用的不是TLS协议
# 应用了TLS的传输协议
# app.config['MAIL_USE_TLS'] = True
# 应用ssl传输协议
app.config['MAIL_USE_SSL'] = True
# 配置邮件的用户名(仅仅只是qq号,不要@qq.com)
app.config['MAIL_USERNAME'] = '123'
# 邮件账户的密码,这个密码是指的授权码!
# 不是密码,一定要授权码,一般是16位的字符
app.config['MAIL_PASSWORD'] = 'absfasdas'
# 设置默认发送的邮箱账号(这里要求是123@qq.com,这种格式)
app.config['MAIL_DEFAULT_SENDER'] = '123@qq.com'
mail = Mail(app)
@app.route('/')
def index():
# sender是发送者的账号
# recipients是接收者的账号
msg = Message('这个是邮件自动发送测试', sender='123@qq.com',
recipients=['456@qq.com'])
msg.body = 'hello'
msg.html = '<b>hello</b> hao'
# 发送邮件
mail.send(msg)
return '<h1>success</h1>'
if __name__ == '__main__':
app.run(debug=True)
# recipients为接收方,可以设置一个或者多个收件人,也可以后续再添加
msg.recipients = ["xxx@qq.com"]
msg.add_recipient("xxxx@qq.com")
当同时发送大量的文件时:
通常在一个 Web 应用中每一个请求会同时发送一封或者两封邮件。在某些特定的场景下,有可能会发送数十或者数百封邮件,不过这种发送工作会给交离线任务或者脚本执行。
with mail.connect() as conn:
for user in users:
message = '...'
subject = "hello, %s" % user.name
msg = Message(recipients=[user.email],
body=message,
subject=subject)
conn.send(msg)
发送附件时:
如果 MAIL_ASCII_ATTACHMENTS 设置成 True 的话,文件名将会转换成 ASCII 的。 当文件名是以 UTF-8 编码的时候,使用邮件转发的时候会修改邮件内容并且混淆 Content-Disposition 描述,这个时候 MAIL_ASCII_ATTACHMENTS 配置项是十分有用的。转换成 ASCII 的基本方式就是对 non-ASCII 字符的去除。任何一个 unicode 字符能够被 NFKD 分解成一个或者多个 ASCII 字符。
with app.open_resource("image.png") as fp:
msg.attach("image.png", "image/png", fp.read())