Changeset 96848 in spip-zone


Ignore:
Timestamp:
Apr 28, 2016, 1:45:13 PM (4 years ago)
Author:
cedric@…
Message:

utiliser l'API http de Sparkpost plutot que l'API SMTP (qui est bien lente, ce qui est embetant sur les gros envois). Should work

Location:
_plugins_/mailshot/trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/mailshot/trunk/bulkmailer/sparkpost.php

    r96776 r96848  
    3737                $mailer_defaut = charger_fonction("defaut","bulkmailer");
    3838        }
    39 
    40         // on passe par l'API SMTP basique
    41 
    42         // on ecrase le smtp avec celui de sparkpost
    43         $options['smtp'] = array(
    44                 "host" => "smtp.sparkpostmail.com",
    45                 "port" => "587",
    46                 "auth" => "oui",
    47                 "username" => 'SMTP_Injection',
    48                 "password" => $config['sparkpost_api_key'],
    49                 "secure" => "non",
    50         );
    51 
    52         // reprendre le port specifique s'il est defini dans le facteur
    53         if (lire_config("facteur_smtp_host") == 'smtp.sparkpostmail.com') {
    54                 $options['smtp']['port'] = lire_config('facteur_smtp_port', '587');
    55         }
    56 
    57         // on utilise une surcharge pour gerer le tracking
     39       
     40        // on utilise une surcharge pour utiliser l'API http
    5841        $options['sender_class'] = "FacteurSparkpost";
    59 
    6042        return $mailer_defaut($to_send,$options);
    6143}
     
    360342/**
    361343 * Class FacteurSparkpost
    362  * Utilise l'API SMTP valable dans toutes les versions d'API
     344 * Utilise l'API HTTP transmission
    363345 */
    364346class FacteurSparkpost extends Facteur {
    365347
    366348        public $send_options = array();
     349        protected $message = array(
     350                'options' => array(
     351                        'open_tracking' => false,
     352                        'clic_tracking' => false,
     353                ),
     354                'campaign_id' => '',
     355                #'return_path' => '',// do not provide if empty
     356                #'metadata' => array(), // not used here, need to be a JSON object, fail if empty
     357                #'substitution_data' => array(), // not used here, need to be a JSON object, fail if empty
     358                'recipients' => array(
     359                        #array('address' => array('email'=>'','name'=>''))
     360                ),
     361                'content' => array(
     362                        'from' => array('email'=>'','name'=>''),
     363                        'subject' => '',
     364                        #'reply_to' => '', // do not provide if empty
     365                        'headers' => array(),
     366                        'text' => '',
     367                        'html' => '',
     368                )
     369        );
     370
     371        protected function cleanAdress($address, $name = ''){
     372                $address = trim($address);
     373    $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
     374                if (!self::ValidateAddress($address)) {
     375                        $this->SetError('invalid_address'.': '. $address);
     376                        return false;
     377          }
     378                return array($address,$name);
     379        }
     380
     381        /**
     382        * Adds a "To" address.
     383        * @param string $address
     384        * @param string $name
     385        * @return boolean true on success, false if address already used
     386        */
     387        public function AddAddress($address, $name = '') {
     388                if ($a = $this->cleanAdress($address,$name)){
     389                        $to = array('email'=>$address,'name'=>$name);
     390                        $this->message['recipients'][] = array('address'=>$to);
     391                        return true;
     392                }
     393                return false;
     394        }
     395
     396        /**
     397        * Adds a "Cc" address.
     398        * Note: this function works with the SMTP mailer on win32, not with the "mail" mailer.
     399        * @param string $address
     400        * @param string $name
     401        * @return boolean true on success, false if address already used
     402        */
     403        public function AddCC($address, $name = '') {
     404                return $this->AddAddress($address, $name);
     405        }
     406
     407        /**
     408        * Adds a "Bcc" address.
     409        * Note: this function works with the SMTP mailer on win32, not with the "mail" mailer.
     410        * @param string $address
     411        * @param string $name
     412        * @return boolean true on success, false if address already used
     413        */
     414        public function AddBCC($address, $name = '') {
     415                return $this->AddAddress($address, $name);
     416        }
     417
     418        /**
     419        * Adds a "Reply-to" address.
     420        * @param string $address
     421        * @param string $name
     422        * @return boolean
     423        */
     424        public function AddReplyTo($address, $name = '') {
     425                if ($a = $this->cleanAdress($address,$name)){
     426                        if ($name) $address = "$name <$address>";
     427                        $this->message['content']['reply_to'] = $address;
     428                        return true;
     429                }
     430                return false;
     431        }
     432
     433        /**
     434        * Adds a custom header.
     435        * @access public
     436        * @return void
     437        */
     438        public function AddCustomHeader($name, $value = null) {
     439                if ($value === null) {
     440                        // Value passed in as name:value
     441                        list($name, $value) = explode(':', $name, 2);
     442                }
     443                $this->message['content']['headers'][trim($name)] = trim($value);
     444        }
    367445
    368446        /**
     
    372450         */
    373451        public function Send() {
     452
     453                $this->message['content']['html'] = $this->Body;
     454                $this->message['content']['text'] = $this->AltBody;
     455                $this->message['content']['subject'] = $this->Subject;
     456                $this->message['content']['from']['email'] = $this->From;
     457                $this->message['content']['from']['name'] = $this->FromName;
     458
     459                // ajouter le tracking_id en tag, pour retrouver le message apres webhook
    374460                if (isset($this->send_options['tracking_id'])
    375461                  AND $id = $this->send_options['tracking_id']){
    376 
    377                         $campaign = protocole_implicite($GLOBALS['meta']['adresse_site'])."/#".$this->send_options['tracking_id'];
    378 
    379                         $options = array(
    380                                 'options' => array(
    381                                         'open_tracking' => true,
    382                                         'click_tracking' => true,
    383                                         //'transactional' => true,
    384                                 ),
    385                                 //'metadata' => array('key'=>'value'),
    386                                 //'tags' => array('tag1','tag2'),
    387                                 'campaign_id' => $campaign,
    388                         );
    389                         $this->AddCustomHeader("X-MSYS-API: ".json_encode($options));
    390                 }
    391 
    392                 return parent::Send();
    393         }
    394 }
     462                        $this->message['options']['open_tracking'] = true;
     463                        $this->message['options']['clic_tracking'] = true;
     464                        // prefixer le tracking par l'url du site pour ne pas melanger les feedbacks
     465                        $this->message['campaign_id'] = protocole_implicite($GLOBALS['meta']['adresse_site'])."/#".$this->send_options['tracking_id'];
     466                }
     467
     468                try {
     469                        $response = sparkpost_api_call('transmissions',$this->message);
     470                }
     471                catch (Exception $e) {
     472      $this->SetError($e->getMessage());
     473      return false;
     474    }
     475
     476                spip_log("FacteurSparkpost->Send resultat:".var_export($response,true),"mailshot");
     477
     478
     479                // statut d'erreur au premier niveau ?
     480                if (isset($response['errors'])){
     481                        $err = "";
     482                        foreach($response['errors'] as $e){
     483                                $err .=  $e['code'].' '.$e['message']."\n";
     484                        }
     485                        $this->SetError($err . var_export($this->message,true));
     486                        return false;
     487                }
     488
     489                // sinon regarder le status du premier mail envoye (le to)
     490                /*
     491                {
     492                  "results": {
     493                    "total_rejected_recipients": 0,
     494                    "total_accepted_recipients": 1,
     495                    "id": "11668787484950529"
     496                  }
     497                }
     498                 */
     499                if (isset($response['results'])){
     500                        if ($response['results']['total_accepted_recipients']>=1){
     501                                return true;
     502                        }
     503                        if ($response['results']['total_rejected_recipients']>=1){
     504                                $this->SetError("rejected");
     505                                return false;
     506                        }
     507                }
     508
     509                // ici on ne sait pas ce qu'il s'est passe !
     510                $this->SetError("??????".var_export($response,true));
     511                spip_log("FacteurSparkpost->Send resultat inatendu : ".var_export($response,true),"mailshot"._LOG_ERREUR);
     512                return false;
     513
     514        }
     515
     516        public function CreateHeader(){}
     517}
  • _plugins_/mailshot/trunk/paquet.xml

    r96827 r96848  
    22        prefix="mailshot"
    33        categorie="communication"
    4         version="1.16.3"
     4        version="1.17.0"
    55        etat="stable"
    66        compatibilite="[3.0.5;3.1.*]"
Note: See TracChangeset for help on using the changeset viewer.