$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 :(得分:3)
在第一个示例中,您未向SendGrid提供所有必需的数据。你也是以GET
请求来做这件事,这可能会导致自己的问题。
电子邮件添加端点要求在JSON字符串中提供名称参数。
您使用第二个示例遇到的困难似乎是尝试使用字符串创建JSON对象,然后然后 json_encode
这些字符串。 然而,最大的问题似乎是您提供了错误类型的数组。
代码看起来像是在尝试:
data=[{"email" => "nick@sendgrid.com"},{"email" => "jane@example.com"}]
虽然SendGrid需要
data[]={"email" => "nick@sendgrid.com"}&data[]={"email" => "jane@example.com"}
以下代码适用于大多数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);
编辑:更改了答案以更正先前答案中引入的错误(在评论中注明)。