使用依赖:

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. Python 安装cx_Oracle模块折腾笔记

    kali linux/ubuntu下安装: 不得不说安装这个模块很蛋疼,决定做个记录. sudo apt install build-essential unzip python-dev libaio ...

  2. python语音提示

    #coding:utf8 import win32com.client speaker = win32com.client.Dispatch("SAPI.SpVoice") whi ...

  3. Qualcomm_Mobile_OpenCL.pdf 翻译-10-总结

    这篇文档主要是介绍了关于在Adreno GPUs上优化OpenCL代码的详细方法.文档中提供的大量信息能够帮助开发者理解OpenCL基础和Adreno结构,还有最重要的,掌握OpenCL优化技能. O ...

  4. libev个人问题解惑

    我们的游戏后端一直以来用的都是libev,之前尝试过去读源码,因为里面用了大量宏和自己也不够耐心的原因,一直没有看懂.这次终于痛下决心,一定要啃下它,于是在这个星期调整自己的工作学习方式(在读源码的过 ...

  5. 02/Oct/2019:11:55:28 类型的时间转换为

    public static String upDataTime(String time) { Date upTime = new Date(); String newtime = null; Simp ...

  6. 【串线篇】SpringBoot数据访问【数据源/mybatis/指定映射文件位置】

    一.配置数据源 1.1.jdbc版本 JDBC(.tomcat.jdbc.pool.DataSource作为数据源) <?xml version="1.0" encoding ...

  7. Haproxy-4层和7层代理负载实战

    目录 HAProxy是什么 HAProxy的核心能力和关键特性 HAProxy的核心功能 HAProxy的关键特性 HAProxy的安装和运行 安装 运行 添加日志 使用HAProxy搭建L7负载均衡 ...

  8. idea编写第一个springboot程序

    1. 创建一个 springboot 项目 使用 idea 创建的基本步骤: 2. 加入父级,起步依赖 pom.xml文件内容: <?xml version="1.0" en ...

  9. node中controller的get和post方法获取参数

    1.get: const body = ctx.query; // get请求   2.post: const body = ctx.request.body; // post请求

  10. php将base64字符串转换为图片

    昨天用一个js插件 [链接]: http://www.erdangjiade.com/js/910.html 实行了图片裁剪并预览,不过它生产的图片资源是一个base64字符串,不好保存后来在网上找到 ...