/trunk/scripts/modules/mail/Mail.php |
---|
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; |
} |
} |
?> |
/trunk/scripts/configurations/config.defaut.ini |
---|
New file |
0,0 → 1,16 |
; +------------------------------------------------------------------------------------------------------+ |
; BASE de DONNÉES |
; Encodage de la connexion à la base de données |
bdd_encodage = "utf8" |
; Encodage des squelettes |
sortie_encodage = "UTF-8" |
; abstraction de la base de données. |
bdd_abstraction = pdo |
; Protocole de la base de données. |
bdd_protocole = mysql |
; Nom de la base de données principale. |
bdd_nom = "annuaire" |
bdd_serveur = "127.0.0.1" |
bdd_utilisateur = "root" |
bdd_mot_de_passe = "Canard123$" |
/trunk/scripts/framework.defaut.php |
---|
New file |
0,0 → 1,6 |
<?php |
// Inclusion du Framework |
// Renomer ce fichier en "framework.php" |
// Indiquer ci-dessous le chemin absolu vers le fichier autoload.inc.php de la bonne version du Framework |
require_once '/home/utilisateur/web/framework/framework/Framework.php'; |
?> |
/trunk/scripts/cli.php |
---|
New file |
0,0 → 1,37 |
<?php |
// Encodage : UTF-8 |
// +-------------------------------------------------------------------------------------------------------------------+ |
/** |
* Initialise le chargement et l'exécution des scripts |
* |
* Lancer ce fichier en ligne de commande avec : |
* <code>/opt/lampp/bin/php cli.php mon_script -a test</code> |
* |
//Auteur original : |
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org> |
* @author Delphine CAUQUIL <delphine@tela-botanica.org> |
* @copyright Tela-Botanica 1999-2008 |
* @licence GPL v3 & CeCILL v2 |
* @version $Id$ |
*/ |
// +-------------------------------------------------------------------------------------------------------------------+ |
// Le fichier Framework.php du Framework de Tela Botanica doit être appelée avant tout autre chose dans l'application. |
// Sinon, rien ne sera chargé. |
// Chemin du fichier chargeant le framework requis |
$framework = dirname(__FILE__).DIRECTORY_SEPARATOR.'framework.php'; |
if (!file_exists($framework)) { |
$e = "Veuillez paramétrer l'emplacement et la version du Framework dans le fichier $framework"; |
trigger_error($e, E_USER_ERROR); |
} else { |
// Inclusion du Framework |
require_once $framework; |
// Ajout d'information concernant cette application |
Framework::setCheminAppli(__FILE__);// Obligatoire |
Framework::setInfoAppli(Config::get('info')); |
// Initialisation et lancement du script appelé en ligne de commande |
Cli::executer(); |
} |
?> |
/trunk/modeles/DonneeTemporaireModele.php |
---|
12,6 → 12,11 |
*/ |
Class DonneeTemporaireModele extends Modele { |
// attention le script de traitement des mails utilise des variables |
// similaires (donc si on change l'une on change l'autre) |
const STATUT_A_TRAITER = 'a_traiter'; |
const STATUT_EN_TRAITEMENT = 'en_traitement'; |
private $config = array(); |
92,5 → 97,15 |
$retour = $resultat ? true : false; |
return $retour; |
} |
public function mettreDonneeTemporaireATraiter($code_donnee) { |
// TODO: si d'autres traitement que les mails existent un jour, ajouter un code de traitement |
// pour les différencier |
$requete = "UPDATE annu_donnees_temp SET statut = '".self::STATUT_A_TRAITER."' ". |
"WHERE adt_id = ".$this->proteger($code_donnee)." AND statut != '".self::STATUT_EN_TRAITEMENT."' "; |
$resultat = $this->requete($requete); |
$retour = $resultat ? true : false; |
return $retour; |
} |
} |
?> |
/trunk/configurations/config.defaut.ini |
---|
153,6 → 153,8 |
moderation_copie = true; |
; Spécifique module affichage des photos issues du carnet en ligne d'eflore : eflore_remarques[a]tela-botanica[point]org |
mail_liste_en_copie = "eflore_remarques@tela-botanica.org" |
; définit si un script externe (type cron) traite les mails pour éviter l'echec des gros traitements |
traitement_messages_differe = true; |
; +-----------------------------------------------------------------------------------------------------+ |
; APPLI EXTERNES |
/trunk/squelettes/annuaires/message_moderation_confirmation.tpl.html |
---|
1,6 → 1,21 |
<?php if(isset($envoi_reussi)) { ?> |
<?php if(isset($mise_en_traitement_reussie)) { ?> |
<div id="message_info"> |
<h3> Message mis en traitement avec succés ! </h3> |
<p> Le message a été mis en traitement et sera envoyé prochainement. |
</p> |
</div> |
<?php } elseif(isset(mise_en_traitement_echouee)) { ?> |
<div id="message_info"> |
<h3> Échec de la mise en traitement </h3> |
<p> La mise en traitement du message à échouée, contactez un administrateur. |
</p> |
</div> |
<?php } if(isset($envoi_reussi)) { ?> |
<div id="message_info"> |
<h3> Message envoyé avec succés ! </h3> |
<p> Le message a été envoyé avec succés aux membres du réseau selectionnés <br /> |
/trunk/controleurs/MessageControleur.php |
---|
43,6 → 43,12 |
* Tableau recapitulatif de la derniere recherche effectuée pour envoyer un message |
*/ |
private $criteres_recherche_effectuee = null; |
/** |
* Définit si les messages doivent être traités immédiatement (au risque de faire planter l'appli |
* en cas de trop grand nombre de destinataires ou bien si un script "cronné" les traitera |
*/ |
private $traitement_messages_differe = false; |
/** |
* |
75,6 → 81,11 |
if (Config::get('adresse_mail_annuaire') != null) { |
$this->adresse_mail_annuaire = Config::get('adresse_mail_annuaire'); |
} |
// adresse d'expéditeur |
if (Config::get('traitement_messages_differe') != null) { |
$this->traitement_messages_differe = Config::get('$traitement_messages_differe'); |
} |
} |
/** -------------------Fonctions pour l'inscription et l'oubli de mot de passe -----------------------*/ |
181,7 → 192,7 |
/** Envoie un mail au format texte 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. |
* ATTENTION : le sujet et le contenu envoyés à 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 |
461,15 → 472,21 |
$message_modele = $this->getModele('DonneeTemporaireModele'); |
$mail_a_moderer = $message_modele->chargerDonneeTemporaire($code_confirmation); |
if ($mail_a_moderer) { |
// envoi |
$resultat_envoi = $this->envoyerMail($mail_a_moderer['expediteur'], |
$mail_a_moderer['destinataires'], |
$mail_a_moderer['sujet'], |
$mail_a_moderer['message']); |
$donnees = ($resultat_envoi) ? array('envoi_reussi' => true) : array('envoi_echoue' => true); |
$message_modele->supprimerDonneeTemporaire($code_confirmation); |
if ($mail_a_moderer) { |
if($this->traitement_messages_differe) { |
// envoi différé à travers un script tournant en permanence |
$mise_en_traitement = $message_modele->mettreDonneeTemporaireATraiter($code_confirmation); |
$donnees = ($mise_en_traitement) ? array('mise_en_traitement_reussie' => true) : array('mise_en_traitement_echouee' => true); |
} else { |
// envoi classique (immédiat) |
$resultat_envoi = $this->envoyerMail($mail_a_moderer['expediteur'], |
$mail_a_moderer['destinataires'], |
$mail_a_moderer['sujet'], |
$mail_a_moderer['message']); |
$donnees = ($resultat_envoi) ? array('envoi_reussi' => true) : array('envoi_echoue' => true); |
$message_modele->supprimerDonneeTemporaire($code_confirmation); |
} |
} else { |
$donnees = array('message_inexistant' => true); |
} |