Flask 邮件发送

今天小婷儿给大家分享的是Flask 邮件发送。

Flask 邮件发送

一、Flask 邮件发送

from flask import Flask, render_template, current_app

from flask_script import Manager

from flask_mail import Mail, Message

from threading import Thread

app = Flask(__name__)

# 配置邮箱服务器

app.config['MAIL_SERVER'] = 'smtp.163.com'

# 邮箱用户

app.config['MAIL_USERNAME'] = '邮箱@163.com'

# 用户密码

app.config['MAIL_PASSWORD'] = '邮箱密码'

# 创建Mail对象

mail = Mail(app)

def async_send_mail(app, msg):

# 邮件发送需要在程序上下文中进行,

# 新的线程中没有上下文,需要手动创建

with app.app_context():

mail.send(msg)

# 封装函数发送邮件

def send_mail(subject, to, template, **kwargs):

# 从代理中获取代理的原始对象

app = current_app._get_current_object()

# 创建用于发送的邮件消息对象

msg = Message(subject=subject, recipients=[to],

sender=app.config['MAIL_USERNAME'])

# 设置内容

msg.html = render_template(template, **kwargs)

# 发送邮件

# mail.send(msg)

thr = Thread(target=async_send_mail, args=[app, msg])

thr.start()

return '邮件已发送'

#路由配置

@app.route('/')

def index():

# 调用函数发送邮件

send_mail('账户激活', '邮件接收者地址', 'activate.html', username='xenia')

return '邮件已发送'

manager = Manager(app)

if __name__ == '__main__':

manager.run()

二、flask-mail

说明:

专门用于发送邮件的扩展库,使用非常方便

安装:

`pip install flask-mail`

使用:

配置邮件发送选项

创建邮件对象

创建消息对象

使用邮件对象发送消息

封装函数发送邮件

将邮件发送的操作通过一个函数完成

使用者只需要在合适的地方调用即可

异步发送邮件

原因:受限于网络的原因,可能会出现长时间等待的情况

解决:在新的线程中完成邮件的发送

问题:邮件发送需要程序上下文,而新的线程中没有,因此需要手动创建程序上下文

理解:循环引用程序实例的解决方案是使用current_app代替app

本文分享自微信公众号 - DB宝(xiaomaimiaolhr)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-06-05

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏后端开发你必须学会的干货

一种非大小排序(先后关系排序)—拓扑排序

在以前很多人可能听过拓扑排序,但可能认为它太难而不愿接触学习,也不清楚是排啥序的,然而拓扑排序实际很简单,生活中也很常用,面试笔试也会遇到,所以掌握拓扑排序已是...

10430
来自专栏Jerry的SAP技术分享

How to include html native content to UI5 page - 直接在xml view里添加html namespace

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

6620
来自专栏code秘密花园

一文搞懂 Webpack 多入口配置

最近在做项目的时候遇到了一个场景:一个项目有多个入口,不同的入口,路由、组件、资源等有重叠部分,也有各自不同的部分。由于不同入口下的路由页面有一些是重复的,因此...

13520
来自专栏容器云生态

Golang下的html/template模块使用

关于template模板,Golang语言提供了两个包text/template和html/template,前者主要用来处理文本文件的变量渲染,而后者主要用于...

10320
来自专栏测试邦

11款常用的安全测试工具

一款安全漏洞扫描工具,支持Web和移动,现在安全测试做漏洞扫描非常适用,它相当于是"探索"和"测试"的过程,最终生成很直观的测试报告,有助于研发人员...

38620
来自专栏itclanCoder

React学习(3)-不可不知的JSX

以上问题即使自己很清楚,但是否有时却总是道不清,说不明?那么读完本文,就豁然开朗了

8010
来自专栏Jerry的SAP技术分享

Uncaught TypeError: object is not a function

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

11530
来自专栏测试一般不一般

Android app 功能代码覆盖率--Jacoco(二)

1.在项目根目录下,进入dos,运行:gradlew.bat jacocoInit,会再app下生成code-voerage文件夹

17120
来自专栏Creator星球游戏开发社区

为什么要选择使用TypeScript,看了就知道原因!

TypeScript 是 JavaScript 的超集(超集:包含关系,比如 C++ 是 C 的超集,TypeScript 是由 JavaScript 发展而来...

23120
来自专栏IT码农

java之@Controller和@RestController以及@GetMapping和@PostMapping接收参数的格式使用

一、1.使用@Controller 注解,在对应的方法上,视图解析器可以解析return 的jsp,html页面,并且跳转到相应页面

34220

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励