curlopt_postfields $ params 'to' как массив?

0

Точный такой же подход, как здесь: SendGrid с динамическими параметрами PHP, но то, что я пытаюсь сделать, - это установить несколько адресов электронной почты "to" и "cc". Могут ли они быть установлены как массив с моей текущей реализацией?

$params = array(
    'api_user'  => $user,
    'api_key'   => $pass,
    'to' => array('[email protected]','[email protected]'),
    'cc' => array('[email protected]','[email protected]'),
    'subject'   => 'test email',
    'html'      => '<p>This is a test email</p>',
    'text'      => 'done',
    'from'      => '[email protected]'
  );

curl_setopt ($session, CURLOPT_POSTFIELDS, $params;

Он хорошо работает и отправляет электронное письмо, когда я устанавливаю только одно электронное письмо в "to" и "cc" без массива, но когда я добавляю его как массив, он не будет работать.

Я также пробовал это, но он не запускается.

curl_setopt ($session, CURLOPT_POSTFIELDS, http_build_query($params);

К сожалению, ничто в документации не объясняет, как передать несколько адресов в полях /cc - https://sendgrid.com/docs/Code_Examples/php.html.

Теги:
arrays
curl

1 ответ

1
Лучший ответ

Библиотека PHP cURL знает, как обращаться с одномерными массивами, поэтому вам нужно построить строку данных вручную с помощью http_build_query() а затем установить для CURLOPT_POSTFIELDS.

Если вам нужен больший контроль над форматированием строки данных [например: загрузка файлов в сложном сообщении], то один из ниже будет работать.

$params = array(
    'api_user'  => 'foo',
    'api_key'   => 'bar',
    'to' => array('[email protected]','[email protected]'),
    'cc' => array('[email protected]','[email protected]'),
    'subject'   => 'test email',
    'html'      => '<p>This is a test email</p>',
    'text'      => 'done',
    'from'      => '[email protected]',
    'file'      => '@foobar.txt'
);

// returns a query string
function encode1($params) {
        $data_arr = array();
        foreach( $params as $key => $value ){
                if( ! is_array($value) ) {
                        if( strpos($value, '@') === 0 ) { $encvalue = $value; }
                        else { $encvalue = urlencode($value); }
                        $data_arr[] = sprintf('%s=%s', urlencode($key), $encvalue);
                } else {
                        foreach( $value as $item ) {
                                if( strpos($item, '@') === 0 ) { $encvalue = $item; }
                                else { $encvalue = urlencode($item); }
                                $data_arr[] = sprintf('%s=%s', urlencode($key.'[]'), $encvalue);
                        }
                }
        }
        return implode('&', $data_arr);
}
var_dump(encode1($params));
/* result:
string(254) "api_user=foo&api_key=bar&to%5B%5D=user1%40example.com&to%5B%5D=user2%40example.com&cc%5B%5D=user3%40example.com&cc%5B%5D=user4%40example.com&subject=test+email&html=%3Cp%3EThis+is+a+test+email%3C%2Fp%3E&text=done&from=admin%40example.com&[email protected]"
*/

// returns an array
function encode2($params) {
        $out = array();
        foreach( $params as $key => $value ) {
                if( ! is_array($value) ) {
                        $out[$key] = $value;
                } else {
                        for( $i=0; $i<count($value); $i++ ) {
                                $index = sprintf('%s[%d]', $key, $i);
                                $out[$index] = $value[$i];
                        }
                }
        }
        return $out;
}
var_dump(encode2($params));
/* result:
array(11) {
  ["api_user"]=>string(3) "foo"
  ["api_key"]=> string(3) "bar"
  ["to[0]"]=>   string(17) "[email protected]"
  ["to[1]"]=>   string(17) "[email protected]"
  ["cc[0]"]=>   string(17) "[email protected]"
  ["cc[1]"]=>   string(17) "[email protected]"
  ["subject"]=> string(10) "test email"
  ["html"]=>    string(27) "<p>This is a test email</p>"
  ["text"]=>    string(4) "done"
  ["from"]=>    string(17) "[email protected]"
  ["file"]=>    string(11) "@foobar.txt"
}
*/
  • 0
    благодарю вас! Работает отлично! За исключением того, что теперь данные файла (csv) содержат в себе данные '@'.$filePath.'/files/'.$fileName.'.csv' а не данные БД, которые должны иметь.
  • 0
    как я могу указать, чтобы не кодировать файл? $fileName = $file; $filePath = dirname(__FILE__); 'files['.$file.'.csv]' => '@'.$filePath.'/files/'.$fileName.'.csv'
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню