Subversion Repositories Applications.annuaire

Rev

Rev 490 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

<?php
// Encodage : UTF-8
// +-------------------------------------------------------------------------------------------------------------------+
/**
* Traitement des mails en attente de modération de l'annuaire
*
* Description : classe permettant de gérer l'envoi des mails en attente de modération dans l'annuaire
* Utilisation : php script.php mail
*
//Auteur original :
* @author       Aurélien PERONNET <jpm@tela-botanica.org>
* @copyright    Tela-Botanica 1999-2014
* @licence              GPL v3 & CeCILL v2
* @version              $Id$
*/

class Mail extends Script {
        
        const STATUT_A_TRAITER = 'a_traiter';
        const STATUT_EN_TRAITEMENT = 'en_traitement';
        
        private $modele = null;
        
        public function executer() {    
                $this->bdd = new Bdd();
                
                $cmd = $this->getParametre('a');
                $this->mode_verbeux = $this->getParametre('v');
                
                switch($cmd) {
                        case "Tous":
                                $this->traiterMailsEnAttente();
                        break;
                        // TODO: case supplémentaire pour traiter un mail par son id ?
                        // TODO: option "force" pour traiter les mails quelques soient leur statut ?
                        default:        
                }
        }
        
        private function traiterMailsEnAttente() {
                // Gaston Lagaffe
                $mails_en_retard = $this->remettreATraiterMailsEnRetard();
                $mails_a_traiter = $this->obtenirMailsEnAttente();
                
                $retour = array();
                if(count($mails_a_traiter) > 0 && $this->mettreMailsEnCoursDeTraitement()) {
                        foreach($mails_a_traiter as $donnees_brutes_mail) {
                                $mail_a_moderer = $this->decoderDonneeTemporaire($donnees_brutes_mail);
                                $id_mail = $donnees_brutes_mail['adt_id'];
                                
                                $resultat_envoi = $this->envoyerMail($mail_a_moderer['expediteur'],
                                                $mail_a_moderer['destinataires'],
                                                $mail_a_moderer['sujet'],
                                                $mail_a_moderer['message']);
                                
                                if($resultat_envoi) {
                                        $this->supprimerMailTraite($id_mail);
                                }
                                // TODO: logger erreur d'envoi ? envoyer mail récapitulatif
                                $retour[$id_mail] = $resultat_envoi;
                        }
                }
                return $retour;
        }
        
        private function obtenirMailsEnAttente() {
                $requete = "SELECT * FROM annu_donnees_temp WHERE statut = '".self::STATUT_A_TRAITER."' ";
                $retour = $this->bdd->recupererTous($requete);
                
                return $retour;
        }
        
        private function mettreMailsEnCoursDeTraitement() {
                $requete = "UPDATE annu_donnees_temp SET statut = '".self::STATUT_EN_TRAITEMENT."', date_debut_traitement = NOW() ".
                                        "WHERE statut = '".self::STATUT_A_TRAITER."' ";
                $maj = $this->bdd->requeter($requete);
                return ($maj !== false);
        }
        
        private function supprimerMailTraite($id) {
                $requete = "DELETE FROM annu_donnees_temp WHERE statut = '".self::STATUT_EN_TRAITEMENT."' ".
                                        "AND adt_id = '".$id."'";
                $supp = $this->bdd->requeter($requete);
                return $supp;
        }
        
        private function supprimerMailsEnCoursDeTraitement() {
                $requete = "DELETE FROM annu_donnees_temp WHERE statut = '".self::STATUT_EN_TRAITEMENT."' ";
                $supp = $this->bdd->requeter($requete);
                return $supp;
        }
        
        private function remettreATraiterMailsEnRetard() {
                $requete = "UPDATE annu_donnees_temp SET statut = '".self::STATUT_A_TRAITER."', date_debut_traitement = NULL ".
                                "WHERE statut = '".self::STATUT_EN_TRAITEMENT."' ".
                                "AND date_debut_traitement < (DATE_SUB(now(), INTERVAL 10 HOUR)) ";
                
                $maj = $this->bdd->requeter($requete);
                return ($maj !== false);
        }
        
        private function decoderDonneeTemporaire($donnee_encodee) {
                return unserialize(base64_decode($donnee_encodee['adt_donnees']));
        }
        
        /** Envoie un mail avec l'adresse de l'utilisateur donné en paramètre, à l'adresse donnée en paramètre.
         * ATTENTION : le sujet et le contenu envoyer à cette méthode doivent avoir le même encodage que l'application.
         *
         * @param string $expediteur l'expediteur du message
         * @param mixed $destinataires un string ou un tableau de mails qui contiennent les destinataire
         * @param string $sujet sujet du mail
         * @return boolean true ou false suivant le succès ou non de l'envoi
         */
        public function envoyerMail($expediteur, $destinataires, $sujet, $message_html, $message_texte = '', $adresse_reponse = null) {
                if (!is_array($destinataires)) {
                        $destinataires = array($destinataires);
                }
                $message_html = $this->encoderChainePourEnvoiMail($message_html);
                if ($message_texte == '') {
                        $message_texte = $this->filtrerChaine($message_html);
                }
        
                $encodage = Config::get('appli_encodage');
                $limite = "_----------=_parties_".md5(uniqid(rand()));
                $eol = "\n";
        
                $entetes = '';
                // Définition d'un mail en texte simple et html
                // multipart/alternative signifie même contenu de la forme la plus simple à la plus complexe
                $entetes .= "X-Sender: <http://www.tela-botanica.org>".$eol.
                "X-Mailer: PHP-ANNUAIRE-HTML".$eol.
                "X-auth-smtp-user: annuaire@tela-botanica.org ".$eol.
                "X-abuse-contact: annuaire@tela-botanica.org ".$eol.
                'Date: '.date('r').$eol.
                'From: '.$expediteur.$eol.
                'MIME-Version: 1.0'.$eol;
                if ($adresse_reponse !== null) {
                        $entetes .= 'Reply-To: '.$adresse_reponse.$eol;
                }
                $entetes .= "Content-Type: multipart/alternative; boundary=\"$limite\";".$eol.$eol;
        
                // message en texte simple
                $contenu = "--$limite".$eol.
                "Content-Type: text/plain; charset=\"$encodage\";".$eol.
                "Content-Transfer-Encoding: 8bit;".$eol.$eol.
                $message_texte.$eol.$eol.
                // le message en html est préféré s'il est lisible
                "--$limite".$eol.
                "Content-Type: text/html; charset=\"$encodage\";".$eol.
                "Content-Transfer-Encoding: 8bit;".$eol.$eol.
                $message_html.$eol.$eol.
                "--$limite--".$eol.$eol;
        
                $sujetEncode = mb_encode_mimeheader($this->encoderChainePourEnvoiMail($sujet), $encodage, "B", "\n");
                $ok = true;
                foreach ($destinataires as $destinataire) {
                        $ok = mail($destinataire, $sujetEncode, $contenu, $entetes);
                        if (!$ok) {
                                break;
                        }
                }
                return $ok;
        }
}
?>