Точный такой же подход, как здесь: 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.
Библиотека 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"
}
*/
'@'.$filePath.'/files/'.$fileName.'.csv'
а не данные БД, которые должны иметь.$fileName = $file; $filePath = dirname(__FILE__); 'files['.$file.'.csv]' => '@'.$filePath.'/files/'.$fileName.'.csv'