New file |
0,0 → 1,165 |
<?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; |
} |
} |
?> |