近期在学习《Flask Web开发:基于Python的Web应用开发实战》 一书邮件章节时,在配置上遇到了一个问题,经查阅资料摸索后找到了解决方法。在此总结一下,如大家在学习中有类似疑惑也希望能给大家提供一点帮助。

书中介绍了一种基于环境变量的配置方法,通过将一些敏感数据信息(如邮箱用户名和密码等)以环境变量的形式进行保存,然后使用时再由os模块进行调取。这种配置方法通常使用于开源项目中,以确保信息的安全性且便于系统的管理。

书中具体配置方法

①在 Linux 或 Mac OS X 中使用bash设定环境变量:
(venv) $ export MAIL_USERNAME=<mail username>
(venv) $ export MAIL_PASSWORD=<mail password>
②在Windows 中使用command命令设定环境变量:
(venv) $ set MAIL_USERNAME=<mail username>
(venv) $ set MAIL_PASSWORD=<mail password>

由于本人使用的是windows系统,以此为示例进行演示:

flask配置nginx windows_用户名

这里要注意的是,所配置的属性值是不需要加尖括号<>以及引号的,直接赋值即可,如 set MAIL=abc@example.com

这样一来,按照书中的方法就配置好了,但我们在实际测试发邮件脚本中发现并没有任何效果,后经调试得知环境变量并没有成功配置,通过os调取的是None值,也正是此原因产生了Error



# 测试脚本( send_test.py )
from flask_mail import Message
from hello import *
msg = Message('test subject', sender=app.config['MAIL_USERNAME'],recipients=['other@email.com'])
msg.body = 'text body'
msg.html = '<b>HTML</b> body'
with app.app_context():
    mail.send(msg)

# 查看环境变量值
print(os.environ.get('MAIL_USERNAME'))    # None
print(os.environ.get('MAIL_PASSWORD'))    # None



那这是为什么呢?这还得回到command命令。其实,设置环境变量的命令有两种,一种是set,另一种是setx。这两种长得差不多,其功能差异也不大,但非常关键。

set命令设置环境变量

set设置的环境变量又称为临时环境变量,即其设置的环境变量有效期只在本窗体内,在另一窗体或程序中就自然而然失效了

基本语法:set key=value

setx命令设置环境变量

setx为set的一种升级,其用于设置永久环境变量,即系统环境变量,这样可以确保变量在任何地方都可使用

基本语法:setx key value  (注意没有’=’号)

所以这么一看来,我们如果想通过另一个程序或脚本来发送邮件,需要使用setx设置环境变量:

flask配置nginx windows_环境变量_02

这样一来基本上就可以了,不过本人实测发现结果还是为None值,这也纳闷了,查阅资料发现也没什么问题。后猜想可能是电脑原因,需要重启以“激活”环境变量,结果重启后再次尝试就成功了,如图:

flask配置nginx windows_重启_03

当然,其实除了使用命令来配置环境变量外,也可以手动配置:计算机系统/高级系统设置/高级/环境变量,具体配置这里不再详述,不太明白的地方可以自行到网上搜索

flask配置nginx windows_python_04

以上便是本次关于配置flask-mail用户名和密码的一些经验分享,有任何疑问或见解欢迎大家在评论区留言相互学习。