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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 10:21:26