如何通过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

