Flask-Mail实现邮件发送的两种方法
前言
一直跟随《Flask Web》学习,在学习到电子邮件这一章节,按照书本内容配置,超过几十次测试,仍旧报错,主要错误如下:
- 开启QQ邮箱的SMTP服务,获取16位授权码,并在后期过程中将password设置为授权密码,错误为
socket.error: [Errno 10061]
- 在set PATH,python shell,cmd三者按照先后关系测试多次,错误为
socket.error: [Errno 10061]
- 去除hello.py无关内容,新建qq.py来测试,还是出现错误
socket.error: [Errno 10061]
- Google多个例子,从头到尾配置环境,重点是在TLS和SSL协议设置,gmail和qq.maile设置不同,具体见代码
- 重新测试,依旧报错
- 百度实例,最后避开在环境中配置变量,直接在python shell中赋值给用户名和密码,密码还是为“授权码”,报错:
SMTPAuthenticationError:
直译为简单传输协议授权错误!这个时候就怀疑授权码的时效性了,再次验证,取得新授权码,再次运行显示发送成功。(好激动,想哭有没有)
1.方法一
直接在python shell中运行代码,避开环境变量设置(安全性不足)
#qq.py
# -*- coding: utf-8 -*-
#自行安装flask_mail模块
from flask import Flask
from flask_mail import Mail,Message
app = Flask(__name__)
app.config["MAIL_SERVER"]="smtp.qq.com"
app.config["MAIL_PORT"]=465#25为gmail,qq不适用,常用465或者587
app.config['MAIL_USE_SSL'] = True
app.config["MAIL_USERNAME"]="16xxx1327@qq.com"("MAIL_USERNAME")
app.config["MAIL_PASSWORD"]="bxxxapgylebgxxei"#最新授权码
mail=Mail(app)
msg=Message(subject="Flask",sender="1622571327@qq.com",recipients=["1622571327@qq.com"])
msg.body=u"test for many times!"
with app.app_context():
mail.send(msg)
print "success!"
- POP3/SMTP的SSL加密方式:http://service.mail.qq.com/cgi-bin/help?subtype=1&&id=28&&no=369
2.方法二
先在环境中设置重要变量,再运行脚本,安全性好
步骤:
1在cmd中启动虚拟环境,设置重要变量实际值:
set MAIL_NAME=1622XXXXX@qq.com
set MAIL_PASSWORD=XXXXXX#授权码
2在虚拟环境中,运行以下脚本:
# -*- coding: utf-8 -*-
#qqq.py
from flask import Flask
from flask_mail import Mail,Message
import os
app = Flask(__name__)
app.config["MAIL_SERVER"]="smtp.qq.com"
app.config["MAIL_PORT"]=465
app.config['MAIL_USE_SSL'] = True
app.config["MAIL_USERNAME"]=os.environ.get("MAIL_USERNAME")
app.config["MAIL_PASSWORD"]=os.environ.get("MAIL_PASSWORD")
mail=Mail(app)
msg=Message(subject="Flask",sender="1622571327@qq.com",recipients=["1622571327@qq.com"])
msg.body=u"test for many times!"
with app.app_context():
mail.send(msg)
结论
由多次报错和两个方法对比,可以看出:
- 报错信息及数码是很重要的纠错信息,不可直译,多Google一下
- 方法二中设计环境变量代码和方案一有些不同,前者没有双引号,后面是字符串。