​ 应用场景: 用户在注册或者密码丢失等过程中,账号绑定邮箱,用户在进行身份认证的过程中,电子邮箱确实是一种很常用的方式,Python中提供了smtplib可以实现发送电子邮件功能,Flask框架也有对应的flask-email库,扩展对电子发送的支持

安装

pip3 install flask-mail

导入及初始化

from flask_mail import Mail
mail=Mail(app)

Flask-mail可以连接SMTP服务器,并把邮件利用这个服务器发送出去. Flask-mail服务器相关配置参数:

参数 默认值 说明
MAIL_SERVER loaclhost SMTP服务器主机或者IP地址
MAIL_PORT 25 电子邮件服务器端口
MAIL_USE_TLS False 是否启用传输层安全协议(TLS)
MAIL_USE_SSL False 是否启用安全套接层协议(SSL)
MAIL_USERNAME None 电子邮箱账号用户名
MAIL_PASSWORD None 电子邮箱账号密码
MAIL_DEBUG False 是否启动调试

一般在配置文件config配置如下

#方式1在config文件中配置
MAIL_SERVER='smtp.163.com'
MAIL_PORT=25
MAIL_USE_TLS=True
MAIL_USERNAME='***@163.com'
MAIL_PASSWORD='******'
MAIL_DEBUG=True #方式2 在app中配置
app.config["MAIL_SERVER"] = "smtp.163.com"
app.config["MAIL_PORT"] = 25
app.config["MAIL_USE_SSL"] = True
app.config["MAIL_USERNAME"] = "xxxxx@163.com"
app.config["MAIL_PASSWORD"] = "123456" #方式3 在app中直接配置config
app.config['MAIL_SERVER'] = os.environ.get('MAIL_SERVER','smtp.1000phone.com')
app.config['MAIL_USERNAME'] = os.environ.get('MAIL_USERNAME','xialigang@1000phone.com')
app.config['MAIL_PASSWORD'] = os.environ.get('MAIL_PASSWORD','123456')
# os.environ.get('环境变量名','环境变量值'),将获取的环境变量绑定到config文件

同步邮件发送

from flask import Flask, render_template_string
from flask_mail import Mail, Message
import os app = Flask(__name__) app.config['MAIL_SERVER'] = os.environ.get('MAIL_SERVER', 'smtp.163.com')
app.config['MAIL_USERNAME'] = os.environ.get('MAIL_USERNAME', '发件人@163.com')
app.config['MAIL_PASSWORD'] = os.environ.get('MAIL_PASSWORD', 'mm22kk11') # 绑定实例化mail对象
mail = Mail(app) @app.route('/')
def index():
msg = Message(subject='邮件激活', recipients=['收件人@qq.com'], sender=app.config['MAIL_USERNAME'])
msg.html = render_template_string('<h1>大郎,我是金莲啊<h1>')
mail.send(message=msg)
return '发送邮件' if __name__ == '__main__':
app.run(debug=True) # sender 发送人邮箱 recipients接收人邮箱
# smtp为发送邮件服务器

注意:

1 subject为邮件标题。
2 sender为发送方
3 recipients为接收方,可以设置一个或者多个收件人,也可以后续再添加
4 邮件内容可以包含主体body以及/或者 HTML: msg.recipients = ["xxx@qq.com"]
msg.add_recipient("xxxx@qq.com") msg.body = "testing"
msg.html = "<b>testing</b>" 5 实例化Message 传参如下
msg = Message(subject="Hello World!",
sender="from@qq.com",
recipients=["to@example.com"])

但是这样明显发现有个问题,因为是同步单线程的邮件发送,一旦用户多进入消息队列,这样响应时间会较长影响用户体验,因此我们改进下采用异步多线程的形式发送.

异步多线程发送邮件

from flask import Flask,render_template_string,render_template
from flask_mail import Mail,Message
import os
from threading import Thread app = Flask(__name__) app.config['MAIL_SERVER'] = os.environ.get('MAIL_SERVER','smtp.163.com') app.config['MAIL_USERNAME'] = os.environ.get('MAIL_USERNAME','发件人@163.com') app.config['MAIL_PASSWORD'] = os.environ.get('MAIL_PASSWORD','mm22kk11')
mail = Mail(app)
#开启异步处理
def async_send_mail(app,msg):
#获取当前程序的上下文
with app.app_context():
#邮件发送
mail.send(message=msg) def send_mail(subject,to,tem,**kwargs):
#实例化的message对象(subject,recipients,sender)
msg = Message(subject=subject, recipients=[to], sender=app.config['MAIL_USERNAME'])
#重定向到mail.html
msg.html = render_template(tem+'.html',**kwargs)
#thread代表发送邮件的线程信息
thread = Thread(target=async_send_mail,args=(app,msg))
thread.start() @app.route('/')
def index():
send_mail('邮件激活','收件人@qq.com','mail',username='zhangsan')
return '发送邮件' if __name__ == '__main__':
app.run(debug=True) #mail.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>邮件信息</title>
</head>
<body>
{{ username }},金莲我来了!!
</body>
</html>

以上就是开启的多线程异步发送邮件,可以处理大量的邮件请求,减少用户的等待时间.

