AttributeError: 'SendGridAPIClient' object has no attribute 'send'

AttributeError: 'SendGridAPIClient' object has no attribute 'send'

我正在使用 sendgrid 通过 django 发送邮件,但是,它一直说 AttributeError: 'SendGridAPIClient' object has no attribute 'send'

重现步骤
  1. 安装发送网格 pip install sendgrid
  2. 运行 脚本
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!",
)
email_data.dynamic_template_data = json.dumps({
    "username": "example username",
    "item_name": "example item name",
    "item_slug": "path to example item slug",
    "template_id": "transactional template id",
    "message_type": "EMAIL"
})

response = sg.send(request_body=email_data.get())

错误:

Traceback (most recent call last):
  File "/Users/Retina15/project/virtual/lib/python3.6/site-packages/django/core/handlers/exception.py", line 35, in inner
    response = get_response(request)
  File "/Users/Retina15/project/virtual/lib/python3.6/site-packages/django/core/handlers/base.py", line 128, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "/Users/Retina15/project/virtual/lib/python3.6/site-packages/django/core/handlers/base.py", line 126, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/Users/Retina15/project/virtual/lib/python3.6/site-packages/django/views/decorators/csrf.py", line 54, in wrapped_view
    return view_func(*args, **kwargs)
  File "/Users/Retina15/project/virtual/lib/python3.6/site-packages/rest_framework/viewsets.py", line 116, in view
    return self.dispatch(request, *args, **kwargs)
  File "/Users/Retina15/project/virtual/lib/python3.6/site-packages/rest_framework/views.py", line 495, in dispatch
    response = self.handle_exception(exc)
  File "/Users/Retina15/project/virtual/lib/python3.6/site-packages/rest_framework/views.py", line 455, in handle_exception
    self.raise_uncaught_exception(exc)
  File "/Users/Retina15/project/virtual/lib/python3.6/site-packages/rest_framework/views.py", line 492, in dispatch
    response = handler(request, *args, **kwargs)
  File "/Users/Retina15/project/virtual/lib/python3.6/site-packages/rest_framework/mixins.py", line 84, in partial_update
    return self.update(request, *args, **kwargs)
  File "/Users/Retina15/project/virtual/lib/python3.6/site-packages/rest_framework/mixins.py", line 70, in update
    self.perform_update(serializer)
  File "/Users/Retina15/project/virtual/lib/python3.6/site-packages/rest_framework/mixins.py", line 80, in perform_update
    serializer.save()
  File "/Users/Retina15/project/virtual/lib/python3.6/site-packages/rest_framework/serializers.py", line 209, in save
    self.instance = self.update(self.instance, validated_data)
  File "/Users/Retina15/project/store/serializers/event.py", line 358, in update
    response = sg.send(request_body=email_data.get())
AttributeError: 'SendGridAPIClient' object has no attribute 'send'
技术细节:

我来回答我自己。

问题出在 sendgrid 版本上。 sendgrid version 3.6.5中的SendGridAPIClient没有任何方法send()

这是不使用 mail 助手的解决方案:

sg = sendgrid.SendGridAPIClient(apikey="THE_SENDGRID_API_KEY")
data = {
    "personalizations": [
        {
            "to": [
                {
                    "email": "example@email.com"
                }
            ],
            "dynamic_template_data": {
                "subject": "YOUR EVENT IS NOW LIVE ON SITE!",
                "username": user_name,
                "item_name": item_name,
                "item_slug": item_slug,
            },

        }
    ],
    "from": {
        "email": "support@email.africa"
    },
    "template_id": "the_template_id",
}

response = sg.client.mail.send.post(request_body=data)

这是使用 mail 助手的解决方案:

from sendgrid import SendGridAPIClient
from sendgrid.helpers.mail import Mail, Substitution

sg = SendGridAPIClient("the_api_key")

email_data = Mail(
    to_email="example@email.com",
)
email_data.add_personalization(personalization[0].Substitution({
    "username": "example username",
    "item_name": "example item name",
    "item_slug": "path to example item slug"
}))
email_data.set_from("support@email.africa")
email_data.set_subject("YOUR EVENT IS NOW LIVE ON SITE!")
email_data.set_template_id("the_template_id")

response = sg.client.mail.send.post(request_body=email_data.get())