使用sendgrid发送邮件时出错的凭据

时间:2016-07-14 08:18:15

标签: php nginx sendgrid

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

HTTP / 1.1 401未经授权的服务器:nginx日期:星期四,2016年7月14日08:14:32 GMT内容类型:application / json内容长度:88连接:keep-alive {"错误& #34;:[{" message":"权限被拒绝,凭据错误""字段":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();
}
?>

6 个答案:

答案 0 :(得分:24)

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

$apiKey = getenv(...);

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

只需进行测试即可:

$apiKey = 'add here your api key';

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

答案 1 :(得分:4)

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

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

一点点&#34;注意:你还需要在X位置设置环境变量&#34;,就足够了。

无论如何,现在全部开始运行......谢谢!

答案 2 :(得分:4)

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

简答:

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

从实用程序的文档中,我了解到环境变量通常仅用于开发目的,而生产代码通常具有硬编码的实际数据(秘密)。整个.env文件(在这种情况下为sendgrid.envgetenv('YOUR_API_KEY')是这样的,当共享代码(例如在Github上)时,您不需要共享关键数据,因此添加了.env文件.gitignore。阅读原始答案,了解完整的背景故事以及如何让getenv()正常工作!

让我想起为什么他们不会在readme.md中包含这些关键数据,但是它很乱,而且很多人都被困住了。也许我会在有空的时候提交问题,但没有承诺。

快速查看dotenv .readme getenv! :D

长答案:

如果您不共享代码(即这是您的个人项目或您的客户并不关心共享密码),则您不需要设置环境变量。从代码中删除PHP行并对密钥进行硬编码。

但是,如果您正在进行协作,理想情况下,您应该想办法在您分享的代码中不包含敏感信息。在Sendgrid的示例中,他们使用getenv的{​​{1}}功能来检索敏感数据,但并未真正展示如何存储这些数据,以便您可以在PHP运行时。除了迷你提示,例如将sendgrid.env文件添加到.gitignore(告诉您sendgrid.env文件不能上传到git存储库),有很多关于如何制作的信息sendgrid.env的内容(存储你的api_key可用于PHP运行时。因此,每次运行代码时,PHP实际上都无法看到你的密钥。

然而,深入搜索他们的git存储库,你会看到一个更详细的例子,他们使用PHP实用程序 dotenv ,其目的是抓取.env文件并允许PHP解析这些文件中的信息。

因此,要让getenv('YOUR_API_KEY'))工作,您需要使用dotenv实用程序,或者正如SendGrid的社区经理告诉我的那样,&#34; 自己弄清楚如何安全地存储环境变量并使它们可用于PHP环境&#34;。

答案 3 :(得分:3)

对于那些仍在努力解决这个问题的人,你可以删除env()函数来包装你的密钥。

$apiKey = ''

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

设置环境变量

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

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

答案 4 :(得分:0)

对我来说,在SendGrid中创建API之后,它们会显示API TOKEN,并告知您出于安全原因它们只显示一次并将其保存到安全的地方。此API TOKEN与示例代码建议您使用的API KEY完全不同。这是我需要在没有getenv(..)的$ apiKey变量中使用的。我希望能帮助别人更快地达到目标......

答案 5 :(得分:0)

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

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

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

即删除 getenv()