ExpressionEngine CMS
Open, Free, Amazing

Thread

This is an archived forum and the content is probably no longer relevant, but is provided here for posterity.

The active forums are here.

Rackspace Email RESTful API library (BETA)

October 26, 2012 10:27am

Subscribe [1]
  • #1 / Oct 26, 2012 10:27am

    Rob Pomeroy

    16 posts

    Update (3 January 2013): more complete code and examples available here.

    This is an alternative method to one already proposed.  The following (working) proof of concept code is based on Rackspace’s most recent REST API examples.  From this point, it should be trivial to expand the library, if you consider the first four functions in that class.

    /system/application/config/RackspaceAPI.php:

    <?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
    
    $config['user_key']   = 'your user key';
    $config['secret_key']     = 'your secret key';
    $config['user_agent']     = 'name of your app';
    $config['api_version']    = 'v0'; // amend if necessary
    $config['rackspace_host'] = 'api.emailsrvr.com'; // amend if necessary
    
    /* End of file RackspaceAPI.php */
    /* Location: ./system/application/config/RackspaceAPI.php */
  • #2 / Oct 26, 2012 10:32am

    Rob Pomeroy

    16 posts

    /system/application/libraries/RackspaceAPI.php:

    <?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
    /**
     * Uses curl and pecl_http
     */
    class Rackspace_API {
        
      /**
       * Store recent http_message
       * @var object
       */
      protected $_http_message;
      
      /**
        * CI object
        * @var object
        */
      protected $_ci;
    
      /**
       * Rackspace config items
       */
      protected $_user_key;
      protected $_secret_key;
      protected $_user_agent;
      protected $_api_version;
      protected $_rackspace_host;
      
      function __construct() {
        $this->_ci =& get_instance();
        $this->_ci->config->load('RackspaceAPI', TRUE);
        $this->_user_key = $this->_ci->config->item('user_key', 'RackspaceAPI');
        $this->_secret_key = $this->_ci->config->item('secret_key', 'RackspaceAPI');
        $this->_user_agent = $this->_ci->config->item('user_agent', 'RackspaceAPI');
        $this->_api_version = $this->_ci->config->item('api_version', 'RackspaceAPI');
        $this->_rackspace_host = $this->_ci->config->item('rackspace_host', 'RackspaceAPI');
      }
    
    
      /**
       * Get info about a domain
       * @param $domain string
       * @return stdClass Object ( 'error'  => bool,
       *                           'result' => string (error message) | stdClass Object
       */
      public function getDomainInfo($domain) {
        return $this->genericGet('/customers/me/domains/'.$domain);
      }
    
      
      /**
       * Get all domain names
       * @return stdClass Object ( 'error'  => bool,
       *                           'result' => string (error message) | array (domains)
       */
      public function getDomains() {
        $obj = $this->genericGet('/customers/me/domains');
        if(!$obj->error){
          // Reformat into an array of domains
          foreach($obj->result->domains as $domain) {
            $domains[]=$domain->name;
          }
          $obj->result = $domains;
        }
        return $obj;
      }
    
    
      /**
       * Get info about a mailbox ($domain@$id)
       * @param $domain string
       * @param $id string
       * @return stdClass Object ( 'error'  => bool,
       *                           'result' => string (error message) | stdClass Object
       */
      public function getMailboxInfo($domain, $id) {
        return $this->genericGet('/customers/me/domains/'.$domain.'/rs/mailboxes/'.$id);
      }
    
      /**
       * Used by Get functions above - generalised use case
       * @param type $url - see the API; constructed by the calling function
       * @return stdClass Object ( 'error'  => bool,
       *                           'result' => string (error message) | stdClass Object
       */
      private function genericGet($url) {
        $this->get(
            $url,
            'application/json');
        if($this->_http_message->getResponseCode() == 200) {
          // Call worked.  JSON is missing enclosing brackets, apparently needed by json_decode
          $json = '['.$this->_http_message->getBody().']';
          if(is_string($json)) {
            $obj = json_decode($json);
            $result->error = false;
            $result->result = $obj[0];
          } else {
            // JSON failure
            $result->error = true;
            $result->result = 'Failed to parse JSON';
          }
        } else {
          // API call failed
          $result->error = true;
          $result->result = $this->_http_message->getHeader("x-error-message");
        }
        return $result;
      }
    
      // The remainder of this file is mostly lifted from Rackspace's examples: <a href="http://api-wiki.apps.rackspace.com/api-wiki/index.php/PHP_Examples_Rest_API">http://api-wiki.apps.rackspace.com/api-wiki/index.php/PHP_Examples_(Rest_API</a>)
      private function get($url_string, $format) {
          $headers = array("Accept: $format");
          $curl_session = self::construct_session($url_string, $headers);
          $this->_http_message = self::send_request($curl_session);
      }
    
      private function post($url_string, $fields, $format) {
          $headers = array("Accept: $format");
          $curl_session = self::construct_session($url_string, $headers);
          curl_setopt($curl_session, CURLOPT_POST, true);
          curl_setopt($curl_session, CURLOPT_POSTFIELDS, $fields);
          $this->_http_message = self::send_request($curl_session);
      }
    
      private function put($url_string, $fields) {
          $curl_session = self::construct_session($url_string, array());
          curl_setopt($curl_session, CURLOPT_CUSTOMREQUEST, 'PUT');
          curl_setopt($curl_session, CURLOPT_POSTFIELDS, $fields);
          $this->_http_message = self::send_request($curl_session);
      }
      
      private function delete($url_string) {
          $curl_session = self::construct_session($url_string, array());
          curl_setopt($curl_session, CURLOPT_CUSTOMREQUEST, 'DELETE');
          $this->_http_message = self::send_request($curl_session);
      }
    
      private function send_request($curl_session) {
          $response = curl_exec($curl_session);
          curl_close($curl_session);
          return new HttpMessage($response);
      }
    
      private function construct_session($url_string, $existing_headers) {
          $headers = array_merge(
                  self::authorization_headers(), $existing_headers);
          $url = self::construct_uri($url_string);
          $curl_session = curl_init($url);
          curl_setopt($curl_session, CURLOPT_HEADER, true);
          curl_setopt($curl_session, CURLOPT_HTTPHEADER, $headers);
          curl_setopt($curl_session, CURLOPT_RETURNTRANSFER, true);
          return $curl_session;
      }
    
      private function authorization_headers() {
          $time_stamp = date('YmdHis');
          $data_to_sign = $this->_user_key . $this->_user_agent .
              $time_stamp. $this->_secret_key;
          $signature = base64_encode(sha1($data_to_sign, true));
          $headers = array();
          $headers[] = "User-Agent: " . $this->_user_agent;
          $headers[] = 'X-Api-Signature: ' .
              $this->_user_key . ":$time_stamp:$signature";
          return $headers;
      }
    
      private function construct_uri($url_string) {
          $url = 'http://' .  $this->_rackspace_host . '/' . $this->_api_version . $url_string;
          return $url;
      }
    }
    
    ?>
  • #3 / Oct 26, 2012 10:33am

    Rob Pomeroy

    16 posts

    Example usage:

    function testRackspace() {
        $this->load->library('Rackspace_API');
        $client = new Rackspace_API();
        $obj = $client->getMailboxInfo('somedomain.com', 'test.user');
        if($obj->error) {
          echo 'Error: '.$obj->result;
        } else {
          var_dump($obj);
        }
      }
.(JavaScript must be enabled to view this email address)

ExpressionEngine News!

#eecms, #events, #releases