Ошибка при отправке электронной почты через API Sendgrid

На моем рабочем сервере я получаю сообщение об ошибке ниже

"в этом() получил неожиданный ключевой аргумент "apikey""

Тот же код на сервере разработки работает.

На моем рабочем сервере работает gunicorn, и я добавил переменную среды SENDGRID_API_KEY в файл gunicorn.service. Я перезапустил gunicorn и nginx. Я вижу, что переменная окружения загружена.

Метод, который я вызываю для отправки электронной почты, приведен ниже:

def sendtestemail(to):
    sg = sendgrid.SendGridAPIClient(apikey=os.environ.get('SENDGRID_API_KEY'))
    from_email = Email("<myemail>@<mydomain>.com")
    to_email = Email(to)
    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())
    return [response.status_code, response.body, response.headers]

Где находится ваш SENDGRID_API_KEY??? Я в значительной степени уже знаю ответ, но просто хочу убедиться, прежде чем отвечать.

CyberHavenProgramming 22.04.2019 21:29

Привет, это находится в файле gunicorn.service, и я установил его с помощью "-e SENDGRID_API_KEY=<THE API KEY>. Я знаю, что это может быть не идеально, но просто пытаюсь заставить это работать, поскольку это не так, если я попробуйте сослаться на файл.

OptimusPrime 22.04.2019 21:40

Хм, я не уверен в этой настройке, но я делаю это, добавляя свой SENDGRID_API_KEY в мой файл настроек, from projectroot.settings import SENDGRID_API_KEY, а затем добавляя эту переменную в ваш объект sg. Я предполагаю, что os.environ не получает вашу переменную так, как вы ее установили. Этого словарного ключа точно нет в моей настройке.

CyberHavenProgramming 22.04.2019 21:44

Спасибо за ответ, я тоже только что попробовал, но, к сожалению, получаю ту же ошибку.

OptimusPrime 23.04.2019 07:11

Я обнаружил, что сервер разработки имеет версию 5.6.0, а рабочий сервер — версию 6.0.4. Я думаю, что это связано с этим. Если я изменю имя аргумента «apikey» на «api_key», я получу другую ошибку. Затем я получаю сообщение об ошибке: «Объект типа« Электронная почта »не является сериализуемым JSON», что предполагает, что он принимает первую строку кода. Возможно, эта функция устарела, но я проверил документацию на sendgrid.com/docs/for-developers/sending-email/…, и она такая, как я написал. Я связался со службой поддержки SendGrid, чтобы спросить.

OptimusPrime 23.04.2019 19:43
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
5
2 013
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема возникает из-за критического изменения, внесенного в sendgrid 6.0. Аргумент ключевого слова для apikey был удален и заменен позиционным аргументом.

Чтобы разрешить ваш пример, удалите apikey= из ваших аргументов и просто передайте api_key в качестве позиционного аргумента.

    sg = sendgrid.SendGridAPIClient(os.environ.get('SENDGRID_API_KEY'))

Это может немного сбивать с толку, если оглянуться на все предыдущие примеры, а также на документацию GitHub, но этот пример в официальной документации все правильно понимает.


Примечание. Я вижу, что на момент, когда вы задавали свой вопрос, вы действительно правильно следовали документации, которую я указал выше. Есть несколько открытых вопросов, где документация долгое время оставалась неточной, но была устранена еще в мае.

Спасибо, это старый вопрос, но я полагаю, что понял, что API изменился в этой версии, а документация не обновлялась. Я отмечу это как ответ.

OptimusPrime 11.11.2019 10:29

Другие вопросы по теме