это вызывает у меня головную боль …
Я пытаюсь загрузить CSV-файл в список на sendgrid, и он не работает, я потратил часы на поиск и пробу разных вещей, ниже приведены мои версии кода с разной степенью успеха:
$file_handle = fopen("examplecsv.csv", "r");
$listname = "examplelist";
$url = 'https://sendgrid.com/api/newsletter/lists/email/add.json?api_user='.$username.'&api_key='.$password;
$str= '&list=' . $listname;
$array = array();
while (!feof($file_handle) ) {
$line_of_text = fgetcsv($file_handle, 1024);
$str.= '&data[]={"email":"'.$line_of_text[0] . '"}';
}
return file_get_contents($url.$str);
fclose($file_handle);
extract($_POST);
или же
$file_handle = fopen("examplecsv.csv", "r");
$array = array();
while (!feof($file_handle) ) {
$line_of_text = fgetcsv($file_handle, 1024);
$array[] = 'email":"'.$line_of_text[0];
}
$emails = json_encode($array);
$emails = str_replace("\\", '', $emails);
fclose($file_handle);
extract($_POST);
//set POST variables
$url = 'https://api.sendgrid.com/api/newsletter/lists/email/add.xml';
$fields = array(
'api_user' => 'username',
'api_key' => 'password',
'list' => 'example list',
'data' => '{$emails}'
);
//url-ify the data for the POST
foreach($fields as $key=>$value) { $fields_string .= $key.'='.$value.'&'; }
rtrim($fields_string, '&');
//open connection
$ch = curl_init();
//set the url, number of POST vars, POST data
curl_setopt($ch,CURLOPT_URL, $url);
curl_setopt($ch,CURLOPT_POST, count($fields));
curl_setopt($ch,CURLOPT_POSTFIELDS, $fields_string);
//execute post
$result = curl_exec($ch);
//close connection
curl_close($ch);
Вторая версия вызывает недопустимую строку json.
У кого-нибудь есть предложения?
Спасибо.
В вашем первый образец вы не предоставляете SendGrid все необходимые данные. Вы также делаете это как GET
запрос, что может вызвать свои проблемы.
Конечная точка добавления электронной почты требует параметр имени должен быть указан в строке JSON.
Трудность, с которой вы сталкиваетесь второй образец кажется, от попытки создания объектов JSON, используя строки и затем json_encode
эти строки. Однако самая большая проблема заключается в том, что вы предоставляете неверный тип массива.
Код выглядит так, как будто он пытается это сделать:
data=[{"email" => "[email protected]"},{"email" => "[email protected]"}]
Пока SendGrid ожидает
data[]={"email" => "[email protected]"}&data[]={"email" => "[email protected]"}
Следующий код должен работать для большинства версий PHP. Он устраняет обе ошибки и отправляет SendGrid ожидаемый формат.
$emails = array();
$file_handle = fopen("examplecsv.csv", "r");
// Iterate through the csv taking out the emails
while (!feof($file_handle) ) {
$line_of_text = fgetcsv($file_handle, 1024);
// You can set "name" to be anything, however null works just as well.
$field = array( "email" => $line_of_text[0], "name" => null);
$emails[] = json_encode($field);
}
fclose($file_handle);
print_r($emails);
//set POST variables
$url = 'https://api.sendgrid.com/api/newsletter/lists/email/add.xml';
$fields = array(
'api_user' => 'username',
'api_key' => 'password',
'list' => 'example list',
'data' => $emails
);
$query = http_build_query($fields);
// Change data parameters to what SendGrid wants
$query = preg_replace("/data%5B\d+%5D/","data[]", $query);
$ch = curl_init();
curl_setopt($ch,CURLOPT_URL, $url);
curl_setopt($ch,CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch,CURLOPT_POST, 1);
curl_setopt($ch,CURLOPT_POSTFIELDS, $query);
$result = curl_exec($ch);
curl_close($ch);
print_r($result);
РЕДАКТИРОВАТЬ: Изменен ответ для исправления ошибки, представленной в предыдущем ответе (отмечено в комментариях).
Других решений пока нет …