【问题标题】:curlopt_postfields $params 'to' as an array?curlopt_postfields $params 'to' 作为数组?
【发布时间】:2015-02-03 02:24:41
【问题描述】:

与此处完全相同的方法:SendGrid with dynamic PHP params 但我要做的是设置多个“收件人”和“抄送”电子邮件地址。可以将这些设置为我当前实现的数组吗?

$params = array(
    'api_user'  => $user,
    'api_key'   => $pass,
    'to' => array('user1@example.com','user2@example.com'),
    'cc' => array('user3@example.com','user4@example.com'),
    'subject'   => 'test email',
    'html'      => '<p>This is a test email</p>',
    'text'      => 'done',
    'from'      => 'admin@example.com'
  );

curl_setopt ($session, CURLOPT_POSTFIELDS, $params;

当我只在 'to' 和 'cc' 中设置一个没有数组的电子邮件时,它运行良好并发送电子邮件,但是当我添加为数组时它不会运行。

我也试过了,但没有运行。

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

不幸的是,文档中没有任何内容解释如何在 to/cc 字段中传递多个地址 - https://sendgrid.com/docs/Code_Examples/php.html

【问题讨论】:

    标签: php arrays curl


    【解决方案1】:

    PHP 的 cURL 库只知道如何处理一维数组,因此您需要使用 http_build_query() 手动构建数据字符串,然后将其设置为 CURLOPT_POSTFIELDS

    如果您需要更好地控制数据字符串的格式[例如:在复杂的帖子中上传文件],以下方法之一应该可以工作。

    $params = array(
        'api_user'  => 'foo',
        'api_key'   => 'bar',
        'to' => array('user1@example.com','user2@example.com'),
        'cc' => array('user3@example.com','user4@example.com'),
        'subject'   => 'test email',
        'html'      => '<p>This is a test email</p>',
        'text'      => 'done',
        'from'      => 'admin@example.com',
        '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&file=@foobar.txt"
    */
    
    // 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) "user1@example.com"
      ["to[1]"]=>   string(17) "user2@example.com"
      ["cc[0]"]=>   string(17) "user3@example.com"
      ["cc[1]"]=>   string(17) "user4@example.com"
      ["subject"]=> string(10) "test email"
      ["html"]=>    string(27) "<p>This is a test email</p>"
      ["text"]=>    string(4) "done"
      ["from"]=>    string(17) "admin@example.com"
      ["file"]=>    string(11) "@foobar.txt"
    }
    */
    

    【讨论】:

    • 谢谢!效果很好!除了现在文件数据(csv)包含'@'.$filePath.'/files/'.$fileName.'.csv'作为内部数据而不是它应该具有的数据库数据。
    • 如何指定不对文件进行编码? $fileName = $file; $filePath = dirname(__FILE__); 'files['.$file.'.csv]' =&gt; '@'.$filePath.'/files/'.$fileName.'.csv'
    • 好吧,那么你不能使用http_build_query(),你需要修改上面的代码来跳过urlencode()以获取以@开头的数据值。但是,如果 CURLOPT_POSTFIELDS 参数是字符串而不是数组,我不知道 cURL 扩展是否会交换文件内容。我已经修改了原始答案中的函数,并添加了第二个简单地展平输入数组的函数。
    • 是的,如果 POSTFIELDS 是一个字符串,它就不会传入。感谢您提供更新的答案,我会在一小时内试一试,并告诉您进展如何。干杯
    【解决方案2】:

    您必须将电子邮件作为数组值传递。试试下面的 sn-p:

    $params = array(
        'api_user'  => $user,
        'api_key'   => $pass,
        'to[0]' => 'user1@example.com',
        'to[1]' => 'user2@example.com',
        'cc[0]' => 'user3@example.com',
        'cc[1]' => 'user4@example.com',
        'subject'   => 'test email',
        'html'      => '<p>This is a test email</p>',
        'text'      => 'done',
        'from'      => 'admin@example.com'
    );
    
    curl_setopt ($session, CURLOPT_POSTFIELDS, $params;
    

    它现在应该可以工作了! :)

    【讨论】:

      猜你喜欢
      • 2014-03-09
      • 2020-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-03
      • 2017-12-08
      • 1970-01-01
      相关资源
      最近更新 更多