Flask入门邮件同步与异步发送(九)的更多相关文章

  1. kafka7 探索生产者同步or异步发送消息

    1.生产者:在发送完消息后,收到回执确认. 主要是在SimpleProducer.java中修改了发送消息的2行代码,用到了回调函数,修改如下: //发送消息 ProducerRecord<St ...

  2. Slickflow.NET 开源工作流引擎基础介绍(十) -- 邮件轮询异步发送模块集成

    前言:在任务数据生成时,为了让办理任务的用户及时获取到待办任务的主题和内容,需要发送通知类的消息,而电子邮件和手机端的短信通知则是比较普通的消息发送.本文是针对电子邮件异步发送模块的实现来做实例说明. ...

  3. 一百四十七:CMS系统之celery实现邮件和短信异步发送

    celery工作原理 celery官方文档:https://docs.celeryproject.org/en/latest/ 安装:pip install celery windows下还需安装ev ...

  4. ActiveMQ producer同步/异步发送消息

    http://activemq.apache.org/async-sends.html producer发送消息有同步和异步两种模式,可以通过代码配置: ((ActiveMQConnection)co ...

  5. iOS使用NSURLConnection发送同步和异步HTTP Request

    1. 同步发送 - (NSString *)sendRequestSync { // 初始化请求, 这里是变长的, 方便扩展 NSMutableURLRequest *request = [[NSMu ...

  6. ajax对象。同步与异步及ajax发送请求

    ajax对象的属性.方法 属性 readyState: Ajax状态码 * 0:表示对象已建立,但未初始化,只是 new 成功获取了对象,但是未调用open方法 1:表示对象已初始化,但未发送,调用了 ...

  7. .NET 同步与异步 之 原子操作和自旋锁(Interlocked、SpinLock)(九)

    本随笔续接:.NET 同步与异步之锁(ReaderWriterLockSlim)(八) 之前的随笔已经说过.加锁虽然能很好的解决竞争条件,但也带来了负面影响:性能方面的负面影响.那有没有更好的解决方案 ...

  8. 关于Web开发里并发、同步、异步以及事件驱动编程的相关技术

    一.开篇语 我的上篇文章<关于如何提供Web服务端并发效率的异步编程技术>又成为了博客园里“编辑推荐”的文章,这是对我写博客很大的鼓励,也许是被推荐的原因很多童鞋在这篇文章里发表了评论,有 ...

  9. Flask入门和快速上手

    目录 Flask入门和快速上手 python三大主流框架对比 Flask安装 依赖 可选依赖 创建flask项目 flask最小应用--hello word 非法导入名称 调试模式 路由 唯一的 UR ...

随机推荐

  1. windows系统如何校验MD5

    需要首先安装openssl软件. 若安装了git for windows,则默认会带有openssl,不需要单独安装了. 打开git bash控制台,执行如下命令即可—— openssl md5 pa ...

  2. [转] JavaScript中的Truthy和Falsy介绍

    [From] http://www.jb51.net/article/59285.htm 与大多数编程语言一样,JavaScript中存在boolean类型,以供逻辑判断使用.不过,和很多其它编程语言 ...

  3. NodeJS使用SSL证书

    [From] https://segmentfault.com/q/1010000004705326 var options = { key: fs.readFileSync('../ssl/priv ...

  4. Oracle sql 中的 ALL,ANY,SOME

    [转自] http://www.itpub.net/thread-1355835-1-1.html any和some是等价的,其与all的前面都只能是比较符号,即=, !=, >, <, ...

  5. PIE SDK中值滤波

    1.算法功能简介 中值滤波是一种最常用的非线性平滑滤波器,它将窗口内的所有像素值按高低排序后,取中间值作为中心像素的新值. 中值滤波对噪声有良好的滤除作用,特别是在滤除噪声的同时,能够保护信号的边缘, ...

  6. jdk8涉及到的接口、类及方法

    bi是binary的简写,二元的,表示两个参数 unary,一元的,表示一个参数 1.函数式接口Supplier T get(),不接收参数,有返回值 IntSupplier,int getAsInt ...

  7. qs.parse()、qs.stringify()、JSON.parse()、JSON.stringify()使用方法

    一.JSON.parse(用于从一个字符串中解析出json 对象)ps:单引号写在{}外,每个属性都必须双引号,否则会抛出异常 let str = '[{"field":" ...

  8. (转) sync命令

    sync sync命令 sync命令用于强制被改变的内容立刻写入磁盘,更新超块信息. 在Linux/Unix系统中,在文件或数据处理过程中一般先放到内存缓冲区中,等到适当的时候再写入磁盘,以提高系统的 ...

  9. Python的静态方法和类成员方法都可以被类或实例访问,两者概念不容易理清,但还是有区别的

    转:http://www.cnblogs.com/2gua/ Python的静态方法和类成员方法都可以被类或实例访问,两者概念不容易理清,但还是有区别的: 1)静态方法无需传入self参数,类成员方法 ...

  10. java线程中的 sleep() wait() yield()

    sleep()方法是让线程休眠  可以指定时间  其实就是让线程进入阻塞状态  指定的时间过后 进入就绪状态  不释锁 相当于抱着锁睡觉 wait()  让线程进入等待状态  被唤醒后才会继续执行   ...