Django配置SendGrid邮件API报AttributeError: 'str'对象无get属性错误
问题根因
触发AttributeError: 'str' object has no attribute 'get'报错的直接原因是你使用的SendGrid Python SDK版本中,Mail类的入参不接受普通字符串类型,必须传入SDK封装的对应类实例;除此之外你的代码和配置里还有两处隐藏问题,就算修复参数类型也无法正常发信。
逐点错误说明
- 入参类型错误:当前安装的SendGrid SDK版本中,
from_email、to_email、content字段需要传入Email、To、Content类的实例,直接传入字符串时,SDK内部调用实例方法.get()就会抛出你看到的属性错误。 - API密钥读取逻辑不一致:你在Django配置文件中是从项目目录下的
SENDGRID_API_KEY.txt文件读取密钥,但发信代码中是从系统环境变量读取密钥,两边取值路径不统一,会导致初始化SendGrid客户端时拿到空值。 - 沙箱模式拦截发信:你配置了
SENDGRID_SANDBOX_MODE_IN_DEBUG=True,当Django运行在DEBUG模式时,所有发信请求只会发到SendGrid沙箱环境,不会真实投递到收件箱,测试阶段如果需要实际收信要临时关闭该配置。
可直接复用的修复方案
首先修正Django配置部分,统一密钥读取逻辑:
import os from pathlib import Path BASE_DIR = Path(__file__).resolve().parent.parent # 统一读取API密钥,避免多模块取值不一致 with open(os.path.join(BASE_DIR, 'SENDGRID_API_KEY.txt')) as f: SENDGRID_API_KEY = f.read().strip() # 将密钥写入环境变量,供业务代码调用 os.environ['SENDGRID_API_KEY'] = SENDGRID_API_KEY EMAIL_HOST = 'smtp.sendgrid.net' EMAIL_BACKEND = 'sgbackend.SendGridBackend' EMAIL_HOST_USER = 'apikey' EMAIL_HOST_PASSWORD = SENDGRID_API_KEY EMAIL_PORT = 587 EMAIL_USE_TLS = True DEFAULT_FROM_EMAIL = 'dac@projectado.com' # 测试阶段关闭沙箱模式,确认发信正常后再按需开启 SENDGRID_SANDBOX_MODE_IN_DEBUG = False
再修正发信代码,传入符合SDK要求的参数类型,同时修正原代码的缩进错误:
import os from sendgrid import SendGridAPIClient from sendgrid.helpers.mail import Mail, Email, To, PlainTextContent message = Mail( from_email=Email('dac@projectado.com'), to_emails=To('taylor.ryanc@gmail.com'), subject='Sending with Twilio SendGrid is Fun', plain_text_content=PlainTextContent('test123') ) try: sg = SendGridAPIClient(os.environ.get('SENDGRID_API_KEY')) response = sg.send(message) print(response.status_code) print(response.body) print(response.headers) except Exception as e: print(str(e))
额外排查项
- 确认
SENDGRID_API_KEY.txt内的密钥没有多余空格、换行,密钥本身要开通邮件发送权限,不要用权限受限的测试密钥。 - 确认发信人邮箱
dac@projectado.com已经在SendGrid后台完成单邮箱验证或者域名验证,否则SendGrid会直接拒绝发信请求。 - 如果你使用的是6.0及以上版本的SendGrid SDK,
Mail类的收件人参数名已经从to_email改为to_emails,内容参数需要明确指定是纯文本还是HTML类型,直接传字符串会触发参数校验错误。
内容的提问来源于stack exchange,提问作者Ryan
相关产品推荐
相关产品推荐

