带有 Oauth 的 Gmail 拒绝我的令牌/密码

问题描述 投票:0回答:1

我正在尝试从 Django 发送邮件。我尝试了两种不同的方法,但都以不同的方式失败了。

当我尝试使用应用程序密码时,没有出现任何错误,但电子邮件从未到达。发件人的发件箱也是空的。

但那是在我尝试了现代方法 OAuth 之后。经过一个如果没有 ChatGPT 就永远无法完成的过程(因为没有其他人创建了我能找到的指南),我设置了一些几乎可以工作的东西。我有一个包含刷新令牌的文件,以及一个使用它的自定义后端。

但是当需要发送电子邮件时,我被告知“用户名和密码不被接受。”

令牌文件如下:

{
    "token": "[secret]",
    "refresh_token": "[secret]",
    "token_uri": "https://oauth2.googleapis.com/token",
    "client_id": "[secret]",
    "client_secret": "[secret]",
    "scopes": ["https://www.googleapis.com/auth/gmail.send"],
    "universe_domain": "googleapis.com",
    "account": "",
    "expiry": "2025-01-05T07:39:06.980351Z"
}

这是后端:

from google.auth.transport.requests import Request
from google.oauth2.credentials import Credentials
from django.core.mail.backends.smtp import EmailBackend
from pathlib import Path
import os

class GmailOAuth2Backend(EmailBackend):
    def _get_access_token(self):
        dir = Path(__file__).resolve().parent
        file = os.path.join(dir, 'oauth2tokenfile.secret.json')
        creds = Credentials.from_authorized_user_file(file)
        if creds.expired and creds.refresh_token:
            creds.refresh(Request())
        return creds.token

    def open(self):
        self.password = self._get_access_token()
        super().open()

最后是我的设置

EMAIL_BACKEND = "[secret].GmailOAuth2Backend"
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_PORT = 587
EMAIL_USE_TLS = True
EMAIL_HOST_USER = '[my email]@gmail.com'

根据调试器,creds.valid = True(刷新后)。

django oauth-2.0 gmail
1个回答
0
投票

他不可以不吃这个来的。我有一个有反应的 MFE。

© www.soinside.com 2019 - 2024. All rights reserved.