| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517 | <?php/** * @file * Wrapper class around the Mandrill API. *//** * Class MandrillException. */class MandrillException extends Exception {}/** * Class DrupalMandrill. */class DrupalMandrill {  const API_VERSION = '1.0';  const END_POINT = 'https://mandrillapp.com/api/';  protected $api;  /**   * Default to a 300 second timeout on server calls   */  protected $timeout = 300;  /**   * Constructor to set internal values.   *   * @param string $api_key   *   Mandrill API key.   * @param int $timeout   *   Server timeout.   *   * @throws MandrillException.   */  public function __construct($api_key, $timeout = 300) {    if (empty($api_key)) {      throw new MandrillException('Invalid API key');    }    try {      $response = $this->request('users/ping', array('key' => $api_key));      if ($response != 'PONG!') {        throw new MandrillException('Invalid API key: ' . $response);      }      $this->api = $api_key;      $this->timeout = $timeout;    }    catch (Exception $e) {      throw new MandrillException($e->getMessage());    }  }  /**   * Make a request to Mandrill's API.   *   * Every API call uses this function to actually make the request to   * Mandrill's servers.   *   * @link https://mandrillapp.com/api/docs/   *   * @param string $method   *   API method name   * @param array $args   *   query arguments   * @param string $http   *   GET or POST request type   * @param string $output   *   API response format (json,php,xml,yaml). json and xml are decoded into   *   arrays automatically.   *   * @return array   *   Array on success.   *   * @throws MandrillException.   */  protected function request($method, $args = array(), $http = 'POST', $output = 'json') {    if (!isset($args['key'])) {      $args['key'] = $this->api;    }    $api_version = self::API_VERSION;    $dot_output = ('json' == $output) ? '' : ".{$output}";    $url = self::END_POINT . "{$api_version}/{$method}{$dot_output}";    $params = drupal_json_encode($args);    switch ($http) {      case 'GET':        $url .= '?' . $params;        $response = drupal_http_request($url, array(          'method' => 'GET',          'timeout' => $this->timeout,        ));        break;      case 'POST':        $response = drupal_http_request($url, array(          'method' => 'POST',          'data' => $params,          'timeout' => $this->timeout,        ));        break;      default:        throw new MandrillException('Unknown request type');    }    $response_code = $response->code;    if (0 == $response_code) {      return $response->error;    }    $body = $response->data;    switch ($output) {      case 'json':        $body = json_decode($body, TRUE);        break;      case 'php':        $body = unserialize($body);        break;    }    if (200 == $response_code) {      return $body;    }    else {      $message = isset($body['message']) ? $body['message'] : $body;      if (is_array($message)) {        $message = "Unspecified Error";      }      throw new MandrillException($message, $response_code);    }  }  /**   * @link https://mandrillapp.com/api/docs/users.html#method=ping   *   * @return array|MandrillException   */  public function users_ping() {    return $this->request('users/ping');  }  /**   * @link https://mandrillapp.com/api/docs/users.html#method=info   *   * @return array|MandrillException   */  public function users_info() {    return $this->request('users/info');  }  /**   * @link https://mandrillapp.com/api/docs/users.html#method=senders   *   * @return array|MandrillException   */  public function users_senders() {    return $this->request('users/senders');  }  /**   * @link https://mandrillapp.com/api/docs/senders.html#method=domains   *   * @return array|MandrillException   */  public function senders_domains() {    return $this->request('senders/domains');  }  /**   * @link https://mandrillapp.com/api/docs/senders.html#method=list   *   * @return array|MandrillException   */  public function senders_list() {    return $this->request('senders/list');  }  /**   * @link https://mandrillapp.com/api/docs/senders.html#method=info   *   * @return array|MandrillException   */  public function senders_info($email) {    return $this->request('senders/info', array('address' => $email));  }  /**   * @link https://mandrillapp.com/api/docs/senders.html#method=time-series   *   * @return array|MandrillException   */  public function senders_time_series($email) {    return $this->request('senders/time-series', array('address' => $email));  }    /**   * @link https://mandrillapp.com/api/docs/subaccounts.html#method=method-list   *   * @return array|MandrillException   */  public function subaccounts() {    return $this->request('subaccounts/list');  }  /**   * @link https://mandrillapp.com/api/docs/tags.html#method=list   *   * @return array|MandrillException   */  public function tags_list() {    return $this->request('tags/list');  }  /**   * @link https://mandrillapp.com/api/docs/tags.html#method=info   *   * @return array|MandrillException   */  public function tags_info($tag) {    return $this->request('tags/info', array('tag' => $tag));  }  /**   * @link https://mandrillapp.com/api/docs/tags.html#method=time-series   *   * @return array|MandrillException   */  public function tags_time_series($tag) {    return $this->request('tags/time-series', array('tag' => $tag));  }  /**   * @link https://mandrillapp.com/api/docs/tags.html#method=all-time-series   *   * @return array|MandrillException   */  public function tags_all_time_series() {    return $this->request('tags/all-time-series');  }  /**   * @link https://mandrillapp.com/api/docs/templates.html#method=add   *   * @return array|MandrillException   */  public function templates_add($name, $code) {    return $this->request('templates/add', array(      'name' => $name,      'code' => $code,    ));  }  /**   * @link https://mandrillapp.com/api/docs/templates.html#method=update   *   * @return array|MandrillException   */  public function templates_update($name, $code) {    return $this->request('templates/update', array(      'name' => $name,      'code' => $code,    ));  }  /**   * @link https://mandrillapp.com/api/docs/templates.html#method=delete   *   * @return array|MandrillException   */  public function templates_delete($name) {    return $this->request('templates/delete', array('name' => $name));  }  /**   * @link https://mandrillapp.com/api/docs/templates.html#method=info   *   * @return array|MandrillException   */  public function templates_info($name) {    return $this->request('templates/info', array('name' => $name));  }  /**   * @link https://mandrillapp.com/api/docs/templates.html#method=list   *   * @return array|MandrillException   */  public function templates_list() {    return $this->request('templates/list');  }  /**   * @link https://mandrillapp.com/api/docs/templates.html#method=time-series   *   * @return array|MandrillException   */  public function templates_time_series($name) {    return $this->request('templates/time-series', array('name' => $name));  }  /**   * @link https://mandrillapp.com/api/docs/urls.html#method=list   *   * @return array|MandrillException   */  public function urls_list() {    return $this->request('urls/list');  }  /**   * @link https://mandrillapp.com/api/docs/urls.html#method=time-series   *   * @return array|MandrillException   */  public function urls_time_series($url) {    return $this->request('urls/time-series', array('url' => $url));  }  /**   * @link https://mandrillapp.com/api/docs/urls.html#method=search   *   * @return array|MandrillException   */  public function urls_search($q) {    return $this->request('urls/search', array('q' => $q));  }  /**   * @link https://mandrillapp.com/api/docs/webhooks.html#method=add   *   * @return array|MandrillException   */  public function webhooks_add($url, $events) {    return $this->request('webhooks/add', array(      'url' => $url,      'events' => $events,    ));  }  /**   * @link https://mandrillapp.com/api/docs/webhooks.html#method=update   *   * @return array|MandrillException   */  public function webhooks_update($id, $url, $events) {    return $this->request('webhooks/update', array(      'id' => $id,      'url' => $url,      'events' => $events,    ));  }  /**   * @link https://mandrillapp.com/api/docs/webhooks.html#method=delete   *   * @return array|MandrillException   */  public function webhooks_delete($id) {    return $this->request('webhooks/delete', array('id' => $id));  }  /**   * @link https://mandrillapp.com/api/docs/webhooks.html#method=info   *   * @return array|MandrillException   */  public function webhooks_info($id) {    return $this->request('webhooks/info', array('id' => $id));  }  /**   * @link https://mandrillapp.com/api/docs/webhooks.html#method=list   *   * @return array|MandrillException   */  public function webhooks_list() {    return $this->request('webhooks/list');  }  /**   * @link https://mandrillapp.com/api/docs/messages.html#method=search   *   * @return array|MandrillException   */  public function messages_search($query, $date_from = '', $date_to = '', $tags = array(), $senders = array(), $limit = 100) {    return $this->request('messages/search', compact('query', 'date_from', 'date_to', 'tags', 'senders', 'limit'));  }  /**   * @link https://mandrillapp.com/api/docs/messages.html#method=send   *   * @return array|MandrillException   */  public function messages_send($message) {    return $this->request('messages/send', array('message' => $message));  }  /**   * @link https://mandrillapp.com/api/docs/messages.html#method=send-template   *   * @return array|MandrillException   */  public function messages_send_template($template_name, $template_content, $message) {    return $this->request('messages/send-template', compact('template_name', 'template_content', 'message'));  }  /**   * Return an array structure for a message attachment.   *   * @param string $path   *   Attachment path.   *   * @return array   *   Attachment structure.   *   * @throws MandrillException   * @throws Exception   */  public static function getAttachmentStruct($path) {    $struct = array();    try {      if (!@is_file($path)) {        throw new Exception($path . ' is not a valid file.');      }      $filename = basename($path);      if (!function_exists('get_magic_quotes')) {        function get_magic_quotes() {          return FALSE;        }      }      if (!function_exists('set_magic_quotes')) {        function set_magic_quotes($value) {          return TRUE;        }      }      if (strnatcmp(phpversion(), '6') >= 0) {        $magic_quotes = get_magic_quotes_runtime();        set_magic_quotes_runtime(0);      }      $file_buffer = file_get_contents($path);      $file_buffer = chunk_split(base64_encode($file_buffer), 76, "\n");      if (strnatcmp(phpversion(), '6') >= 0) {        set_magic_quotes_runtime($magic_quotes);      }      $mime_type = file_get_mimetype($path);      if (!DrupalMandrill::isValidContentType($mime_type)) {        throw new Exception($mime_type . ' is not a valid content type (it should be ' . implode('*,', self::getValidContentTypes()) . ').');      }      $struct['type'] = $mime_type;      $struct['name'] = $filename;      $struct['content'] = $file_buffer;    }    catch (Exception $e) {      throw new MandrillException('Error creating the attachment structure: ' . $e->getMessage());    }    return $struct;  }  /**   * Helper to determine attachment is valid.   *   * @static   *   * @param $ct   *   * @return bool   */  protected static function isValidContentType($ct) {    $valids = self::getValidContentTypes();    foreach ($valids as $vct) {      if (strpos($ct, $vct) !== FALSE) {        return TRUE;      }    }    return FALSE;  }  /**   * Return an array of valid content types.   *   * @static   *   * @return array   *   Valid content types to attach to an email.   */  protected static function getValidContentTypes() {    $valid_types = array(      'image/',      'text/',      'application/pdf',      'application/x-zip',    );    drupal_alter('mandrill_valid_attachment_types', $valid_types);    return $valid_types;  }}
 |