Django项目中安全存储Google Workspace邮箱凭据的标准方案咨询
Django项目中安全使用Google Workspace邮箱的方案
一、先解决你遇到的python-decouple问题
你提到安装后模块未识别,大概率是使用方式有误,修正步骤:
- 确保安装的是官方包:
pip install python-decouple - 导入语句必须是
from decouple import config(不要混淆其他同名模块) - .env文件放在项目根目录(和manage.py同级),格式为
KEY=VALUE,比如GOOGLE_EMAIL=your-workspace@domain.com,不要加引号、不要留空格 - 务必把.env加入.gitignore,防止敏感信息提交到版本库
不过即便解决这个问题,直接存储邮箱密码(或App Password)也并非最优方案,下面是更安全的官方推荐方式。
二、推荐方案:服务账号+域范围委派(无需邮箱密码)
这是Google针对Workspace企业级应用的安全方案,完全摒弃密码,基于OAuth2权限控制,步骤如下:
- 创建并配置服务账号
- 登录Google Cloud控制台,新建项目后启用「Gmail API」
- 进入「IAM与管理」>「服务账号」,创建新账号,记录其邮箱(如
xxx@project-id.iam.gserviceaccount.com) - 为该账号生成JSON格式的密钥文件,下载后妥善存储(绝对不能提交到版本库)
- 配置域范围委派
- 登录Google Workspace管理员后台(admin.google.com)
- 进入「安全」>「API控制」>「域范围委派」,添加服务账号的客户端ID(在Cloud控制台服务账号详情页可查)
- 授权范围仅填
https://www.googleapis.com/auth/gmail.send(遵循最小权限原则,只给发送邮件权限)
- Django中实现邮件发送
- 安装依赖:
pip install google-api-python-client google-auth-httplib2 google-auth-oauthlib - 编写发送函数:
from google.oauth2 import service_account from googleapiclient.discovery import build from email.mime.text import MIMEText import base64 from decouple import config def send_workspace_email(to_email, subject, content): SCOPES = ['https://www.googleapis.com/auth/gmail.send'] # 从.env加载密钥文件路径 SERVICE_ACCOUNT_PATH = config('GOOGLE_SERVICE_ACCOUNT_KEY_PATH') # 生成委派凭据(模拟你的Workspace邮箱) credentials = service_account.Credentials.from_service_account_file( SERVICE_ACCOUNT_PATH, scopes=SCOPES ) delegated_creds = credentials.with_subject('your-workspace-email@domain.com') # 构建Gmail服务并发送邮件 service = build('gmail', 'v1', credentials=delegated_creds) msg = MIMEText(content) msg['to'] = to_email msg['subject'] = subject msg['from'] = 'your-workspace-email@domain.com' raw_msg = base64.urlsafe_b64encode(msg.as_bytes()).decode() service.users().messages().send(userId='me', body={'raw': raw_msg}).execute() - 在.env中添加密钥路径:
GOOGLE_SERVICE_ACCOUNT_KEY_PATH=/path/to/your/key-file.json,服务器上要设置文件权限为仅运行Django的用户可读
- 安装依赖:
三、更简单的替代方案:App Password(适合快速场景)
如果只是开发测试或需求简单,可使用App Password(前提是你的Workspace邮箱开启了2FA):
- 登录Google账号「安全」页面,生成专门用于Django的应用密码
- 在Django settings中配置SMTP:
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' EMAIL_HOST = 'smtp.gmail.com' EMAIL_PORT = 587 EMAIL_USE_TLS = True EMAIL_HOST_USER = config('GOOGLE_WORKSPACE_EMAIL') EMAIL_HOST_PASSWORD = config('GOOGLE_WORKSPACE_APP_PASSWORD') - 这种方式比普通密码安全,但权限不可控,仅适合非生产或低敏感场景
总结
- 生产环境优先选择服务账号+域范围委派,完全无密码,权限可控,符合安全最佳实践
- 开发/快速场景可选用App Password+python-decouple,只要解决好模块导入和.env配置即可
内容的提问来源于stack exchange,提问作者Condado
相关产品推荐
相关产品推荐

