Интеграция Sendgrid в Google App Engine

Я пытаюсь отправить электронное письмо для сброса пароля с помощью Sendgrid.

Вот трассировка стека ошибки:

Traceback (most recent call last):
  File "C:\Program Files\Google\google_appengine\lib\webapp2-
2.5.2\webapp2.py", line 1535, in __call__
    rv = self.handle_exception(request, response, e)
  File "C:\Program Files\Google\google_appengine\lib\webapp2-
2.5.2\webapp2.py", line 1529, in __call__
    rv = self.router.dispatch(request, response)
  File "C:\Program Files\Google\google_appengine\lib\webapp2-
2.5.2\webapp2.py", line 1278, in default_dispatcher
    return route.handler_adapter(request, response)
  File "C:\Program Files\Google\google_appengine\lib\webapp2-
2.5.2\webapp2.py", line 1102, in __call__
    return handler.dispatch()
  File "C:\Program Files\Google\google_appengine\lib\webapp2-
2.5.2\webapp2.py", line 572, in dispatch
    return self.handle_exception(e, self.app.debug)
  File "C:\Program Files\Google\google_appengine\lib\webapp2-
2.5.2\webapp2.py", line 570, in dispatch
    return method(*args, **kwargs)
  File "C:\Users\C\PycharmProjects\alpha\u\user.py", line 121, in post
    response = sg.client.mail.send.post(request_body=mail.get())
  File "C:\Users\C\PycharmProjects\alpha\python_http_client\client.py", 
line 227, in http_request
    return Response(self._make_request(opener, request))
  File "C:\Users\C\PycharmProjects\alpha\python_http_client\client.py", 
line 161, in _make_request
    raise exc
UnauthorizedError

Я импортировал в свой проект как sendgrid, так и python-http-client. (Почему я должен импортировать это отдельно?)

Вот мой тестовый код, взятый из демонстрации Sendgrid:

class PasswordResetHandler(BaseHandler):
"""
handler to reset the users password.
also to verify if the user email is in the database
"""
def post(self):
    email = self.request.get("email_for_reset")

    sg = sendgrid.SendGridAPIClient(apikey=os.environ.get(SENDGRID_API_KEY))
    from_email = Email("[email protected]")
    to_email = Email(email)
    subject = "Sending with SendGrid is Fun"
    content = Content("text/plain", "and easy to do anywhere, even with Python")
    mail = Mail(from_email, subject, to_email, content)
    response = sg.client.mail.send.post(request_body=mail.get())
    self.redirect('/u/password-reset-confirmation')

Может ли кто-нибудь помочь в том, что здесь происходит?

Спасибо.


person zmdc    schedule 17.07.2017    source источник


Ответы (2)


Я использую другой синтаксис, используя SendGridClient:

sg = sendgrid.SendGridClient(SENDGRID_API_KEY)

message = sendgrid.Mail(
    to =            to, 
    subject =       subject, 
    html =          html, 
    text =          body, 
    from_email =    sender
)

status, msg = sg.send(message)
person GAEfan    schedule 17.07.2017
comment
Спасибо GAEfan, я должен был четко указать, что пытаюсь интегрировать Web API v3. Это код SMTP Relay, который у меня тоже работает. Гораздо проще интегрироваться в проект. - person zmdc; 18.07.2017

Проверьте свой ключ API на наличие опечаток и убедитесь, что он правильно загружается с помощью os.environ.get().

Вы получаете ошибку HTTP 401. Как вы можете видеть в код client.py, содержащий _make_request в строке 161 (и строки, ведущие к нему), вы получаете HTTPError, который обрабатывается в строке 159:

exc = handle_error(err)

handle_error() реализован в exceptions.py, и показывает, что UnauthorizedError исходит из HTTPError 401. Наиболее вероятной причиной является неверный ключ API. Проверьте ключ API на наличие опечаток. Я смог получить ту же ошибку HTTP, вставив неверный ключ API в свой код. Кроме этого, у меня есть эта функция, работающая с тем же кодом, который вы указали в вопросе.

person Brendan Goggin    schedule 27.07.2017
comment
Спасибо за это, я проверяю ключ API. - person zmdc; 29.07.2017
comment
Попробуйте заключить SENDGRID_API_KEY в кавычки, как показано в кратком руководстве: app.sendgrid.com/guide/ интегрировать/langs/python. Так это будет выглядеть sg = sendgrid.SendGridAPIClient(apikey=os.environ.get('SENDGRID_API_KEY')) - person Brendan Goggin; 29.07.2017