art*_*art 6 php nginx sendgrid
这是使用sendgrid发送电子邮件的代码我有正确的api密钥仍然浏览器显示错误为
HTTP/1.1 401未经授权的服务器:nginx日期:星期四,2016年7月14日08:14:32 GMT内容类型:application/json内容长度:88连接:keep-alive {"errors":[{"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();
}
?>
Run Code Online (Sandbox Code Playgroud)
小智 25
看起来您没有使用您尝试使用的api密钥设置环境变量:
$apiKey = getenv(...);
Run Code Online (Sandbox Code Playgroud)
请查看此处的文档,因为看起来您正在使用示例代码.
只是为了测试你可以使用:
$apiKey = 'add here your api key';
Run Code Online (Sandbox Code Playgroud)
取代getenv的用法.它应该工作.然后,您可以在配置文件或env变量(取决于您的应用程序)中设置api密钥,以便不将其硬编码到脚本中.
我遇到了完全相同的问题,删除了getenv()并对API密钥进行了硬编码,从而解决了该问题。
为什么SendGrid决定将其包含在其网站的示例代码中是个好主意;没有指出您需要做更多的事情,而不仅仅是使用不确定的示例代码。
只需一点“注意:您还需要在X位置设置环境变量”就足够了。
无论如何,现在都可以运行了……谢谢!
简短答案:
我有同样的问题。这是我得到的答案,实际上我能够实现文档中显示的代码。基本上,您需要使用第三方实用程序来解析.env文件并使数据可用于PHP运行时。
从实用程序的文档中,我了解到环境变量通常仅用于开发目的,而生产代码通常具有硬编码的真实数据(秘密)。整个.env文件(在这种情况下sendgrid.env,getenv('YOUR_API_KEY')是这样,因此您在共享代码(例如在Github上)时不必共享关键数据,因此将.env文件添加到.gitignore。阅读原始答案以获取完整的背景知识以及如何getenv()工作!
令我惊讶的是,为什么它们不会在readme.md中包含如此重要的数据,但它却一团糟,很多人被卡住了。也许我有空的时候会提出一个问题,但是没有希望。
查阅dotenv,以.readme获得更多的清晰度!:D
长答案:
如果您不共享代码(例如,这是您的个人项目,或者您的客户不在乎共享机密),则无需设置环境变量。getenv从您的代码中删除行,并对您的密钥进行硬编码。
但是,如果您正在进行协作,那么理想情况下,您应该找出一种在共享代码中不包含敏感信息的方法。在Sendgrid的示例中,他们使用PHP的getenv函数来检索敏感数据,但是并没有真正显示如何存储该数据,因此在PHP运行时中可用。除了将sendgrid.env文件添加到.gitignore(提示您将sendgrid.env文件不会上传到git存储库)之类的小提示之外,还有很多有关如何制作sendgrid.env内容的信息(正在存储api_key)因此,每次运行代码时,PHP实际上都无法看到您的密钥。
但是,更深入地搜索他们的git存储库,您会看到一个更详细的示例,其中他们使用PHP实用程序dotenv,其全部目的是抓取.env文件并允许PHP从这些文件中解析信息。
因此,要使getenv('YOUR_API_KEY'))起作用,您将需要使用该dotenv实用程序,或者,正如SendGrid的社区经理告诉我的那样,“ 我自己弄清楚如何安全地存储环境变量并将其提供给PHP环境 ”。