Flask扩展 -- flask-mail

电子邮件是最常用的通信方式之一。虽然Python标准库中的smtplib包可用在Flask程序中发送电子邮件,但包装了smtplib的Flask-Mail扩展能更好的和Flask集成。

1.安装Flask-Mail

1.1使用pip安装

pip install flask-mail

1.2 下载源码安装

git clone https://github.com/mattupstate/flask-mail.git
cd flask-mail
python setup.py install

2.flask-mail初始化

from flask import Flask
from flask_mail import Mail, Message

app = Flask(__name__)
mail = Mail(app)

3.Flask-Mail 配置

3.1 Flask-Mail常用配置项

Flask-Mail通过标准的Flask配置API进行配置,这些常用的配置项如下:

配置  默认值 说明
MAIL_SERVER localhost 电子邮件服务器的主机名或IP地址         
MAIL_PORT 25 电子邮件服务器的端口
MAIL_USE_TLS False 启用传输层安全(Transport Layer Security,TLS)协议
MAIL_USE_SSL Flase 启用安全套接层(Secure Sockets Layer,SSL)协议
MAIL_USERNAME None 邮件账户的用户名
MAIL_PASSWORD None 邮件账户的密码
MAIL_DEFAULT_SENDER None 默认发件人,如果Message对象里没指定发件人,就采用默认发件人
MAIL_MAX_EMAILS None 邮件批量发送个数上限,默认为没有上限
MAIL_SUPPRESS_SEND app.testing 调用“Mail.send()”方法后,邮件不会真的被发送,在测试环境中使用,默认为False
MAIL_ASCII_ATTACHMENTS Flase 将附件的文件名强制转换为ASCII字符,避免在某些情况下出现乱码

3.2 常见的SMTP邮箱服务配置

(1)配置QQ邮箱服务器

MAIL_SERVER = ‘smtp.qq.com‘,
MAIL_PROT = 25,
MAIL_USE_TLS = True,
MAIL_USE_SSL = False,
MAIL_USERNAME = "",
MAIL_PASSWORD = "",

QQ邮箱的配置方式如下:

开启了授权之后,就会弹出生成授权码页面:

注意:

a.qq邮箱的服务器地址为smtp.qq.com;

b.邮箱服务的端口为25或者465都可以;

c.TLS,SSL的选择很多人发不出去邮件的关键之一,这里QQ邮箱选择TLS;

d.账号和密码需要特别注意,这里的账号是自己的QQ邮箱账号,密码不是QQ邮箱密码,而是生成的授权码

(2)其他邮箱后续补充

4. 简单功能实现

下面举例说明flask-email扩展是如何实现简单邮件发送的:

from flask import Flask
from flask_mail import Mail, Message
app = Flask(__name__)
app.config.update(
    MAIL_SERVER=‘smtp.qq.com‘,
    MAIL_PROT=465,
    MAIL_USE_TLS=True,
    MAIL_USE_SSL=False,
    MAIL_USERNAME="[email protected]",
    MAIL_PASSWORD="****************",
)

mail = Mail(app)

@app.route(‘/‘)
def index():
# sender 发送方,recipients 邮件接收方列表
    msg = Message("Hi!This is a test ",sender=‘xxxxxxxxxxxxxx@qq.com‘, recipients=[‘[email protected]‘])
# msg.body 邮件正文
    msg.body = "This is a first email"
    mail.send(msg)
    print("Mail sent")
    return ‘send successfully‘
if __name__ == "__main__": app.run(debug=True)

如果想发送信息,首先需要创建一个Message实例:

msg = Message("Hello",sender="[email protected]",recipients=["[email protected]"])

当然,我们也可以单独添加邮件接收对象:

msg.recipients = ["[email protected]"]
msg.add_recipient("[email protected]")

在配置参数的时候,如果我们设置了MAIL_DEFAULT_SENDER参数,在后面创建message实例时不需要清楚指明邮件发送方,此时程序会自动获取默认配置:

msg = Message("Hello",recipients=["[email protected]"])

5.异步发送邮件

使用上面的方式发送邮件,会发现页面卡顿了几秒才出现消息,这是因为我们使用了同步的方式。为了避免发送邮件过程中出现的延迟,我们把发送邮件的任务移到后台线程中。代码如下:

# -*- 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 ‘[email protected]‘
app.config[‘MAIL_PASSWORD‘] = os.environ.get(‘MAIL_PASSWORD‘) or ‘*********‘

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‘, sender=‘[email protected]‘, recipients=[‘[email protected]‘])
    msg.html = ‘<b>send email asynchronously</b>‘

    thr = Thread(target=send_async_email, args=[app, msg])
    thr.start()
    return ‘send successfully‘

if __name__ == ‘__main__‘:
    app.run(debug=True)

在上面,我们创建了一个线程,执行的任务是send_async_email,该任务的实现涉及一个问题:

很多 Flask 扩展都假设已经存在激活的程序上下文和请求上下文。Flask-Mail 中的 send() 函数使用 current_app,因此必须激活程序上下文。不过,在不同线程中执行 mail.send() 函数时,程序上下文要使用 app.app_context()人工创建。

6.带附件的邮件

有时候,我们发邮件的时候需要添加附件,比如文档和图片等,这也很简单,代码如下:

# -*- 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
app.config[‘MAIL_USERNAME‘] = os.environ.get(‘MAIL_USERNAME‘) or ‘[email protected]‘
app.config[‘MAIL_PASSWORD‘] = os.environ.get(‘MAIL_PASSWORD‘) or ‘**********‘

mail = Mail(app)

