Flask中电子邮件的使用
admin
2023-07-20 09:02:24
0

很多Web应用需要在诸如用户注册、密码找回等过程中,进行用户身份的有效性认证。采用电子邮箱进行确认是一种常用的方式。Python标准库smtplib可以实现发送电子邮件的功能,Flask框架的Flask-mail包装了smtplib库,扩展了对电子邮件发送的支持。

0x01 安装Flask-mail

可以采用pip安装Flask-mail:

pip install flask-mail1

0x02 初始化配置

创建email的蓝本(app/__init__.py):

from app.email import email as blueprint_email
app.register_blueprint(blueprint_email,url_prefix='/email')12

在初始化文件中导入mail对象:

from flask_mail import Mail
mail=Mail(app)

Flask-mail可以连接SMTP服务器,并把邮件利用这个服务器发送出去。Flask-mail需要进行参数配置,常见参数如下:

序号参数默认值说明
1MAIL_SERVERlocalhostSMTP服务器主机或者IP地址
2MAIL_PORT25电子邮件服务器端口
3MAIL_USE_TLSFalse是否启用传输层安全协议(TLS)
4MAIL_USE_SSLFalse是否启用安全套接层协议(SSL)
5MAIL_USERNAMENone电子邮箱账号用户名
6MAIL_PASSWORDNone电子邮箱账号密码
7MAIL_DEBUGFalse是否启动调试

config.py配置文件中设置(以126邮箱为例,需要开启SMTP服务):

#邮件配置
MAIL_SERVER='smtp.126.com'
MAIL_PORT=25MAIL_USE_TLS=True
MAIL_USERNAME='***@126.com'
MAIL_PASSWORD='******'
MAIL_DEBUG=True1234567

0x03 发送邮件

完成初始化后,创建一个Message实例,包含需要发送邮件的信息(文件/app/email/views.py)。

#coding:utf-8
from flask import render_template,current_app
from app.email import email
from flask_mail import Message@email.route('/send/',methods=['POST','GET'])
def sendmail(content):
    #发送邮件
    msg=Message(u'邮件主题',sender='***@126.com',recipients=['***@qq.com'])
    msg.body=u'邮件内容'
    msg.html=u'

邮件html:{0}

'.format(content)              #获取当前app对象     app=current_app._get_current_object()              with app.app_context():                 from app import mail         mail.send(msg)         return 'Send'

其中,sender是邮件的发送者,recipients包含了全部收件者的邮箱地址列表。

0x04 改进发送过程

我们可以发现,在发送邮件的过程中,会出现程序停滞现象,浏览器也会出现等待,为了避免这个问题,可以采用异步方式来发送邮件。封装邮件发送函数,并启动子线程来发送邮件(文件/app/email/sendMail.py):

#coding:utf-8
from flask_mail import Message
from flask import render_template,current_app
from threading import Thread

#发送邮箱的子线程类
class SendMailThread(Thread):
    def __init__(self,app,msg):
        super(SendMailThread,self).__init__()
        self.__app=app
        self.__msg=msg    #异步发送邮件
    def send_asyc_mail(self,app,msg):
        with app.app_context():            
            from app import mail
            mail.send(msg)    
   def run(self):
        #发送邮件
       self.send_asyc_mail(self.__app,self.__msg) 
       
       
#封装邮件发送过程
# 参数:
   #  subject:邮件主题
   #  recv:收件邮箱地址
   #  template:邮件内容的模板
   #  kw:模板参数键值对列表
def send_mail(subject,recv,template,**kw):
     msg=Message(subject,sender='***@126.com',recipients=recv)
     msg.body=u'邮件内容'
     msg.html=render_template(template,**kw)    # 获取当前app对象
     app=current_app._get_current_object()      # 子线程发送
     send=SendMailThread(app,msg)
     send.start()

/app/email/views.py中定义新的处理函数:

import sendMail
#异步发送邮件
@email.route('/asyc_send/',methods=['POST','GET'])
def sendAsycMail():
    subject=u'异步发送邮件测试'
    rec=['***@qq.com']
    tp='email/send.html'
    test='test'
    #异步发送邮件
    sendMail.send_mail(subject=subject,recv=rec,template=tp,test=test)
    return 'Asyc Send!!!'

上面将邮件内容放在模板中,这样更具有扩展性。采用异步方式发送邮件,可以提高用户体检,发送过程也流畅了许多。

0x05 使用Celery异步发送

当然,有兴趣的同学,可以使用celery实现异步发送。


相关内容

热门资讯

临时改由美伊总统签协议,伊朗发... 据凤凰卫视援引伊朗国家电视台报道,6月18日,伊朗外交部发言人巴加埃表示,双方原计划在瑞士举行正式签...
年度第一爽剧,暴露了东亚人的“... 作者/刘三金 编辑/闫如意爽剧还是太超前了。继各路大女主、大男主之后,爽剧界又开辟出一个新赛道——专...
内容标识制度:给生成式人工智能... “十五五”规划纲要提出,“完善人工智能领域法律法规、政策制度、应用规范、伦理准则”。今年的全国人大常...
南京发布学前教育智能体“宁小智... 中国教育报-中国教育新闻网讯(记者 阿妮尔 通讯员 杨潇)近日,南京市电化教育馆发布南京市学前教育智...
艾能聚获得实用新型专利授权:“... 证券之星消息,根据天眼查APP数据显示艾能聚(920770)新获得一项实用新型专利授权,专利名为“一...
从“制造出海”到“数智出海” ... 6月16日,江苏跨境电商提质发展全省行活动(无锡站)暨2026长三角跨境电商交易会在无锡国际会议中心...
时至今日,经过3次断裂的中国足... 【导读】2025年美加墨世界杯正如火如荼地进行着。其中,同为中国一衣带水的邻国的日韩表现出色。韩国逆...
欧盟27国领导人一致通过涉乌结... 当地时间6月18日,欧洲理事会发布欧盟峰会关于乌克兰问题的结论文件。文件显示,欧盟27国领导人当天一...
取消、推迟!美伊谈判再生变数 当地时间6月18日晚,据美国有线电视新闻网(CNN)报道,白宫方面表示,由于下一阶段谈判的后勤安排尚...
男厨师光膀子救卡喉女顾客被质疑... 6月14日,江苏苏州一家烤鱼店内,一名女顾客用餐时突然发生异物卡喉。同行友人和店员立刻采用海姆立克急...