使用依赖:

flask_mail

安装方式:

pip3 install flask-mail

代码示例:

from flask import Flask
from flask_mail import Mail, Message app = Flask(__name__)
#通过app.config对象的update()方法来加载配置
app.config.update(
MAIL_SERVER="smtp.xxx.com",
MAIL_USE_SSL=True,
MAIL_PORT=465,
MAIL_USERNAME='wangju@xxx.com',
MAIL_PASSWORD="授权码",
MAIL_DEFAULT_SENDER=('wangju', 'wangju@xxx.com') #默认发件人 发件人邮箱
) mail = Mail(app) subject='脚本测试用例维护通知' #邮件主题
recipients='wxx@xxx.com' #收件人
body='测试邮件' #邮件内容 #发送邮件
def send_email(subject,to,body):
message = Message(subject,recipients=[to],body=body)
mail.send(message) @app.route('/')
def subscribe():
send_email(subject,'收件人邮件',body)
return '发送邮件成功,请查收' if __name__ == '__main__':
app.run(debug=True)

遇到的问题1:

运行demo.py时报错:

RuntimeError: Working outside of application context

查询了一番,只知道这个错的意思是没有激活上下文,但是不清楚,没有激活上下文又代表什么意思。

最后才发现,原来就是我在demo.py中

加了视图函数subscribe(),并在其中调用 send_email,就可以正常发送邮件了。

参考文档:

Flask抛出RuntimeError: Working outside of application context.错误

遇到的问题2:

在视图函数中调用 send_email()函数,导致响应时间超过20秒

这是因为 程序正在发送电子邮件,发信的操作阻断了请求-响应循环,直到发信的send_mail()函数调用结束后,视图函数才会返回响应。

为了避免这个延迟,可以将发信函数放入后台线程异步执行。

示例代码:

from threading import Thread

#异步发送电子邮件
def _send_async_mail(app,message):
with app.app_context():
mail.send(message) def send_email(subject,to,body):
message = Message(subject,recipients=[to],body=body)
thr=Thread(target=_send_async_mail,args=[app,message])
thr.start() return thr

因为Flask-Mail的send()方法内部调用逻辑中使用了current_app变量,而这个变量只在激活的程序上下文中才存在,这里在后台线程调用

发信函数,但是后台线程并没有程序上下文存在。为了正常实现发信功能,我们传入程序实例app作为参数,并调用app.app_context()手动激活程序上下文 。

再次调用接口发现,响应时间从原来的20s变为了0.7s

【flask-Email】邮件发送的更多相关文章

  1. C# Email邮件发送,功能是密码找回或者重置功能。

    原文:C# Email邮件发送,功能是密码找回或者重置功能. 最近根据公司需求,写个邮件发送.   这里面的传入的地址信息的参数都是经过加密的.  主要是保证用户信息的安全. 帮助类   using ...

  2. flask中邮件发送方法

    from flask import Flask from flask_mail import Mail, Message app = Flask(__name__) #配置邮件:服务器/端口/传输层安 ...

  3. Java Email 邮件发送

    自己所编码的项目出现了问题,且是 24 小时运行于服务器上的. 如果出错了,那么我们也无从而知. 这个时候,只能通过异常捕获,然后将异常信息发送至开发者的邮箱上. 但是一个邮件的发送配置冗长,代码量至 ...

  4. C#发送Email邮件(实例:QQ邮箱和Gmail邮箱)

    下面用到的邮件账号和密码都不是真实的,需要测试就换成自己的邮件账号. 需要引用: using System.Net.Mail; using System.Text; using System.Net; ...

  5. [转]C#发送Email邮件 (实例:QQ邮箱和Gmail邮箱)

    下面用到的邮件账号和密码都不是真实的,需要测试就换成自己的邮件账号. 需要引用:using System.Net.Mail;using System.Text;using System.Net; 程序 ...

  6. 将PPT文件内容转换为图片放在Email邮件正文中发送

    通过Email推送统计报告.一般除了要求将PPT报告文件作为附件发给用户,同时希望将报告内容在邮件中直观展示. 一份统计报告中经常包含柱状图.饼图.好看的图表,这些信息要直接在Email中展示比较复杂 ...

  7. python 发送email邮件带附件

    EMAIL功能实现: 1.发送EMAIL带附件,并且带压缩文件夹做为附件 #_*_coding:utf-8_*_ import smtplib from email.mime.text import ...

  8. Flask 邮件发送

    欢迎关注小婷儿的博客: csdn:https://blog.csdn.net/u010986753 博客园:http://www.cnblogs.com/xxtalhr/ 有问题请在博客下留言或加QQ ...

  9. 【转】C#发送Email邮件

    转自:http://hi.baidu.com/bluesky_cn/item/8bb060ace834c53f020a4df2 下面用到的邮件账号和密码都不是真实的,需要测试就换成自己的邮件账号. 需 ...

  10. email 解析 ,发送 邮件

    email 来源:https://blog.csdn.net/xyang81/article/details/7675160     详见此人其它mail 篇 参考2:http://lib.csdn. ...

随机推荐

  1. 【leetcode】 463. Island Perimeter

    题目: 以二维数组形式表示坐标岛屿,求边长. 例子: [[0,1,0,0], [1,1,1,0], [0,1,0,0], [1,1,0,0]] Answer: 16 Explanation: The ...

  2. Juery入门2

    1.Jquery操作文档 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&q ...

  3. 解释c# Peek 方法

    peek是用来确定你read的文件是否结束了,如果结束了会返回int型 -1 , 举个例子,你可以在输出每一行之前检查一下文件是否结尾,如果没结束就输出此行. StreamReader sr = ne ...

  4. 生成树计数及应用 Matrix-Tree

    例:给定一个图,图上每条边是红色或蓝色 求恰好有K条红边的生成树的个数,N<=50. Matrix-Tree定理 对于限制条件可以利用多项式,把红边边权设为X,蓝边边权设为1. 最后求行列式得到 ...

  5. python中split()及os.path模块的使用方法

    返回path规范化的绝对路径path=os.path.abspath('test.py')print(path)输出 D:\Caps\test.pypath=os.path.abspath('D:\\ ...

  6. 树莓派GPIO引脚标识图

  7. thinkphp5杂谈--模板

    一种新型开源模板   http://www.h-ui.net/H-ui.admin.shtml 下载页面代码 除了curl以外还可以借助  仿站小工具V7.0,操作示意图

  8. windows上部署hadoop(单机版)

    在window系统开发程序时,远程linux服务器上的hadoop速度很慢,影响开发效率,能不能在本地搭建hadoop环境的?答案肯定的,且看下文如何在window上部署hadoop: (源文地址:h ...

  9. 由于代码环境有dev test prod ,每次提交代码需要很多环境,shell脚本即可解决重复命令问题

    在项目外面写入push.sh 内容为 if [  $1!='' ] then    msg=$1; else    msg='bug'; fi   git add .  git commit -m $ ...

  10. excel中汉字转拼音

    Excel中文转拼音(完整版)打开Excel->工具->宏->Viaual Basic编辑器在弹出来的窗口中对着VBAproject点右键->插入->模块下面会出现一个名 ...