Это код для отправки электронной почты с помощью sendgrid. У меня есть правильный ключ api, но браузер отображает ошибку как
HTTP / 1.1 401 Неавторизованный сервер: nginx Дата: Чт, 14 июл 2016 08:14:32 GMT Content-Type: application / json Content-Length: 88 Connection: keep-alive {"errors": [{"message": " Permission denied, неправильные учетные данные "," field ": null," help ": null}]}
<?php require '/sendgrid-php/vendor/autoload.php'; if(require("sendgrid-php/vendor/autoload.php")) {echo "path found";} sendemail('kanwararyan2@gmail.com','SEndgrid','kanwararyan1@gmail.com','HI'); function sendemail($f,$s,$t,$m){ $from = new SendGrid\Email(null, $f); $subject = $s; $to = new SendGrid\Email(null, $t); $content = new SendGrid\Content("text/plain", $m); $mail = new SendGrid\Mail($from, $subject, $to, $content); $apiKey = getenv('Xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'); $sg = new \SendGrid($apiKey); $response = $sg->client->mail()->send()->post($mail); echo $response->statusCode(); echo $response->headers(); echo $response->body(); } ?>
Похоже, вы не установили переменную окружения с помощью ключа api, с которым вы пытаетесь использовать:
$apiKey = getenv(...);
Пожалуйста, проверьте документацию здесь, так как похоже, что вы используете пример кода.
Просто для теста вы можете использовать:
$apiKey = 'add here your api key';
заменяя использование getenv. Он должен работать. Затем вы можете установить ключ api в файле конфигурации или в виде переменной env (в зависимости от вашего приложения), чтобы не перекодировать его в скрипт.
У меня была одна и та же проблема, удалив getenv () и жесткое кодирование ключа API в разрешенной проблеме.
Почему SendGrid решил, что было бы неплохо включить его в примерный код на своем веб-сайте; не указывая на то, что вам нужно сделать больше, чем просто использовать образец кода, я не уверен.
Просто «ПРИМЕЧАНИЕ: вам также нужно установить переменные среды в X-местоположении», было бы достаточно.
В любом случае, все работает и сейчас … спасибо!
Короткий ответ:
У меня был такой же точный вопрос. Вот ответ, который я получил, и я действительно смог реализовать код, отображаемый в документации. В основном вам нужно использовать стороннюю утилиту, которая анализирует файлы .env
и делает данные доступными для вашей рабочей среды PHP.
Из документации утилиты я узнал, что переменные окружения обычно предназначены только для целей разработки, и этот производственный код обычно содержит жесткие кодировки реальных данных (секретов). Весь файл .env
(в этом случае sendgrid.env
и getenv('YOUR_API_KEY')
, так что вам не обязательно обязательно делиться важными данными при обмене кодом, например, на Github, поэтому добавление файла .gitignore
в .gitignore
Читайте оригинальный ответ для полной истории и как получить getenv()
!
Ударяет мой разум, почему они не будут включать такие важные данные в readme.md, но его довольно перепутали, и многие люди застряли. Может быть, я отправлю вопрос, когда найду время, но никаких обещаний.
Зайдите на .readme .readme
для большей ясности! : D
Длительный ответ:
Если вы не используете общий код (т. Е. Это ваш личный проект или ваш клиент не заботится о секретах обмена), вам не нужно устанавливать переменные среды. Удалите строки getenv
из вашего кода и введите код жесткого кода.
Однако, если вы сотрудничаете тогда, в идеале , вам следует выяснить способ не включать конфиденциальную информацию в код, который вы используете. В примере Sendgrid они используют функцию getenv
PHP
для извлечения конфиденциальных данных, но на самом деле не показывают, как хранить эти данные, чтобы они были доступны в вашей рабочей среде PHP. Помимо мини-намеков, таких как добавление файла sendgrid.env
в .gitignore
(сообщение о том, что файл sendgrid.env не будет загружен в репозиторий git), есть много информации о том, как сделать содержимое sendgrid.env ( который хранит вашу api_key, доступную для вашей рабочей среды PHP. Следовательно, каждый раз, когда вы запускаете свой код, PHP обычно не сможет увидеть ваш ключ.
Тем не менее, более глубокий поиск в их git-репозитории, и вы видите более подробный пример, где они используют утилиту PHP dotenv , цель которой – обходить .env-файлы и разрешать PHP анализировать информацию из этих файлов.
Поэтому, чтобы получить getenv('YOUR_API_KEY')
) для работы, вам нужно либо использовать утилиту dotenv
либо, как мне сказали менеджер сообщества SendGrid, « самостоятельно выяснить, как безопасно хранить переменные среды и сделать их доступными к среде PHP ".
Попробуйте использовать этот ключ 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
API Key id zVrH6X0zQxW7nqu5rxcoUw его дает deniel.
Для тех, кто все еще борется с этим, вы можете удалить функцию env () из упаковки вашего ключа.
$apiKey = ''
Это будет нормально в разработке, но для производства обратитесь к этому разделу в документации по сетке отправки:
Переменные среды установки
Обновите среду разработки с помощью SENDGRID_API_KEY, например:
echo "export SENDGRID_API_KEY='YOUR_API_KEY'" > sendgrid.env echo "sendgrid.env" >> .gitignore source ./sendgrid.env
Для меня после создания API в SendGrid они отображают API TOKEN и сообщают вам, что они только показывают его один раз по соображениям безопасности и сохраняют его в некотором безопасном месте. Этот API TOKEN сильно отличается от API-ключа, в котором предлагается пример кода. Это то, что мне нужно было использовать в переменной $ apiKey без getenv (..). Надеюсь, это поможет кому-то еще быстрее добраться до него …