这是使用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();
}
?>
答案 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.env
和getenv('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()