【问题标题】:Wrong credentials in sending mail using sendgrid使用 sendgrid 发送邮件时的凭据错误
【发布时间】:2016-11-17 01:29:05
【问题描述】:

这是使用 sendgrid 发送电子邮件的代码,我有正确的 api 密钥,但浏览器仍显示错误

HTTP/1.1 401 未经授权的服务器:nginx 日期:2016 年 7 月 14 日星期四 08:14:32 GMT 内容类型:application/json 内容长度:88 连接:keep-alive {"errors":[ {"message":"权限被拒绝,凭据错误","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键值的环境变量吗?
  • 不需要@dlondero 吗?
  • 是的,否则 getenv() 不会返回值,并且 $apiKey 不会包含您需要的内容。见下文。

标签: php nginx sendgrid


【解决方案1】:

看起来您没有使用您尝试使用的 api 密钥设置环境变量:

$apiKey = getenv(...);

请在此处查看documentation,因为您似乎正在使用示例代码。

仅用于您可以使用的测试:

$apiKey = 'add here your api key';

替换 getenv 的使用。它应该工作。然后,您可以在配置文件中设置 api 密钥或设置为 env 变量(取决于您的应用程序),以免将其硬编码到脚本中。

【讨论】:

  • 直接在代码中设置api键不是个好主意。它很有可能会被提交回购协议并最终公开。
【解决方案2】:

我遇到了完全相同的问题,删除 getenv() 并硬编码 API 密钥解决了问题。

为什么 SendGrid 认为将其包含在他们网站上的示例代码中是个好主意;没有指出您需要做的不仅仅是使用我不确定的示例代码。

只需一点“注意:您还需要在 X 位置设置环境变量”就足够了。

无论如何,现在一切都已启动并运行...谢谢!

【讨论】:

  • 很高兴它是一个帮助 :-) 很好地让它启动和运行......!
【解决方案3】:

显然,文档并不像应有的那样清晰。

简答:

我也有同样的问题。这是我得到的answer,实际上我能够实现文档中显示的代码。基本上,您需要使用第三方实用程序来解析 .env 文件并使数据可用于您的 PHP 运行时。

从实用程序的文档中,我了解到环境变量通常仅用于开发目的,并且生产代码通常具有硬编码的真实数据(秘密)。整个.env 文件(在本例中为sendgrid.envgetenv('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 的社区经理告诉我的,“自己弄清楚如何存储环境变量安全并使其可用于 PHP 环境"。

【讨论】:

  • Hey Govind 我对您的解决方案非常满意。但是我仍然有一个查询,我仍然无法使用它。我已经硬编码了 api 密钥仍然显示 {"message":"Permission denied, wrong credentials","field":null,"help":null}。
【解决方案4】:

对于那些仍在为此苦苦挣扎的人,您可以从包装密钥中删除 env() 函数。

$apiKey = ''

这在开发中是可以的,但对于生产,请参阅发送网格文档中的此部分:

设置环境变量

使用您的 SENDGRID_API_KEY 更新开发环境,例如:

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

【讨论】:

    【解决方案5】:

    对我来说,在您在 SendGrid 中创建 API 后,他们会显示 API TOKEN,并让您知道出于安全原因,他们只显示一次,并将其保存在安全的地方。此 API TOKEN 与示例代码建议您使用的 API KEY 完全不同。这就是我需要在没有 getenv(..) 的 $apiKey 变量中使用的内容。我希望这可以帮助其他人更快地实现它...

    【讨论】:

      【解决方案6】:
      $sendgrid = new \SendGrid(getenv('SENDGRID_API_KEY'));
      

      在最新的https://github.com/sendgrid/sendgrid-php/releases 代码库中使用以下解决了该问题

      $sendgrid = new \SendGrid('SENDGRID_API_KEY');
      

      即删除getenv()

      【讨论】:

        【解决方案7】:

        如果您在 PHP 中使用 dotenv,则 Sendgrid APIKEY 必须列在文件 .env 中(而不是 sendgrid. env,这是一个不同的文件)。 Dotenv 使用表达式解析那里设置的环境变量的内容:

        $_ENV["SENDGRID_API_KEY"]
        

        如果 .env 包含这样一个变量,定义如下:

        SENDGRID_API_KEY = "SG.XXXXXXXXXXXXXXXXXXX"
        

        它对我有用,无需按照文档要求创建文件 sendgrid.env 或在其上运行 source 命令。

        【讨论】:

          猜你喜欢
          • 2013-08-15
          • 2014-11-04
          • 2020-04-17
          • 2020-09-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-03-02
          • 2021-08-10
          相关资源
          最近更新 更多