source: spip-zone/_plugins_/mailshot/trunk/lib/mandrill-api-php/src/Mandrill.php @ 70412

Last change on this file since 70412 was 70412, checked in by cedric@…, 7 years ago

Etre capable d'utiliser Mandrill même si cUrl pas dispo sur le serveur, ou si open_basedir/safe_mode actif (qui empechent FOLLOW_LOCATION de cUrl) en utilisant recuperer_page(). Si recuperer_page() echoue, on lance la methode native qui repose sur cUrl quand même (cas si openssl pas present sur le serveur)

File size: 4.9 KB
Line 
1<?php
2/**
3 * https://bitbucket.org/mailchimp/mandrill-api-php
4 * V 1.0.11
5 */
6
7require_once 'Mandrill/Templates.php';
8require_once 'Mandrill/Users.php';
9require_once 'Mandrill/Rejects.php';
10require_once 'Mandrill/Inbound.php';
11require_once 'Mandrill/Tags.php';
12require_once 'Mandrill/Messages.php';
13require_once 'Mandrill/Internal.php';
14require_once 'Mandrill/Urls.php';
15require_once 'Mandrill/Webhooks.php';
16require_once 'Mandrill/Senders.php';
17require_once 'Mandrill/Exceptions.php';
18
19class Mandrill {
20   
21    public $apikey;
22    public $ch;
23    public $root = 'https://mandrillapp.com/api/1.0';
24    public $debug = false;
25
26    public static $error_map = array(
27        "ValidationError" => "Mandrill_ValidationError",
28        "Invalid_Key" => "Mandrill_Invalid_Key",
29        "Unknown_Template" => "Mandrill_Unknown_Template",
30        "Invalid_Tag_Name" => "Mandrill_Invalid_Tag_Name",
31        "Invalid_Reject" => "Mandrill_Invalid_Reject",
32        "Unknown_Sender" => "Mandrill_Unknown_Sender",
33        "Unknown_Url" => "Mandrill_Unknown_Url",
34        "Invalid_Template" => "Mandrill_Invalid_Template",
35        "Unknown_Webhook" => "Mandrill_Unknown_Webhook",
36        "Unknown_InboundDomain" => "Mandrill_Unknown_InboundDomain"
37    );
38
39    public function __construct($apikey=null) {
40        if(!$apikey) $apikey = getenv('MANDRILL_APIKEY');
41        if(!$apikey) $apikey = $this->readConfigs();
42        if(!$apikey) throw new Mandrill_Error('You must provide a Mandrill API key');
43        $this->apikey = $apikey;
44
45        $this->ch = curl_init();
46        curl_setopt($this->ch, CURLOPT_USERAGENT, 'Mandrill-PHP/1.0.11');
47        curl_setopt($this->ch, CURLOPT_POST, true);
48              // avoid warning if safe_mode OR open_basedir
49        @curl_setopt($this->ch, CURLOPT_FOLLOWLOCATION, true);
50        curl_setopt($this->ch, CURLOPT_HEADER, false);
51        curl_setopt($this->ch, CURLOPT_RETURNTRANSFER, true);
52        curl_setopt($this->ch, CURLOPT_CONNECTTIMEOUT, 30);
53        curl_setopt($this->ch, CURLOPT_TIMEOUT, 600);
54
55        $this->root = rtrim($this->root, '/') . '/';
56
57        $this->templates = new Mandrill_Templates($this);
58        $this->users = new Mandrill_Users($this);
59        $this->rejects = new Mandrill_Rejects($this);
60        $this->inbound = new Mandrill_Inbound($this);
61        $this->tags = new Mandrill_Tags($this);
62        $this->messages = new Mandrill_Messages($this);
63        $this->internal = new Mandrill_Internal($this);
64        $this->urls = new Mandrill_Urls($this);
65        $this->webhooks = new Mandrill_Webhooks($this);
66        $this->senders = new Mandrill_Senders($this);
67    }
68
69    public function __destruct() {
70        curl_close($this->ch);
71    }
72
73    public function call($url, $params) {
74        $params['key'] = $this->apikey;
75        $params = json_encode($params);
76        $ch = $this->ch;
77
78        curl_setopt($ch, CURLOPT_URL, $this->root . $url . '.json');
79        curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
80        curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
81        curl_setopt($ch, CURLOPT_VERBOSE, $this->debug);
82
83        $start = microtime(true);
84        $this->log('Call to ' . $this->root . $url . '.json: ' . $params);
85        if($this->debug) {
86            $curl_buffer = fopen('php://memory', 'w+');
87            curl_setopt($ch, CURLOPT_STDERR, $curl_buffer);
88        }
89
90        $response_body = curl_exec($ch);
91        $info = curl_getinfo($ch);
92        $time = microtime(true) - $start;
93        if($this->debug) {
94            rewind($curl_buffer);
95            $this->log(stream_get_contents($curl_buffer));
96            fclose($curl_buffer);
97        }
98        $this->log('Completed in ' . number_format($time * 1000, 2) . 'ms');
99        $this->log('Got response: ' . $response_body);
100
101        if(curl_error($ch)) {
102            throw new Mandrill_HttpError("API call to $url failed: " . curl_error($ch));
103        }
104        $result = json_decode($response_body, true);
105        if($result === null) throw new Mandrill_Error('We were unable to decode the JSON response from the Mandrill API: ' . $response_body);
106       
107        if(floor($info['http_code'] / 100) >= 4) {
108            throw $this->castError($result);
109        }
110
111        return $result;
112    }
113
114    public function readConfigs() {
115        $paths = array('~/.mandrill.key', '/etc/mandrill.key');
116        foreach($paths as $path) {
117            if(file_exists($path)) {
118                $apikey = trim(file_get_contents($path));
119                if($apikey) return $apikey;
120            }
121        }
122        return false;
123    }
124
125    public function castError($result) {
126        if($result['status'] !== 'error' || !$result['name']) throw new Mandrill_Error('We received an unexpected error: ' . json_encode($result));
127
128        $class = (isset(self::$error_map[$result['name']])) ? self::$error_map[$result['name']] : 'Mandrill_Error';
129        return new $class($result['message'], $result['code']);
130    }
131
132    public function log($msg) {
133        if($this->debug) error_log($msg);
134    }
135}
136
137
Note: See TracBrowser for help on using the repository browser.