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

如何通过OAuth授权Gmail账户,结合django-allauth发送验证邮件

如何通过OAuth授权Gmail账户,结合django-allauth发送验证邮件

我太懂你的烦恼了!2025年Google彻底禁用低安全应用权限后,原来用Gmail发验证邮件的老方法直接失效,而且django-allauth的文档乍一看好像只和用户登录挂钩,完全摸不着头脑——别慌,我一步步给你捋清楚怎么把OAuth授权和django-allauth结合起来发验证邮件。

首先得明确:你之前在Google Cloud Console搞定的OAuth同意屏幕、Client ID、Client Secret是完全正确的起步,接下来核心是把Gmail的SMTP服务和OAuth2授权绑定,同时让django-allauth复用这个配置来发验证邮件。

第一步:安装必要的依赖包

Django本身不直接支持SMTP OAuth2,所以得装个辅助包,打开终端跑这个命令:

pip install django-smtp-oauth2

第二步:配置Django的邮件和OAuth参数

打开你的settings.py,替换原来的邮件配置,改成下面这样:

# 邮件后端换成支持OAuth2的版本
EMAIL_BACKEND = 'django_smtp_oauth2.EmailBackend'

# Gmail SMTP服务器设置
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_PORT = 587
EMAIL_USE_TLS = True

# 你的Gmail邮箱地址
EMAIL_HOST_USER = 'your-sender-email@gmail.com'

# 填入你在Google Cloud拿到的OAuth凭据
EMAIL_OAUTH2_CLIENT_ID = '你的Client ID'
EMAIL_OAUTH2_CLIENT_SECRET = '你的Client Secret'
# 重点:获取Gmail的SMTP刷新令牌,下面会说怎么拿
EMAIL_OAUTH2_REFRESH_TOKEN = '你的刷新令牌'

关于刷新令牌的获取:你可以用Google的OAuth2 Playground,选上Gmail API的https://mail.google.com/权限,一定要勾选“离线访问”,这样才能拿到长期有效的刷新令牌。拿到后要妥善保存,别直接写在代码里,最好用环境变量读取(比如os.getenv("EMAIL_OAUTH2_REFRESH_TOKEN"))。

第三步:和django-allauth的配置联动

你之前看的allauth Google文档其实主要是用户登录用的,但发验证邮件的部分,allauth会自动调用Django的邮件后端,所以只要上面的邮件配置对了,allauth的验证邮件就会走这个OAuth授权的Gmail账户发送。

不过还是要确保allauth的基础配置没问题:

  • 先在INSTALLED_APPS里加上这些:
INSTALLED_APPS = [
    # ... 其他已有的app
    'allauth',
    'allauth.account',
    'allauth.socialaccount',
    'allauth.socialaccount.providers.google',
]
  • 然后在settings末尾加上Google社交登录的配置(和发邮件用同一个OAuth凭据就行):
SOCIALACCOUNT_PROVIDERS = {
    'google': {
        'APP': {
            'client_id': '你的Client ID',
            'secret': '你的Client Secret',
            'key': ''
        },
        'SCOPE': [
            'profile',
            'email',
        ],
        'AUTH_PARAMS': {
            'access_type': 'online',
        }
    }
}

这里要划个重点:这个配置是给用户用Google账号登录你的Django应用的,而发验证邮件用的是你自己的Gmail账户(也就是EMAIL_HOST_USER),两者用同一个OAuth凭据完全没问题,但作用是分开的,别搞混啦。

第四步:测试配置是否生效

打开Django的shell测试一下:

from django.core.mail import send_mail
send_mail(
    '测试邮件标题',
    '这是一封测试验证邮件',
    'your-sender-email@gmail.com',
    ['test-recipient@example.com'],
    fail_silently=False,
)

如果能收到邮件,说明配置全部正确,接下来django-allauth在发送用户注册验证邮件、密码重置邮件时,就会自动用这个OAuth授权的Gmail账户发送了。

额外注意事项

  • 如果你用的是Google Cloud的“外部”OAuth同意屏幕,记得把你的发件人Gmail邮箱添加为测试用户,不然会出现授权限制
  • 确保你的Google Cloud项目已经启用了Gmail API(在API库里搜Gmail API就能启用)

备注:内容来源于stack exchange,提问作者Puzzleshock

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 16:27:57