flask使用Flask-Mail实现邮件发送

news2024/11/27 21:42:03

Flask-Mail可以实现邮件的发送,并且可以和 Flask 集成,让我们更方便地实现此功能。

1、安装

使用pip安装:

$ pip install Flask-Mail

或下载源码安装:

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

2、发送邮件

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 'me@example.com'
app.config['MAIL_PASSWORD'] = os.environ.get('MAIL_PASSWORD') or '123456'
mail = Mail(app)
@app.route('/')
def index():
    msg = Message('Hi', sender='me@example.com', recipients=['he@example.com'])
    msg.html = '<b>Hello Web</b>'
    # msg.body = 'The first email!'
    mail.send(msg)
    return '<h1>OK!</h1>'
if __name__ == '__main__':
    app.run(host='127.0.0.1', debug=True)

在发送前,需要先设置用户名和密码,当然你也可以直接写在文件里,如果是从环境变量读取,可以这么做:

$ export MAIL_USERNAME='me@example.com'
$ export MAIL_PASSWORD='123456'

将上面的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', sender='me@example.com', recipients=['he@example.com'])
    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(host='127.0.0.1', debug=True)

在上面,我们创建了一个线程,执行的任务是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 'me@example.com'
app.config['MAIL_PASSWORD'] = os.environ.get('MAIL_PASSWORD') or '123456'
mail = Mail(app)
@app.route('/attach')
def add_attchments():
    msg = Message('Hi', sender='me@example.com', recipients=['other@example.com'])
    msg.html = '<b>Hello Web</b>'
    with app.open_resource("/Users/Admin/Documents/pixel-example.jpg") as fp:
        msg.attach("photo.jpg", "image/jpeg", fp.read())
    mail.send(msg)
    return '<h1>OK!</h1>'
if __name__ == '__main__':
    app.run(host='127.0.0.1', debug=True)

上面的代码中,我们通过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.name
        msg = Message(recipients=[user.email], body='...', subject=subject)
        conn.send(msg)

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/976316.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java线程与锁常考知识点

Java线程与锁常考知识点 基础篇1. 创建线程的几种方式2. 线程池创建的方式3. 线程池提交任务的流程4. 线程池有哪些状态 进阶篇1. 说说对线程安全的理解2. 对守护线程的理解3. ThreadLocal的底层原理4. 并发、并⾏、串⾏之间的区别5. Java死锁如何避免&#xff1f;6. 线程池的底…

滑动窗口实例8(最小覆盖子串)

题目&#xff1a; 给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串&#xff0c;则返回空字符串 "" 。 注意&#xff1a; 对于 t 中重复字符&#xff0c;我们寻找的子字符串中该字符数量必须不少于 t…

C/C++中FILE指针的使用总结

在C中&#xff0c;FILE指针是一个用于文件操作的指针类型。它是C语言标准库中的一部分&#xff0c;也被C所继承。通过使用FILE指针&#xff0c;我们可以打开、读取、写入和关闭文件。 在C中&#xff0c;FILE指针通常与标准库中的文件操作函数一起使用&#xff0c;例如fopen(),…

通俗易懂玩QT:QStackedWidget 学习

QStackedWidget 学习 一、介绍 业务需求&#xff0c;用到了 QStackWidget 这个类&#xff0c;然后程序存在很严重的内存泄露问题&#xff0c;所以特意研究了一下 QStackWidget 类&#xff0c;QStackWidget 类的功能是窗体切换&#xff0c;它比 QTabWidget 使用起来更为灵活&a…

【高等数学基础知识篇】——不定积分

文章目录 一、不定积分的概念与基本性质1.1 原函数与不定积分的基本概念1.2 不定积分的基本性质 二、不定积分基本公式与积分法2.1 不定积分基本公式2.2 不定积分的积分法2.2.1 换元积分法2.2.2 分部积分法 三、两类重要函数的不定积分——有理函数与三角有理函数3.1 有理函数的…

架构设计基础设施保障IaaS计算

目录 1 IaaS概述2 服务部署演进历程3 云虚拟机4 云虚拟机如何选型5 云虚拟机的创建操作6 服务部署访问 1 IaaS概述 云计算并不是一种单一类型的产品&#xff0c;而是为满足企业各种IT需求而提供的多种服务。 通过云计算提供的一类这样的服务是基础设施即服务&#xff08;IaaS&a…

蓝桥杯备赛(Day5)——二叉树

二叉树存储 普通做法&#xff0c;二叉树一个节点包括结点的数值以及指向左右子节点的指针 在class Node中 def __init__(self,s,lNone,rNone):self.valNoneself.llself.rr 在竞赛中&#xff0c;我们往往使用静态数组实现二叉树&#xff0c;定义一个大小为N的静态结构体数组…

使用iCloud和Shortcuts实现跨设备同步与自动化数据采集

在如今的数字时代&#xff0c;跨设备同步和自动化数据采集对于提高工作效率和便利性至关重要。苹果的iCloud和Shortcuts App为我们提供了强大的工具&#xff0c;可以实现跨设备同步和自动化数据采集的功能。本文将详细介绍如何利用iCloud和Shortcuts App实现这些功能&#xff0…

