Rev 491 | 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;}}?>