Django中使用SMTP发送邮件遭遇谷歌新规则限制的问题求助
解决Django中谷歌SMTP邮件发送失效的方案(适配百万级邮件量)
我完全理解你的困扰——之前稳定运行的SMTP邮件功能突然失效,还要支撑每学期超百万封的发送量,换第三方服务不仅有迁移成本,还可能增加额外开支。下面是针对谷歌新规则的适配方案,专门贴合大规模邮件发送的场景:
1. 快速修复:启用两步验证并使用App Password
如果你的账户是Google Workspace(原G Suite)(这是支撑百万级发送的前提,免费Gmail账户单日限额仅500封,完全无法满足需求),可以先通过这个方法快速恢复功能:
- 登录你的谷歌账户安全设置,开启两步验证(2FA)
- 找到「App Passwords」选项(仅开启2FA后可见),创建一个专门用于Django邮件发送的密码(比如命名为"Django Mail Sender")
- 在Django的
settings.py中替换原邮件密码:
Workspace账户默认单日发送限额为10,000封/用户,若你的需求更高,可联系谷歌申请提升额度(合规邮件通常会获批)。EMAIL_HOST_PASSWORD = "你生成的App Password"
2. 长期稳定方案:配置OAuth2认证
谷歌更推荐OAuth2作为大规模邮件发送的认证方式,比App Password更安全且不易触发限制。你可以这样配置Django:
- 第一步:在Google Cloud Console创建项目并启用Gmail API
进入Google Cloud Console,新建项目后搜索并启用「Gmail API」。 - 第二步:创建OAuth2凭证
若你是Workspace管理员,推荐创建服务账号并开启「域范围授权」,这样可以用服务账号代表域内用户批量发送邮件;个人Workspace账户可创建「OAuth2客户端ID」(类型选桌面/WEB应用)。 - 第三步:配置Django邮件后端
可以使用第三方库django-smtp-oauth2简化配置,或手动修改参数:
刷新令牌可通过OAuth2授权流程获取,Workspace服务账号可生成长期有效令牌,无需频繁刷新。EMAIL_BACKEND = 'django_smtp_oauth2.EmailBackend' EMAIL_HOST = 'smtp.gmail.com' EMAIL_PORT = 587 EMAIL_USE_TLS = True EMAIL_HOST_USER = '你的Workspace邮箱地址' OAUTH2_CLIENT_ID = '你的客户端ID' OAUTH2_CLIENT_SECRET = '你的客户端密钥' OAUTH2_REFRESH_TOKEN = '你的刷新令牌'
3. 优化发送策略避免触发限制
即使是Workspace账户,也需要注意发送规则,避免被标记为垃圾邮件或触发限额:
- 使用Django内置的
send_mass_mail()代替循环发送单封邮件,减少SMTP连接次数,提升发送效率。 - 分批次发送:比如每小时发送500-1000封,避免短时间内集中发送触发阈值。
- 配置DNS验证:添加SPF、DKIM、DMARC记录,这是确保批量邮件不被拒收的核心前提。
- 邮件内容合规:添加清晰的退订链接,主题和内容避免垃圾邮件关键词,确保收件人是主动订阅用户。
内容的提问来源于stack exchange,提问作者Thierno Amadou Sow
相关产品推荐
相关产品推荐

