供不同用户跨设备运行的Python程序如何使用环境变量存储敏感凭证
可行实现方案
以下三个方案均支持跨Windows/Linux系统运行,不会在代码中硬编码邮箱凭证,符合你的需求:
方案1:使用.env配置文件(推荐,开发/评分体验最优)
该方案可以几乎保留你现有环境变量读取逻辑,仅需增加配置文件加载步骤:
- 首先安装
python-dotenv依赖库,执行命令:pip install python-dotenv - 在项目根目录新建
.env文件,写入你的凭证内容:
DB_USER=你的邮箱地址 DB_PASS=你的邮箱授权码
- 修改原有代码,在读取环境变量前加载.env文件,修改后参考代码如下:
import os import smtplib import email.utils from email.message import EmailMessage from dotenv import load_dotenv # 加载同目录下的.env配置文件 load_dotenv() def send_email(): EMAIL_ADDRESS = os.environ.get('DB_USER') EMAIL_PASSWORD = os.environ.get('DB_PASS') contacts = [EMAIL_ADDRESS, 'secondemail@email.com'] msg = EmailMessage() msg['From'] = EMAIL_ADDRESS msg['To'] = ', '.join(contacts) msg['Subject'] = 'HEY YOU!' msg['Date'] = email.utils.localtime() msg.set_content('Yeah you!') files = ['filename.log'] for file in files: # 修复原代码硬编码文件名的问题 with open(file, 'rb') as f: file_data = f.read() file_name = f.name msg.add_attachment(file_data, maintype='application', subtype='octet-stream', filename=file_name) with smtplib.SMTP_SSL('smtp.gmail.com', 465) as smtp: smtp.login(EMAIL_ADDRESS, EMAIL_PASSWORD) smtp.send_message(msg)
提交作业时将.env文件和代码一起打包,同时在作业说明中注明需要先安装python-dotenv依赖即可。该方式实现了凭证和业务代码完全分离,符合你不硬编码的要求。建议使用邮箱服务商提供的应用专用密码,后续如果出现泄露可以单独撤销权限,不会影响邮箱主账号安全。
方案2:运行时临时注入环境变量(无额外依赖)
该方案不需要修改你的现有代码,只需要在作业说明中给导师提供对应系统的运行命令即可:
- Windows系统运行命令:
set DB_USER=你的邮箱地址 && set DB_PASS=你的邮箱授权码 && python 你的脚本文件名.py
- Linux系统运行命令:
DB_USER=你的邮箱地址 DB_PASS=你的邮箱授权码 python 你的脚本文件名.py
该方式不需要安装额外依赖,也不会将凭证写入本地配置文件,适合不允许提交额外配置文件的场景。
方案3:加密配置文件(安全性最高)
如果担心明文配置文件泄露,可以使用对称加密方式加密凭证后写入代码,运行时通过密钥解密:
- 提前用加密工具将你的邮箱凭证加密得到密文,将密文写入代码
- 运行代码时通过命令行参数输入解密密钥(密钥可以单独写在作业说明中)
- 代码运行时动态解密得到凭证,只有同时拿到代码和密钥才能获取真实凭证,安全性最高,适合对安全要求较高的场景。
注意事项
- 优先使用邮箱的应用专用密码,不要直接使用邮箱主密码,降低账号安全风险
- 原示例代码中遍历附件列表时存在硬编码文件名的问题,已在方案1的示例代码中修复
内容的提问来源于stack exchange,提问作者user16313342
相关产品推荐
相关产品推荐

