非常高兴能在StackOverflow上提出我的第一个问题。这些年来,我一直在依靠它来教自己很多!
我的问题是这个。尝试通过Mandrill的API发送邮件时出现以下错误:
{"status":"error","code":-1,"name":"ValidationError","message":"You must specify a key value"}
以下代码是我用来尝试发送邮件的代码:
<?php
$to = 'their@email.com';
$content = '<p>this is the emails html <a href="www.google.co.uk">content</a></p>';
$subject = 'this is the subject';
$from = 'my@email.com';
$uri = 'https://mandrillapp.com/api/1.0/messages/send.json';
$content_text = strip_tags($content);
$postString = '{
"key": "RR_3yTMxxxxxxxx_Pa7gQ",
"message": {
"html": "' . $content . '",
"text": "' . $content_text . '",
"subject": "' . $subject . '",
"from_email": "' . $from . '",
"from_name": "' . $from . '",
"to": [
{
"email": "' . $to . '",
"name": "' . $to . '"
}
],
"track_opens": true,
"track_clicks": true,
"auto_text": true,
"url_strip_qs": true,
"preserve_recipients": true
},
"async": false
}';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $uri);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true );
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true );
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postString);
$result = curl_exec($ch);
echo $result;
?>
可能导致邮件中的验证错误的原因。我提供我的API密钥,它是有效的!
希望有人能够提供帮助,并且感谢你们在这里一般都很棒!
谢谢!
答案 0 :(得分:11)
您可能还想使用数组,让PHP为您处理JSON编码。如果JSON由于某种原因无效,则此特定错误很常见。因此,例如,您可以设置如下参数:
$params = array(
"key" => "keyhere",
"message" => array(
"html" => $content,
"text" => $content_text,
"to" => array(
array("name" => $to, "email" => $to)
),
"from_email" => $from,
"from_name" => $from,
"subject" => $subject,
"track_opens" => true,
"track_clicks" => true
),
"async" => false
);
$postString = json_encode($params);
如果需要,您还可以使用json_decode
来解析响应。
答案 1 :(得分:11)
Bansi的答案适用于Dan B,但如果其他人有同样的问题,那么检查内容是否有特殊字符(重音符号,变音符号,cedillas,撇号等)是很好的。如果是这种情况,解决方案可能是对文本进行utf8编码:
$content = utf8_encode('<p>Greetings from Bogotá, Colombia. Att:François</p>');
答案 2 :(得分:2)
我不知道mandrill,但您的$content
字符串中有双引号"
,而$postString
中的分隔符也是双引号。这将以任何语言打破。你需要按照mandril的要求逃避$content
中的双引号。
"html": "' . $content . '",
将转换为
"html": "<p>this is the emails html <a href="www.google.co.uk">content</a></p>",
^ ^
尝试
"html": "' . str_replace('"','\\"',$content) . '",
"text": "' . str_replace('"','\\"',$content_text) . '",
而不是
"html": "' . $content . '",
"text": "' . $content_text . '",
答案 3 :(得分:1)
PHP Mandrill API错误:“ Mandrill_ValidationError-您必须指定键值”
此错误也可能表明json_encode()无法编码并返回空字符串。当空字符串通过curl提交给Mandrill时,它无法让您知道它完全是空的POST内容,而是发出有用的消息“您必须指定键值”。
显然,可以通过在多个级别上进行更好的检测来缓解此问题:
目前还没有完成任何操作,因此这不必要地难以调试。
在我的情况下,最简单的解决方法是在包含图像内容之前有效地更改代码以运行base64_encode():
'content' => base64_encode(file_get_content("image.jpg"),
如上所述,更好的解决方法是升级Mandrill.php API文件,以检测编码失败并抛出错误。
答案 4 :(得分:0)
您还需要从html代码中删除新行:
$content = trim(preg_replace('/\s+/', ' ', $content));
答案 5 :(得分:0)
一直在试验Dan的curl设置,以便向Mandrill发布html丰富的消息,但这次在message / send-template.json api的template_content:[]数组中使用了html。
我注意到这个设置(包括Bansi修复)似乎在Mandrill的试用页面中有效:https://mandrillapp.com/api/docs/messages.JSON.html#method=send-template
但是在我的php脚本中,我一直收到这个顽固的You must specify a key value
错误。非常感谢this thread,我通过将utf8添加为请求标头的字符集来解决了这个问题:
$ch = curl_init();
$headers = array("Content-type: application/json;charset=\"utf-8\"");
curl_setopt($ch, CURLOPT_URL, $uri);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true );
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true );
curl_setopt($ch, CURLOPT_HTTPHEADER,$headers);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postString);
$result = curl_exec($ch);
答案 6 :(得分:0)
在Laravel 7.x中,Mandrill不再是核心部分。如果像我一样,您使用的是therobfonz/laravel-mandrill-driver
,那么如果您无法在.env文件中设置Mandril密钥,也可能会看到类似的错误。
我有这个
MANDRILL_SECRET=h3xxxx
但是我需要这个MANDRILL_KEY=h3xxxx
。
要验证您正在调用哪个键,请在config\services.php
// Mandrill is no longer core laravel...
'mandrill' => [
'secret' => env('MANDRILL_KEY'),
],
不调用密钥的另一个症状是,失败的呼叫将不会显示在您的Mandrill api日志列表中(因为缺少密钥意味着Mandrill.com不知道将失败的尝试发布到何处)。