【问题标题】:Sendgrid api loading csv fileSendgrid api加载csv文件
【发布时间】:2014-10-01 13:06:20
【问题描述】:

这让我头疼... 我正在尝试将 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 字符串。 有人有什么建议吗?

谢谢。

【问题讨论】:

    标签: php json csv sendgrid


    【解决方案1】:

    在您的第一个示例中,您没有提供 SendGrid 所有必需的数据。您也是作为GET 请求执行此操作的,这可能会导致其自身的问题

    电子邮件添加端点需要在 JSON 字符串中提供名称参数。

    第二个示例 遇到的困难似乎是尝试使用字符串和 然后 json_encode 这些字符串创建 JSON 对象。 但是,最大的问题似乎是您提供了错误类型的数组。

    代码看起来像是在尝试做:

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

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

    【讨论】:

    • 谢谢你的回答,我明白你的意思,你已经解释的很清楚了。我已经尝试过您的代码,但我不断收到“发生数据库错误”。请再试一次'的错误,任何想法为什么会这样?
    • 我不知道它是否仍然相关,但我确定了错误,并更正了答案。
    • @NickQ。您的代码运行良好。过去一天,我试图创建这种格式。我明白了。
    猜你喜欢
    • 2017-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-30
    • 1970-01-01
    • 1970-01-01
    • 2013-12-14
    • 2023-03-06
    相关资源
    最近更新 更多