那个网站可以做网站测速对比,创意产品,wordpress 复杂表单,网站建设 学校Flask-Mail可以实现邮件的发送#xff0c;并且可以和 Flask 集成#xff0c;让我们更方便地实现此功能。
1、安装
使用pip安装#xff1a;
$ pip install Flask-Mail或下载源码安装#xff1a;
$ git clone https://github.com/mattupstate/flask-mail.git
$ cd flask-…Flask-Mail可以实现邮件的发送并且可以和 Flask 集成让我们更方便地实现此功能。
1、安装
使用pip安装
$ pip install Flask-Mail或下载源码安装
$ git clone https://github.com/mattupstate/flask-mail.git
$ cd flask-mail
$ python setup.py install2、发送邮件
Flask-Mail 连接到简单邮件传输协议 (Simple Mail Transfer Protocol, SMTP) 服务器并把邮件交给这个服务器发送。这里以QQ邮箱为例介绍如何简单地发送邮件。在此之前我们需要知道QQ邮箱的服务器地址和端口是什么
# -*- coding: utf-8 -*-
from flask import Flask
from flask_mail import Mail, Message
import os
app Flask(__name__)
app.config[MAIL_SERVER] smtp.qq.com # 邮件服务器地址
app.config[MAIL_PORT] 25 # 邮件服务器端口
app.config[MAIL_USE_TLS] True # 启用 TLS
app.config[MAIL_USERNAME] os.environ.get(MAIL_USERNAME) or meexample.com
app.config[MAIL_PASSWORD] os.environ.get(MAIL_PASSWORD) or 123456
mail Mail(app)
app.route(/)
def index():msg Message(Hi, sendermeexample.com, recipients[heexample.com])msg.html bHello Web/b# msg.body The first email!mail.send(msg)return h1OK!/h1
if __name__ __main__:app.run(host127.0.0.1, debugTrue)在发送前需要先设置用户名和密码当然你也可以直接写在文件里如果是从环境变量读取可以这么做
$ export MAIL_USERNAMEmeexample.com
$ export MAIL_PASSWORD123456将上面的sender和recipients改一下就可以进行测试了。
从上面的代码我们可以知道使用 Flask-Mail 发送邮件主要有以下几个步骤
配置 app 对象的邮件服务器地址端口用户名和密码等创建一个 Mail 的实例mail Mail(app)创建一个 Message 消息实例有三个参数邮件标题、发送者和接收者创建邮件内容如果是 HTML 格式则使用msg.html如果是纯文本格式则使用msg.body最后调用mail.send(msg)发送消息
Flask-Mail 配置项 Flask-Mail 使用标准的 Flask 配置 API 进行配置下面是一些常用的配置项
3、异步发送邮件
使用上面的方式发送邮件会发现页面卡顿了几秒才出现消息这是因为我们使用了同步的方式。为了避免发送邮件过程中出现的延迟我们把发送邮件的任务移到后台线程中代码如下
# -*- coding: utf-8 -*-
from flask import Flask
from flask_mail import Mail, Message
from threading import Thread
import os
app Flask(__name__)
app.config[MAIL_SERVER] smtp.qq.com
app.config[MAIL_PORT] 25
app.config[MAIL_USE_TLS] True
app.config[MAIL_USERNAME] os.environ.get(MAIL_USERNAME) or smtp.example.com
app.config[MAIL_PASSWORD] os.environ.get(MAIL_PASSWORD) or 123456
mail Mail(app)
def send_async_email(app, msg):with app.app_context():mail.send(msg)
app.route(/sync)
def send_email():msg Message(Hi, sendermeexample.com, recipients[heexample.com])msg.html bsend email asynchronously/bthr Thread(targetsend_async_email, args[app, msg])thr.start()return send successfully
if __name__ __main__:app.run(host127.0.0.1, debugTrue)在上面我们创建了一个线程执行的任务是send_async_email该任务的实现涉及一个问题 很多 Flask 扩展都假设已经存在激活的程序上下文和请求上下文。Flask-Mail 中的send()函数使用 current_app因此必须激活程序上下文。不过在不同线程中执行mail.send()函数时程序上下文要使用 app.app_context()人工创建。 4、带附件的邮件
有时候我们发邮件的时候需要添加附件比如文档和图片等这也很简单代码如下
# -*- coding: utf-8 -*-
from flask import Flask
from flask_mail import Mail, Message
import os
app Flask(__name__)
app.config[MAIL_SERVER] smtp.qq.com # 邮件服务器地址
app.config[MAIL_PORT] 25 # 邮件服务器端口
app.config[MAIL_USE_TLS] True # 启用 TLS
app.config[MAIL_USERNAME] os.environ.get(MAIL_USERNAME) or meexample.com
app.config[MAIL_PASSWORD] os.environ.get(MAIL_PASSWORD) or 123456
mail Mail(app)
app.route(/attach)
def add_attchments():msg Message(Hi, sendermeexample.com, recipients[otherexample.com])msg.html bHello Web/bwith app.open_resource(/Users/Admin/Documents/pixel-example.jpg) as fp:msg.attach(photo.jpg, image/jpeg, fp.read())mail.send(msg)return h1OK!/h1
if __name__ __main__:app.run(host127.0.0.1, debugTrue)上面的代码中我们通过app.open_resource(path_of_attachment)打开了本机的某张图片然后通过msg.attach()方法将附件内容添加到 Message 对象。msg.attach()方法的第一个参数是附件的文件名第二个参数是文件内容的MIME (Multipurpose Internet Mail Extensions)类型第三个参数是文件内容。
5、批量发送
在某些情况下我们需要批量发送邮件比如给网站的所有注册用户发送改密码的邮件这时为了避免每次发邮件时都要创建和关闭跟服务器的连接我们的代码需要做一些调整类似如下
with mail.connect() as conn:for user in users:subject hello, %s % user.namemsg Message(recipients[user.email], body..., subjectsubject)conn.send(msg)上面的工作方式使得应用与电子邮件服务器保持连接一直到所有邮件已经发送完毕。某些邮件服务器会限制一次连接中的发送邮件的上限这样的话你可以配置MAIL_MAX_EMAILS。