Mandrill ValidationError

Molto entusiasta di porre la mia prima domanda su StackOverflow. Ci ho fatto affidamento per insegnarmi parecchio nel corso degli anni!

La mia domanda è questa. Ricevo il seguente errore quando provo a submit un messaggio tramite l'API di Mandrill:

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

Il codice che segue è quello che sto usando per provare a submit la posta:

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

Cosa potrebbe causare l'errore di validation nel messaggio. Sto fornendo la mia chiave API, ed è valida!

Spero che qualcuno sarà in grado di aiutare, e grazie per essere generalmente fantastico qui!

Grazie!

Potresti anche voler semplicemente usare gli arrays e lasciare che PHP gestisca la codifica JSON per te. Questo particolare errore è comune se il JSON non è valido per qualche motivo. Ad esempio, puoi impostare i tuoi parametri in questo modo:

 $params = arrays( "key" => "keyhere", "message" => arrays( "html" => $content, "text" => $content_text, "to" => arrays( arrays("name" => $to, "email" => $to) ), "from_email" => $from, "from_name" => $from, "subject" => $subject, "track_opens" => true, "track_clicks" => true ), "async" => false ); $postString = json_encode($params); 

È anche ansible utilizzare json_decode per analizzare la risposta, se necessario.

La risposta di Bansi ha funzionato per Dan B, ma se qualcun altro ha lo stesso problema è bene controllare se il contenuto ha caratteri speciali (accenti, dieresi, cedillas, apostrofi, ecc.). In questo caso, la soluzione potrebbe essere utf8 codificare il text:

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

Non so di mandrill, ma la string $content ha le doppie virgolette " e il delimitatore nella $postString è anche il doppio dei virgolette, che si interromperà in qualsiasi lingua. Devi sfuggire alle doppie virgolette nel $content richiesto da mandril.

"html": "' . $content . '", si tradurrà in

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

Provare

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

Invece di

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

Inoltre è necessario rimuovere le nuove linee dal codice html:

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

Ho sperimentato con il setup di curl di Dan per submit messaggi arricchiti in html a Mandrill, ma stavolta usando html nel template_content: [] arrays del messaggio / send-template.json api.

Quello che ho notato è che questa configuration (inclusa la correzione di Bansi) sembrava funzionare nella pagina di prova di Mandrill: https://mandrillapp.com/api/docs/messages.JSON.html#method=send-template

Ma nel mio script php, continuavo a ricevere questo testardo. You must specify a key value errore del You must specify a key value . A quanto pare grazie a questo thread , ho risolto il problema aggiungendo utf8 come charset alle intestazioni della richiesta:

 $ch = curl_init(); $headers = arrays("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);