You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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权限控制,步骤如下:

  1. 创建并配置服务账号
    • 登录Google Cloud控制台,新建项目后启用「Gmail API」
    • 进入「IAM与管理」>「服务账号」,创建新账号,记录其邮箱(如xxx@project-id.iam.gserviceaccount.com)
    • 为该账号生成JSON格式的密钥文件,下载后妥善存储(绝对不能提交到版本库)
  2. 配置域范围委派
    • 登录Google Workspace管理员后台(admin.google.com)
    • 进入「安全」>「API控制」>「域范围委派」,添加服务账号的客户端ID(在Cloud控制台服务账号详情页可查)
    • 授权范围仅填https://www.googleapis.com/auth/gmail.send(遵循最小权限原则,只给发送邮件权限)
  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 05:11:17