使用依赖:

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. crm---本项目的权限控制模式

    一:url权限:  最底层的权限控制,,缺点在与没有预判的机制,造成客户体验下降.           前提: 为controller中的每一个方法(即资源)定义一个资源(Resource)名称,,该 ...

  2. html获取摄像头和相册

    <input type="file" accept="video/*";capture="camcorder"> <inp ...

  3. python 绘制对象检测框及中文信息标注

    # 坐标顺序: 上->左->下->右 def draw_bounding_box_on_image(image, ymin, xmin, ymax, xmax, color='red ...

  4. php通过反射方法调用私有方法

    PHP 5 具有完整的反射 API,添加了对类.接口.函数.方法和扩展进行反向工程的能力. 下面我们演示一下如何通过反射,来调用执行一个类中的私有方法: <?php //MyClass这个类中包 ...

  5. 为什么对华为不拍Arm?

    华为可以靠着现有的 ARMv8 授权坚持很长一段时间,足以等到这波科技禁运结束. 今天,华为在美国遭遇的科技禁运上升到了全球新高度. 据 BBC 报道,由软银全资拥有的英国技术公司 Arm 向员工发出 ...

  6. 使用switchshow/supportshow命令确认Brocade交换机型号(转载)

    switchshow命令(或supportshow日志)中的switchType是以数字来代表不同的交换机型号,完整的对应表格如下: Switchtype EMC / Brocade名称 / 端口 / ...

  7. linux编译安装mysql5.7

    一.下载源码包 -src cd /usr/local/src/mysql--src wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5 ...

  8. 拯救诺基亚X6

    现象:充电不稳,冲不进去电,后来直接黑屏了. 维修方式:更换手机尾插.或者更换整个尾插小板. 手机主板应该没有问题,这是本人某友的手机,据了解磕碰进水等问题.先前先后因为此问题找手机店,维修过两次,费 ...

  9. mvn clean 后 mvn package失败

    项目完全没有问题,就是mvn clean package 失败,或者打包成功后发布项目无法启动. 很可能的原因是,clean后一些需要编译生成的文件还没有生成,直接package会出错,或者packa ...

  10. DOM例子小结(一)

    一.点击按钮切换图片 核心思路: 1.首先获取元素 2.为元素添加点击事件 3.当事件被触发时运行代码 <!DOCTYPE html> <html lang="en&quo ...