很多网络应用需要在诸如用户注册,密码找回等过程中,进行用户身份的有效性认证。采用电子邮箱进行确认是一种常用的方式.Python标准库smtplib可以实现发送电子邮件的功能,瓶框架的Flask-mail包装了smtplib库,扩展了对电子邮件发送的支持。
0 x01安装Flask-mail
可以采用脉冲安装Flask-mail:
pip install flask-mail1
0 x02初始化配置
创建电子邮件的蓝本(<代码>应用程序/__init__。py> 代码):
得到app.email import email as blueprint_email app.register_blueprint (blueprint_email url_prefix=& # 39;/电子邮件# 39;)12
在初始化文件中导入邮件对象:
得到flask_mail import 邮件 邮件=邮件(app)
Flask-mail可以连接SMTP服务器,并把邮件利用这个服务器发送出去.Flask-mail需要进行参数配置,常见参数如下:
序号参数默认值说明1 mail_serverlocalhostsmtp服务器主机或者IP地址2 mail_port25电子邮件服务器端口3 mail_use_tlsfalse是否启用传输层安全协议(TLS) 4 mail_use_sslfalse是否启用安全套接层协议(SSL) 5 mail_usernamenone电子邮箱账号用户名6 mail_passwordnone电子邮箱账号密码7 mail_debugfalse是否启动调试在<代码>配置。py> 代码配置文件中设置(以邮126箱为例,需要开启SMTP服务):
#邮件配置 MAIL_SERVER=& # 39; smtp.126.com& # 39; MAIL_PORT=25 mail_use_tls=True MAIL_USERNAME=& # 39; * * * @126.com& # 39; MAIL_PASSWORD=& # 39; * * * * * * & # 39; MAIL_DEBUG=True1234567
0 x03发送邮件
完成初始化后,创建一个消息实例,包含需要发送邮件的信息(文件<代码>/app/电子邮件/观点。py 代码>)。
#编码:utf - 8 得到flask import  render_template current_app 得到app.email import 电子邮件 得到flask_mail import  message.route(& # 39;/发送/& lt;字符串:content> & # 39;,方法=[& # 39;文章# 39;& # 39;得到# 39;]) def sendmail(内容): ,,,#发送邮件 ,,,味精=消息(u # 39;邮件主题& # 39;,发送方=& # 39;* * * @126.com& # 39;,接受者=[& # 39;* * * @qq.com& # 39;]) ,,,msg.body=u # 39;邮件内容& # 39; ,,,msg.html=u # 39; & lt; h4>邮件html: {0} & lt;/h4> & # 39; .format(内容),,,, ,,,, ,,,#获取当前应用对象 ,,,应用=current_app._get_current_object (),,, ,,,, ,,,with app.app_context ():,,,,,,,, ,,,,,,,得到app import 邮件 ,,,,,,,mail.send(味精),,,, ,,,return & # 39;发送# 39;
其中,发送方是邮件的发送者、接受者包含了全部收件者的邮箱地址列表。
0 x04改进发送过程
我们可以发现,在发送邮件的过程中,会出现程序停滞现象,浏览器也会出现等待,为了避免这个问题,可以采用异步方式来发送邮件。封装邮件发送函数,并启动子线程来发送邮件(文件<代码>/app/电子邮件/sendMail。py> 代码):
#编码:utf - 8 得到flask_mail import 消息 得到flask import  render_template current_app 得到threading import 线程 #发送邮箱的子线程类 class SendMailThread(线程): ,,,def __init__(自我,应用,味精): ,,,,,,,超级(SendMailThread,自我). __init__ () ,,,,,,,self.__app=应用 ,,,,,,,self.__msg=msg ,,, #异步发送邮件 ,,,def send_asyc_mail(自我,应用,味精): ,,,,,,,with app.app_context ():,,,,,,,,,,,, ,,,,,,,,,,,得到app import 邮件 ,,,,,,,,,,,mail.send(味精),,,, ,,def 运行(自我): ,,,,,,,#发送邮件 ,,,,,,self.send_asyc_mail (self.__app self.__msg), ,,,,,, ,,,,,, #封装邮件发送过程 #,参数: ,,#,,主题:邮件主题 ,,#,,recv:收件邮箱地址 ,,#,,模板:邮件内容的模板 ,,#,,千瓦:模板参数键值对列的表 def send_mail(主题、recv模板,* *千瓦): ,,,,味精=消息(主题、发件人=& # 39;* * * @126.com& # 39;,接受者=recv) ,,,,msg.body=u # 39;邮件内容& # 39; ,,,,msg.html=render_template(模板,* *千瓦),,,,#,获取当前应用对象 ,,,,应用=current_app._get_current_object(),,,,,, #,子线程发送 ,,,,发送=SendMailThread (app,味精) ,,,,send.start ()
在<代码>/app/电子邮件/观点。py> 代码中定义新的处理函数:
import sendMail #异步发送邮件 .route (& # 39;/asyc_send & # 39;,方法=[& # 39;文章# 39;& # 39;得到# 39;]) def sendAsycMail (): ,,,主题=u # 39;异步发送邮件测试& # 39; ,,,rec=[& # 39; * * * @qq.com& # 39;】 ,,,tp=& # 39;电子邮件/send.html& # 39; ,,,测试=& # 39;测试# 39; ,,,#异步发送邮件 null null瓶中电子邮件的使用