Flask入门邮件同步与异步发送(九)

? 应用场景: 用户在注册或者密码丢失等过程中,账号绑定邮箱,用户在进行身份认证的过程中,电子邮箱确实是一种很常用的方式,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"] = "[email protected]"
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‘,‘[email protected]‘)
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 = ["[email protected]"]
msg.add_recipient("[email protected]")

msg.body = "testing"
msg.html = "<b>testing</b>"

5 实例化Message 传参如下
msg = Message(subject="Hello World!",
              sender="[email protected]",
              recipients=["[email protected]"])

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

异步多线程发送邮件

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>

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

原文地址:https://www.cnblogs.com/why957/p/9135745.html

时间: 2024-10-09 10:17:22

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

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

前言:在任务数据生成时,为了让办理任务的用户及时获取到待办任务的主题和内容,需要发送通知类的消息,而电子邮件和手机端的短信通知则是比较普通的消息发送.本文是针对电子邮件异步发送模块的实现来做实例说明. 1. 邮件发送通知的位置 通常任务数据生成时,就需要发送一封邮件通知,邮件内容包括正文和页面地址信息:任务办理人员在接收到邮件后,会及时登录系统进行任务处理,发送邮件通知的好处就在于方便和及时. 但是邮件发送并不是所有的业务客户都需要的一个功能,它不便于紧耦合地在引擎流转环节,即跟任务数据的生成绑

Ajax知识笔记——入门,同步和异步,XHR

Ajax全称:Asynchronous Javascript and XML ,异步的javascript和XML. Ajax不是一种语言,是一种无需重新加载整个网页的情况下,能更新部分网页的技术. (与后台交互,实现局部更新,异步更新) 同步和异步: 同步(Ajax出现之前):客户端发起请求,服务端对请求进行处理和响应,这期间客户端一直在等待服务器端的响应,得到服务器端的响应之后客户端重新载入页面,这时候如果你有错误,只能再次发起请求,再次等待-- 异步(Ajax出现之后):XMLHttpRe

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

1. 同步发送 - (NSString *)sendRequestSync { // 初始化请求, 这里是变长的, 方便扩展 NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init]; // 设置 [request setURL:[NSURL URLWithString:urlStr]]; [request setHTTPMethod:@"POST"]; [request setValue:host forHTT

【demo】自己写的一个 SpringMail 异步发送邮件的demo。 javamail 邮件异步发送

原文:[demo]自己写的一个 SpringMail 异步发送邮件的demo. javamail 邮件异步发送 源代码下载地址:http://www.zuidaima.com/share/1550463483120640.htm [demo]自己写的一个 SpringMail 异步发送邮件的demo. javamail 邮件异步发送 (注意 配置里面的账号跟发件人账号要一致) 1. 请各位在跑单元测试的时候,在 spring-mail.xml 文件中配置自己的邮箱账号和密码 (我已经注释掉了)

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

ajax对象的属性.方法 属性 readyState: Ajax状态码 * 0:表示对象已建立,但未初始化,只是 new 成功获取了对象,但是未调用open方法 1:表示对象已初始化,但未发送,调用了open方法,但是未调用send方法 2:已调用send方法进行请求 3:正在接收数据(接收到一部分),客户端已经接收到了一部分返回的数据 4:接收完成,客户端已经接收到了所有数据 * status :http响应状态码 200代表成功获取服务器端数据 404未找到页面等等…… statusText

rocketmq的同步发送、oneway发送、异步发送怎么做的?

在sendDefaultImpl方法里面: for (; times < timesTotal; times++) { String lastBrokerName = null == mq ? null : mq.getBrokerName(); MessageQueue mqSelected = this.selectOneMessageQueue(topicPublishInfo, lastBrokerName); if (mqSelected != null) { mq = mqSelec

11.python并发入门(part1 初识进程与线程,并发,并行,同步,异步)

一.什么是进程? 在说什么是进程之前,需要先插入一个进程切换的概念! 进程,可以理解为一个正在运行的程序. 现在考虑一个场景,假如有两个程序A和B,程序A在执行到一半的过程中,需要读取大量的数据输入(I/O操作),而此时CPU只能静静地等待任务A读取完数据才能继续执行,这样就白白浪费了CPU资源.你是不是已经想到在程序A读取数据的过程中,让程序B去执行,当程序A读取完数据之后,让程序B暂停.这当然没问题,但这里有一个关键词:切换. 既然是切换,那么这就涉及到了状态的保存,状态的恢复,加上程序A与

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

一.开篇语 我的上篇文章<关于如何提供Web服务端并发效率的异步编程技术>又成为了博客园里“编辑推荐”的文章,这是对我写博客很大的鼓励,也许是被推荐的原因很多童鞋在这篇文章里发表了评论,有童鞋说我这篇文章理论化很严重,没有实际代码和具体项目做支撑,这个评论让我有种理论和实践脱节的味道,所以我想在这里谈谈我为什么要写这篇文章的原因,这篇文章是把我前不久学习多线程编程的一个总结. 当我从我书堆里找到所有与多线程开发相关的书籍简单阅读后,我发现了一个问题,在java里开发多线程最强有力的实践就是做服

【Mocha.js 101】同步、异步与 Promise

前情提要 在上一篇文章<[Mocha.js 101]Mocha 入门指南>中,我们提到了如何用 Mocha.js 进行前端自动化测试,并做了几个简单的例子来体验 Mocha.js 给我们带来的便利. 在本篇文章中,我们将了解到 Mocha.js 的同步/异步测试,以及如何测试 Promise. 同步代码测试 在上一篇文章中,其实我们已经学会了如何测试同步代码.今天,我们 BDD 风格编写一个测试: var should = require( 'should' ); var Calculator