Sendgrid api加载csv文件

时间:2014-10-01 13:06:21

标签: php json csv sendgrid

这让我很头疼...... 我正在尝试将一个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字符串。 有没有人有任何建议?

谢谢。

1 个答案:

答案 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);

编辑:更改了答案以更正先前答案中引入的错误(在评论中注明)。