2013-07-17 9 views
7

Sehr aufgeregt, meine erste Frage zu StackOverflow zu stellen. Ich habe mich darauf verlassen, um mir selbst im Laufe der Jahre viel beizubringen!Mandrill ValidationError

Meine Frage ist dies. Ich erhalte die folgende Fehlermeldung beim Versuch, eine E-Mail über Mandrills API zu senden:

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

Der Code, der folgt, ist, was ich zu versuchen, bin mit der E-Mail senden:

<?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; 

?> 

Was verursachen könnte der Validierungsfehler in der Nachricht Ich stelle meinen API-Schlüssel zur Verfügung, UND es ist gültig!

Hoffe, dass jemand in der Lage sein wird zu helfen, und danke, dass Sie hier im Allgemeinen FANTASTISCH sind!

Danke!

+0

Vielen Dank für diese Frage! Ich verbrachte meine ganze Nacht damit, nach der Antwort zu suchen. – Ankit

Antwort

11

Sie können auch Arrays nur verwenden, und lassen Sie PHP für Sie die JSON-Codierung behandeln . Dieser spezielle Fehler tritt häufig auf, wenn der JSON aus irgendeinem Grund ungültig ist. So zum Beispiel, könnten Sie Ihre Parameter wie folgt festgelegt:

$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); 

Sie auch json_decode verwenden können, um die Antwort zu analysieren, wenn nötig.

+0

Wow danke! Toller Tipp hier! – Dan

+0

Danke! Es funktionierte. Aber warum?? Ich meine, was nur mit JSON los war. Ich bin gerade verwirrt. Bitte antworte. – Ankit

2

Ich weiß nicht über Mandrill, aber Ihre $content Zeichenfolge hat doppelte Anführungszeichen " darin und Ihr Trennzeichen in der $postString ist auch doppelte Anführungszeichen. Dies wird in jeder Sprache brechen. Sie müssen die doppelten Anführungszeichen in der $content wie von mandril erforderlich zu entkommen.

"html": "' . $content . '", wird übersetzen zu

"html": "<p>this is the emails html <a href="www.google.co.uk">content</a></p>", 
              ^   ^

Versuchen

"html": "' . str_replace('"','\\"',$content) . '", 
"text": "' . str_replace('"','\\"',$content_text) . '", 

Statt

"html": "' . $content . '", 
"text": "' . $content_text . '", 
+0

Hat super funktioniert! Vielen Dank! Denke, meine Augen müssen verschwommen und nicht bemerkt worden sein! – Dan

0

Auch müssen Sie neue Linien von HTML-Code entfernen sein:

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

9

Bansi Antwort für Dan B gearbeitet, aber wenn jemand anderes das gleiche Problem ist, die ist gut zu prüfen, ob der Inhalt besondere hat Zeichen (Akzente, Umlaute, Cedillas, Apostrophe usw.). Wenn das der Fall ist könnte die Lösung für UTF-8 sein, den Text zu kodieren:

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

Das hat für mich funktioniert - danke Jorge :) – Phil

0

mit Dans curl Setup experimentiert Wurde html angereichert Nachrichten Mandrill zu schreiben, aber dieses Mal mit HTML in der template_content: [] Array von der Nachricht/send-template.json api.

Was mir auffiel war, dass dieses Setup (fix von Bansi enthalten) schien in Mandrills ausprobieren Seite zu arbeiten: https://mandrillapp.com/api/docs/messages.JSON.html#method=send-template

Aber in meinem PHP-Skript, hielt ich diese hartnäckigen You must specify a key value Fehler zu erhalten.Apparantly dank this thread, löste ich das Problem, indem UTF-8 als Zeichensatz auf die Request-Header hinzugefügt:

$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);