@app.route(‘/attach‘)
def add_attchments():
    msg = Message(‘A photo‘, sender=‘[email protected]‘, recipients=[‘[email protected]‘])
    msg.html = ‘<b>A beautiful photo!</b>‘

    with app.open_resource("1111.jpg") as fp:
        msg.attach("photo.jpg", "image/jpeg", fp.read())

    mail.send(msg)
    return ‘<h1>OK!</h1>‘

if __name__ == ‘__main__‘:
    app.run(debug=True)

上面的代码中,我们通过 app.open_resource(path_of_attachment) 打开了本机的某张图片,然后通过msg.attach() 方法将附件内容添加到 Message 对象。msg.attach() 方法的第一个参数是附件的文件名,第二个参数是文件内容的 MIME (Multipurpose Internet Mail Extensions) 类型,第三个参数是文件内容。

7.批量发送

在某些情况下,我们需要批量发送邮件,比如给网站的所有注册用户发送改密码的邮件,这时为了避免每次发邮件时都要创建和关闭跟服务器的连接,我们的代码需要做一些调整,类似如下:

with mail.connect() as conn:
    for user in users:
        subject = "hello, %s" % user.name
        msg = Message(recipients=[user.email], body=‘...‘, subject=subject)
        conn.send(msg)

上面的工作方式,使得应用与电子邮件服务器保持连接,一直到所有邮件已经发送完毕。某些邮件服务器会限制一次连接中的发送邮件的上限,这样的话,你可以配置 MAIL_MAX_EMAILS

时间: 2024-10-12 04:00:06

Flask扩展 -- flask-mail的相关文章

Flask 扩展 Mail

安装 pip install flask-mail from flask import Flask from flask_mail import Mail, Message app = Flask(__name__) app.config.update( MAIL_SERVER='smtp.example.com', MAIL_USERNAME='bjhee', MAIL_PASSWORD='example' ) mail = Mail(app) @app.route('/mail') def

(五)flask扩展

纵观上面的内容,发现其实开发Flask小程序非常的简单嘛,但是简单归简单,这么简单的Flask程序用来练练手,玩一玩还是可以的,但是要用来开发实际的项目,恐怕不够吧?不够?你是说功能太单一?譬如,要把数据存储起来怎么办?起码要用到数据库吧?要上传文件怎么办?要写复杂的页面怎么办?写表单怎么办?发邮件呢?...... flask扩展:发送邮件链接:http://pythonhosted.org/Flask-Mail/pip install Flask-Mail #coding:utf-8from

Flask 扩展 缓存

如果同一个请求会被多次调用,每次调用都会消耗很多资源,并且每次返回的内容都相同,就该使用缓存了 自定义缓存装饰器 在使用Flask-Cache扩展实现缓存功能之前,我们先来自己写个视图缓存装饰器,方便我们来理解视图缓存的实现.首先,我们要有一个缓存,Werkzeug框架中的提供了一个简单的缓存对象SimpleCache,它是将缓存项存放在Python解释器的内存中,我们可以用下面的代码获取SimpleCache的缓存对象: from werkzeug.contrib.cache import S

Flask 扩展 国际化 本地化

pip install flask-babel 先初始化一个Flask-Babel的实例 from flask import Flask from flask.ext.babel import Babel app = Flask(__name__) babel = Babel(app) 设置语言和时区 Flask-Babel提供了两个Flask应用配置项: BABEL_DEFAULT_LOCALE: 应用默认语言,不设置的话即为"en" BABEL_DEFAULT_TIMEZONE:

2.6、Flask扩展

Flask 被设计为可扩展形式,故而没有提供一些重要的功能,例如数据库和用户认证,所以开发者可以自由选择最适合程序的包,或者按需求自行开发. 社区成员开发了大量不同用途的扩展,如果这还不能满足需求,你还可使用所有 Python 标准包或代码库.为了让你知道如何把扩展整合到程序中,接下来我们将在 hello.py 中添加一个扩展,使用命令行参数增强程序的功能. 使用Flask-Script支持命令行选项 Flask 的开发 Web 服务器支持很多启动设置选项,但只能在脚本中作为参数传给 app.r

Flask 扩展 HTTP认证

Restful API不保存状态,无法依赖Cookie及Session来保存用户信息,自然也无法使用Flask-Login扩展来实现用户认证.所以这里,我们就要介绍另一个扩展,Flask-HTTPAuth. pip install flask-httpauth 接下来创建扩展对象实例: from flask import Flask from flask_httpauth import HTTPBasicAuth app = Flask(__name__) auth = HTTPBasicAut

Flask从入门到精通之flask扩展

Flask被设计成可扩展形式,因此并没有提供一些重要的功能,比如数据库和用户认证,所以开发者可以自由选择最适合程序的包,或者按需求自行开发.社区成员开发了大量不同用途的扩展,如果这还不能满足需求,你还可使用所有Python 标准包或代码库.为了让你知道如何把扩展整合到程序中,接下来我们将在hello.py 中添加一个扩展,使用命令行参数增强程序的功能. 使用Flask-Script支持命令行选项 Flask 的开发Web 服务器支持很多启动设置选项,但只能在脚本中作为参数传给app.run()函

学习 Flask 扩展 Flask-RESTful

pip install Flask-RESTful Flask-RESTful扩展.首先,我们来安装上面这个扩展. from flask import Flask from flask_restful import Api, Resource, reqparse, abort app = Flask(__name__) api = Api(app) USER_LIST = { 1: {'name':'Michael'}, 2: {'name':'Tom'}, } parser = reqpars

Flask基础(12)--&gt;Flask扩展Flask-Script

Flask基础(12)-->Flask扩展Flask-Script # 前提是安装了Flask-Script # 联网运行 pip install flask-script from flask import Flask from flask_script import Manager # 导入Manger app = Flask(__name__) # 创建Flask对象 class Config(object): DEBUG = True app.config.from_object(Con