最近在学《Flask Web开发:基于Python的Web应用开发实战》(第二版)中的第六章,遇到了一些问题,在此记录一下:
app.config['MAIL_SERVER'] = 'smtp.qq.com'
app.config['MAIL_PORT'] = 25
app.config['MAIL_USE_TLS'] = True
app.config['MAIL_USERNAME'] = os.environ.get('MAIL_USERNAME') #或者直接使用邮箱
#app.config['MAIL_USERNAME'] = '16***935@qq.com'
app.config['MAIL_PASSWORD'] = os.environ.get('MAIL_PASSWORD') #或者直接使用授权码'zqx****txnpdfbej'
app.config['FLASKY_MAIL_SUBJECT_PREFIX'] = '[Flasky]'
app.config['FLASKY_MAIL_SENDER'] = 'Administrator Chen <16***6935@qq.com>' #这里的邮箱要和MAIL_USERNAME一样,否则会报错
app.config['FLASKY_RECEIVER'] = os.environ.get('FLASKY_RECEIVER') #或者直接使用'1500****76@qq.com',这里的邮箱是接收者邮箱
这里需要注意的坑有:
- 代码中使用的是qq邮箱服务器,所以MAIL_SERVER是smtp.qq.com
- MAIL_PASSWORD并不是qq邮箱密码,而是使用授权码,进入邮箱>账户>POP3/IMAP/SMTP/Exchange/CardAV/CalDAV服务,开启POP3/SMTP服务,按照qq邮箱的提示开启POP3/SMTP服务。这里直接使用QQ邮箱密码会报535错误。
- 代码中使用的MAIL_USERNAME和MAIL_PASSWORD的值是在环境变量中读取的,因为是临时环境变量,所以必须要在同一个Terminal窗口下执行(mac):
export MAIL_USERNAME='16***6935@qq.com'
export MAIL_PASSWORD='zqx****txnpdfbej'
export FLASKY_RECEIVER='1500****76@qq.com'
其中MAIL_USERNAME是发送者邮箱账户名,MAIL_PASSWORD是发送者邮箱账户授权密码,FLASKY_RECEIVER是用于接收的邮箱。考虑到自己写的项目只是本地学习和验证,为了方便,可以将这些密码直接写在代码中,就像注释那样。
- 建议直接通过下面代码启动服务器:
if __name__ == '__main__':
app.run(debug=True)
通过以下命令启动web服务器并不方便:
export FLASK_APP=hello.py
export FALSK_DEBUG=1
flask run
其余代码和书中相同。
结果:
如果使用环境变量的方式,则先在Pycharm自带的Terminal下面执行:
export MAIL_USERNAME='16***6935@qq.com'
export MAIL_PASSWORD='zqx****txnpdfbej'
export FLASKY_RECEIVER='1500****76@qq.com'
然后,启动服务器:python hello.py
在web页面中输入user

然后QQ邮箱就会收到邮件:

参考代码
网友评论