2013-07-17 4 views
7

Очень рад, что задал свой первый вопрос о StackOverflow. Я полагался на это, чтобы многому научить меня на протяжении многих лет!Mandrill ValidationError

Мой вопрос в том, что. Я получаю следующее сообщение об ошибке при попытке отправить почту через API Mandrill в:

{"status":"error","code":-1,"name":"ValidationError","message":"You must specify a key value"} 

код, который следует то, что я использую, чтобы попытаться отправить почту:

<?php 
$to = '[email protected]'; 
$content = '<p>this is the emails html <a href="www.google.co.uk">content</a></p>'; 
$subject = 'this is the subject'; 
$from = '[email protected]'; 

$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

Спасибо за этот вопрос! Я всю ночь искал ответ. – Ankit

ответ

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 разобрать ответ, если это необходимо.

+0

Wow thanks! Отличный совет! – Dan

+0

Спасибо! Это сработало. Но почему?? Я имею в виду, что не так с JSON. Сейчас я запутался. Ответьте, пожалуйста. – Ankit

2

Я не знаю о mandrill, но ваша строка $content имеет двойные кавычки " в ней и ваш разделитель в $postString также является двойным кавычками. Это сломается на любом языке. Вам нужно избегать двойных кавычек в $content, как того требует mandril.

"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 . '", 
+0

Работал отлично! Спасибо! Думайте, что мои глаза, должно быть, размылись и не заметили! – Dan

0

Также вы должны удалить новые строки из HTML кода:

$content = trim(preg_replace('/\s+/', ' ', $content));

9

ответ Банси работал на Dan B, но если кто-то другой, имеющие тот же вопрос, хорошо проверить, если содержание имеет специальное персонажи (акценты, умлауты, седилья, апострофы и т. д.). Если это так, решение может быть utf8 кодировать текст:

$content = utf8_encode('<p>Greetings from Bogotá, Colombia. Att:François</p>'); 
+0

Это сработало для меня - спасибо Хорхе :) – Phil

0

экспериментировали с установкой завитка Дэна, чтобы размещать HTML обогащенные сообщения Mandrill, но на этот раз с помощью HTML в template_content: [] массив из сообщение/send-template.json api.

Что я заметил, что эта установка (исправление по Bansi включено), казалось, работали в опробовать страницу Mandrill в: https://mandrillapp.com/api/docs/messages.JSON.html#method=send-template

Но в моем PHP скрипт, я продолжал получать эту упорную You must specify a key value ошибку.Apparantly благодаря 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); 
Смежные вопросы