Sendgrid API загрузки CSV-файла

это вызывает у меня головную боль …
Я пытаюсь загрузить 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.
У кого-нибудь есть предложения?

Спасибо.

0

Решение

В вашем первый образец вы не предоставляете 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);

РЕДАКТИРОВАТЬ: Изменен ответ для исправления ошибки, представленной в предыдущем ответе (отмечено в комментариях).

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]