我正在尝试从 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(刷新后)。
他不可以不吃这个来的。我有一个有反应的 MFE。