PHP,cURL,SendinblueAPI:如何对文件正文进行编码以导入CSV文件?

时间:2019-12-10 18:14:04

标签: php curl sendinblue

我正在使用sendinBlue API在PHP和cURL中编写脚本。 此脚本必须将联系人从CSV文件发送到网站sendinBlue中的我的日期数据库。

此API有一个文档:https://developers.sendinblue.com/reference#importcontacts-1

例如,我想导入以下2个联系人:

dupont.jean@aol.com;Dupont;Jean;0645342891;2;2019-12-01 19:00:21;false;true;false
dupont2.jean@aol.com;Dupontt;maurice;0645342892;3;2019-12-01 19:00:21;false;true;false

所以我有这个代码:

    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);

    curl_setopt_array($curl, array(
        CURLOPT_URL => "https://api.sendinblue.com/v3/contacts/import",
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_ENCODING => "",
        CURLOPT_MAXREDIRS => 10,
        CURLOPT_TIMEOUT => 30,
        CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
        CURLOPT_CUSTOMREQUEST => "POST",
        CURLOPT_POSTFIELDS => "{\"fileBody\":\"dupont.jean@aol.com;Dupont;Jean;0645342891;2;2019-12-01 19:00:21;false;true;false; 
                                dupont2.jean@aol.com;Dupontt;maurice;0645342892;3;2019-12-01 19:00:21;false;true;false\",
                                \"listIds\":[2],\"emailBlacklist\":false,\"smsBlacklist\":false,
                                \"updateExistingContacts\":true,\"emptyContactsAttributes\":true}",
        CURLOPT_HTTPHEADER => array(
            "accept: application/json",
            "api-key: ****",
            "content-type: application/json"
        ),
    ));

    $response = curl_exec($curl);
    $err = curl_error($curl);

    curl_close($curl);

    if ($err) {
        echo "cURL Error #:" . $err;
    } else {
        echo $response;
    }

但是这不起作用,我遇到了这个错误:{"error":{"status":400,"message":"Input must be a valid JSON object","code":"bad_request"}}

我尝试仅导入一个联系人,仅导入具有以下代码的电子邮件:

    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);

    curl_setopt_array($curl, array(
        CURLOPT_URL => "https://api.sendinblue.com/v3/contacts/import",
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_ENCODING => "",
        CURLOPT_MAXREDIRS => 10,
        CURLOPT_TIMEOUT => 30,
        CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
        CURLOPT_CUSTOMREQUEST => "POST",
        CURLOPT_POSTFIELDS => "{\"fileBody\":\"dupont.jean@aol.com",
                                \"listIds\":[2],\"emailBlacklist\":false,\"smsBlacklist\":false,
                                \"updateExistingContacts\":true,\"emptyContactsAttributes\":true}",
        CURLOPT_HTTPHEADER => array(
            "accept: application/json",
            "api-key: ****",
            "content-type: application/json"
        ),
    ));

    $response = curl_exec($curl);
    $err = curl_error($curl);

    curl_close($curl);

    if ($err) {
        echo "cURL Error #:" . $err;
    } else {
        echo $response;
    }

这个正在工作,联系人在我的数据库中: enter image description here

但是那不是全部,因为所有内容都是空的,我想同时发送多个联系人! (将近1万个联系人!)。

你能帮我吗?

1 个答案:

答案 0 :(得分:0)

参数fileBody应该类似于.csv或.txt,请参见示例here

我在Guzzle上的代码如下:

$fileBody = "EMAIL;FIRSTNAME;LASTNAME" . " \n" .
            "junie3@example.com;Junie;JL" . " \n" .
            "john@example.com;John;JohnL";

$client = new Client([
    'headers' => [
        'api-key' => $apiKey
    ]
]);
$client->post($apiUrl . '/contacts/import', [
    \GuzzleHttp\RequestOptions::JSON => [
        'fileBody' => $fileBody,
        'listIds' => [$listId],
        'updateExistingContacts' => true,
    ]
]);
  • 我写了“ rowtext”。 “ \ n”,因为您需要动态输入行文本。
  • 我写了“ \ n”而不是“ \ n”,因为它不仅仅使用“ \ n”存储最后一列数据(在本例中为LASTNAME)。
  • 如果将双引号更改为单引号,将无法正常工作。