Django集成SendGrid发邮件报错:'SendGridAPIClient'无'send'属性
解决AttributeError: 'SendGridAPIClient' object has no attribute 'send'
这个问题很典型——你使用的SendGrid Python SDK版本(3.6.5)不支持send()这个简化调用方法,这个便捷方法是在更高版本的库中才引入的,旧版本的客户端需要通过API端点的方式发起请求。
我给你两个可行的解决思路:
方案一:升级SendGrid库(推荐)
这是最省心的方案,升级后不仅能解决这个错误,还能拿到新版的功能和Bug修复。
- 先执行升级命令:
pip install --upgrade sendgrid
- 然后调整你的代码(还有两个容易踩的坑要修正):
dynamic_template_data不需要用json.dumps()处理,直接传Python字典就行,SendGrid会自动处理序列化template_id应该单独设置,而不是塞进dynamic_template_data里,不然模板会找不到ID- 新版的
send()方法可以直接接收Mail对象,不用额外调用.get()
修改后的代码如下:
from sendgrid import SendGridAPIClient from sendgrid.helpers.mail import Mail sg = SendGridAPIClient("the_api_key") email_data = Mail( from_email="support@email.africa", to_email="example@email.com", subject="YOUR EVENT IS NOW LIVE ON SITE!", template_id="transactional template id" # 在这里直接指定模板ID ) # 直接赋值字典,去掉json.dumps() email_data.dynamic_template_data = { "username": "example username", "item_name": "example item name", "item_slug": "path to example item slug", "message_type": "EMAIL" } # 新版send方法直接传入email_data即可 response = sg.send(email_data)
方案二:适配旧版本调用(不升级)
如果项目依赖限制不能升级库,那你就需要用旧版本的API端点调用方式,替换掉报错的那一行:
# 把原来的response = sg.send(request_body=email_data.get()) # 替换成下面这行 response = sg.client.mail.send.post(request_body=email_data.get())
同样要记得修正dynamic_template_data和template_id的问题,不然即使发送成功,模板也无法正确渲染。
内容的提问来源于stack exchange,提问作者Newton Karanu
相关产品推荐
相关产品推荐