英诺森供应链一体化平台解析

近日&#xff0c;2023年中国物流与采购联合会科学技术奖正式公布&#xff0c;该奖项经国家科技部批准&#xff0c;在国家科学技术奖励工作办公室登记备案&#xff0c;是我国物流行业最具影响力的奖项之一。 英诺森联合客户申报的科技项目“英诺森供应链智能数据平台”&#xf…

Golang编写客户端SDK,并开源发布包到GitHub,供其他项目import使用

目录 编写客户端SDK&#xff0c;并开源发布包到GitHub1. 创建 GitHub 仓库2. 构建项目&#xff0c;编写代码Go 代码示例&#xff1a;项目目录结构展示&#xff1a; 3. 提交代码到 GitHub仓库4. 发布版本5. 现在其他人可以引用使用你的模块包了 编写客户端SDK&#xff0c;并开源…

记一次以太网连接失败修复

症状: 很久没用这个电脑了&#xff0c;开机以后&#xff0c;发现连不上校园网。 遂检查网线&#xff0c;发现网线连在自己笔记本是可以用的&#xff0c;说明网线没问题。 但是网线连在主机是红灯常亮黄灯闪烁&#xff0c;怀疑是网卡有问题&#xff08;后证明不是&#xff0c…

成都车展:比亚迪“豹力美学”杀入硬派SUV市场

在熙熙攘攘人头攒动的2023成都国际车展上&#xff0c;如果要评选一家人气最旺的车企展台&#xff0c;那必然非比亚迪莫属。 在比亚迪现场展示的多款车型中&#xff0c;作为比亚迪旗下方程豹品牌的首款车型&#xff0c;以“超级混动硬派SUV”著称的方程豹5&#xff0c;自然吸引了…

nuxt中extendRoutes添加多个扩展路由

文档中https://www.nuxtjs.cn/api/configuration-router有写使用extendRoutes添加多个路由 添加多个路由&#xff0c;数组拼接只能使用push&#xff0c;其实均不管用

【王道】操作系统笔记 第一章 操作系统概述

1.1.1 操作系统的概念和功能 我们熟悉的操作系统有哪些&#xff1f; 从计算机系统的层次结构上看操作系统&#xff1a; 以一台电脑的诞生为例&#xff1a; 第一步&#xff0c;厂家组装一台裸机 第二步&#xff0c;出售前安装操作系统 第三步&#xff0c;用户安装应用程序 第四…

一日一技:Python如何同时调用多个GPT的API?

相信很多同学或多或少都在Python中使用过GPT API&#xff0c;通过Python安装openai库&#xff0c;来调用GPT模型。 OpenAI官方文档中给出了一个示例&#xff0c;如下图所示&#xff1a; OpenAI API 测试 如果你只有一个API账号&#xff0c;那么你可能不觉得这样写有什么问题。…

其他计算机系统基础知识

其他计算机系统基础知识 概述计算机语言多媒体系统工程系统工程方法切克兰德方法并行工程方法综合集成法WSR方法 系统工程的生命周期基于模型的系统工程 概述 不考 学系统工程就行 整体来说考的概率不大&#xff0c;以了解为主 计算机语言 多媒体 15年之前考过 系统工程 系统工…

systemverilog仿真时候传递参数

$test$plusargs和$value$plusarg的区别和使用 本文参考的文章vcs2021 user guiger 别的版本可能会有不一样 纯学习笔记 文章原文 &#xff08; t e s t test testplusargs&#xff09; 在运行时启用调试功能 在“ifdef”编译器指令的位置使用 t e s t test testplusargs系…

web靶场——xss-labs靶机平台的搭建和代码审计

目录 一、web靶场-xss-labs靶机平台的搭建 1、将下载好的压缩包放置php的WWW根目录下 2、配置网站 3、启动MYSQL和Nginx 4、完成后我们就可以在浏览器输入127.0.0.1&#xff1a;8088进入靶场 二、xss-labs靶场通关攻略 第一关&#xff1a; 1、输入代码进行测试&#xf…

Linux——(第三章)Vi和Vim编辑器

目录 1.Vi和Vim的基本介绍 2.Vi和Vim三种模式的切换 3.一般模式 4.编辑模式 5.指令模式 1.Vi和Vim的基本介绍 Vi是Unix操作系统和类Unix操作系统中最通用的文本编辑器。 Vim编辑器是从Vi发展出来的一个性能更强大的文本编辑器。可以主动的以字体颜色辨别语法的正确性&…

Python怎么实现更高效的数据结构和算法? - 易智编译EaseEditing

要实现更高效的数据结构和算法&#xff0c;你可以考虑以下几个方面的优化&#xff1a; 选择合适的数据结构&#xff1a; 选择最适合你问题的数据结构至关重要。例如&#xff0c;如果需要频繁插入和删除操作&#xff0c;可能链表比数组更合适。如果需要高效查找操作&#xff0…