web-dev-qa-db-ja.com

sendgridを使用してメールを送信する際の資格情報が間違っています

これは、sendgridを使用してメールを送信するためのコードです。正しいAPIキーがありますが、ブラウザに次のようなエラーが表示されます。

HTTP/1.1 401 Unauthorized Server:nginx Date:Thu、14 Jul 2016 08:14:32 GMT Content-Type:application/json Content-Length:88 Connection:keep-alive {"errors":[{"メッセージ ":"アクセスが拒否されました、資格情報が間違っています "、"フィールド ":null、"ヘルプ ":null}]}

 <?php
    require '/sendgrid-php/vendor/autoload.php';
    if(require("sendgrid-php/vendor/autoload.php"))
        {echo "path found";}

    sendemail('[email protected]','SEndgrid','[email protected]','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();
}
?>
7
art

使用しようとしているAPIキーで環境変数を設定しなかったようです。

$apiKey = getenv(...);

サンプルコードを使用しているように見えるので、ここで ドキュメント を確認してください。

使用できるテストのためだけに:

$apiKey = 'add here your api key';

getenvの使用法を置き換えます。動作するはずです。次に、APIキーを構成ファイルに設定するか、(アプリケーションに応じて)env変数として設定して、スクリプトにハードコードしないようにすることができます。

25
dlondero

まったく同じ問題が発生しました。getenv()を削除し、APIキーをハードコーディングして問題を解決しました。

SendGridがウェブサイトのサンプルコードに含めるのが良い考えだと判断した理由。サンプルコードを使用する以上のことをする必要があることを指摘せずに、私にはわかりません。

ほんの少しの「注:Xの場所に環境変数を設定する必要もあります」で十分でした。

とにかく、すべてが稼働しています...ありがとうございます!

7
AdheneManx

どうやら、ドキュメントは本来あるべきほど明確ではありません。

短い答え:

私はこれとまったく同じ問題を抱えていました。これが answer で、ドキュメントに表示されているコードを実際に実装することができました。基本的に、_.env_ファイルを解析し、データをPHPランタイムで利用できるようにするサードパーティユーティリティを使用する必要があります。

ユーティリティのドキュメントから、環境変数は通常開発目的のみであり、本番コードには通常実際のデータ(秘密)がハードコーディングされていることがわかりました。 _.env_ファイル全体(この場合は_sendgrid.env_とgetenv('YOUR_API_KEY'))は、Githubなどでコードを共有するときに、必ずしも重要なデータを共有する必要がないため、 _.env_ファイルから_.gitignore_へ。完全なバックストーリーとgetenv()を機能させる方法については、元の回答をお読みください。

Readme.mdにそのような重要なデータが含まれないのはなぜかと思いますが、かなり混乱していて、多くの人が立ち往生しています。時間があるときに問題を提出するかもしれませんが、約束はありません。

dotenv の_.readme_をチェックしてください。 :D

長い答え:

コードを共有していない場合(つまり、これが個人的なプロジェクトであるか、クライアントがシークレットの共有を気にしない場合)、環境変数を設定する必要はありません。コードからgetenv行を削除し、キーをハードコーディングします。

ただし、共同作業をしている場合は、理想的には、共有するコードに機密情報を含めない方法を考え出す必要があります。 Sendgridの例では、PHPgetenv関数を使用して機密データを取得しますが、PHP)で使用できるようにそのデータを保存する方法を実際には示していません。 =ランタイム。_sendgrid.env_ファイルを_.gitignore_に追加するなどのミニヒント(sendgrid.envファイルはgitリポジトリにアップロードされないことを通知)以外にも、その方法に関する多くの情報があります。 sendgrid.envのコンテンツ(api_keyを保存しているものをPHPランタイムで利用できるようにします。したがって、コードを実行するたびに、PHPは実際にはできません)あなたの鍵を見るために。

ただし、gitリポジトリを詳しく検索すると、PHPユーティリティdotenvの目的全体が使用されているより詳細な例が表示されます。 .envファイルをクロールし、PHPがそれらのファイルからの情報を解析できるようにします。

したがって、getenv('YOUR_API_KEY'))を機能させるには、dotenvユーティリティを使用するか、SendGridのコミュニティマネージャーから言われたように、「figure out環境変数を安全に保存し、PHP environment "で利用できるようにする方法を自分で。

7
Govind Rai

まだこれに苦労している人のために、あなたはあなたの鍵を包むことからenv()関数を取り除くことができます。

$apiKey = ''

これは開発では問題ありませんが、本番環境については、SendGridのドキュメントの次のセクションを参照してください。

環境変数の設定

次に、SENDGRID_API_KEYを使用して開発環境を更新します。

echo "export SENDGRID_API_KEY='YOUR_API_KEY'" > sendgrid.env
echo "sendgrid.env" >> .gitignore
source ./sendgrid.env
3
Roni davelman

SendGridでAPIを作成した後、APIトークンが表示され、セキュリティ上の理由から1回だけ表示され、安全な場所に保存されていることが通知されます。このAPIトークンは、サンプルコードで使用が提案されているAPIKEYとはまったく異なります。これは、getenv(..)なしで$ apiKey変数で使用する必要があるものです。それが他の誰かがより早くそれに到達するのに役立つことを願っています...

0
Paul