Subversion Repositories Applications.annuaire

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
486 aurelien 1
<?php
2
// Encodage : UTF-8
3
// +-------------------------------------------------------------------------------------------------------------------+
4
/**
5
* Traitement des mails en attente de modération de l'annuaire
6
*
7
* Description : classe permettant de gérer l'envoi des mails en attente de modération dans l'annuaire
8
* Utilisation : php script.php mail
9
*
10
//Auteur original :
11
* @author       Aurélien PERONNET <jpm@tela-botanica.org>
12
* @copyright	Tela-Botanica 1999-2014
13
* @licence		GPL v3 & CeCILL v2
14
* @version		$Id$
15
*/
16
 
17
class Mail extends Script {
18
 
19
	const STATUT_A_TRAITER = 'a_traiter';
20
	const STATUT_EN_TRAITEMENT = 'en_traitement';
21
 
22
	private $modele = null;
23
 
24
	public function executer() {
25
		$this->bdd = new Bdd();
26
 
27
		$cmd = $this->getParametre('a');
28
		$this->mode_verbeux = $this->getParametre('v');
29
 
30
		switch($cmd) {
31
			case "Tous":
32
				$this->traiterMailsEnAttente();
33
			break;
34
			// TODO: case supplémentaire pour traiter un mail par son id ?
35
			// TODO: option "force" pour traiter les mails quelques soient leur statut ?
36
			default:
37
		}
38
	}
39
 
40
	private function traiterMailsEnAttente() {
41
		// Gaston Lagaffe
42
		$mails_en_retard = $this->remettreATraiterMailsEnRetard();
43
		$mails_a_traiter = $this->obtenirMailsEnAttente();
44
 
45
		$retour = array();
46
		if(count($mails_a_traiter) > 0 && $this->mettreMailsEnCoursDeTraitement()) {
47
			foreach($mails_a_traiter as $donnees_brutes_mail) {
48
				$mail_a_moderer = $this->decoderDonneeTemporaire($donnees_brutes_mail);
49
				$id_mail = $donnees_brutes_mail['adt_id'];
50
 
51
				$resultat_envoi = $this->envoyerMail($mail_a_moderer['expediteur'],
52
						$mail_a_moderer['destinataires'],
53
						$mail_a_moderer['sujet'],
54
						$mail_a_moderer['message']);
55
 
56
				if($resultat_envoi) {
57
					$this->supprimerMailTraite($id_mail);
58
				}
59
				// TODO: logger erreur d'envoi ? envoyer mail récapitulatif
60
				$retour[$id_mail] = $resultat_envoi;
61
			}
62
		}
63
		return $retour;
64
	}
65
 
66
	private function obtenirMailsEnAttente() {
67
		$requete = "SELECT * FROM annu_donnees_temp WHERE statut = '".self::STATUT_A_TRAITER."' ";
68
		$retour = $this->bdd->recupererTous($requete);
69
 
70
		return $retour;
71
	}
72
 
73
	private function mettreMailsEnCoursDeTraitement() {
74
		$requete = "UPDATE annu_donnees_temp SET statut = '".self::STATUT_EN_TRAITEMENT."', date_debut_traitement = NOW() ".
75
					"WHERE statut = '".self::STATUT_A_TRAITER."' ";
76
		$maj = $this->bdd->requeter($requete);
77
		return ($maj !== false);
78
	}
79
 
80
	private function supprimerMailTraite($id) {
81
		$requete = "DELETE FROM annu_donnees_temp WHERE statut = '".self::STATUT_EN_TRAITEMENT."' ".
82
					"AND adt_id = '".$id."'";
83
		$supp = $this->bdd->requeter($requete);
84
		return $supp;
85
	}
86
 
87
	private function supprimerMailsEnCoursDeTraitement() {
88
		$requete = "DELETE FROM annu_donnees_temp WHERE statut = '".self::STATUT_EN_TRAITEMENT."' ";
89
		$supp = $this->bdd->requeter($requete);
90
		return $supp;
91
	}
92
 
93
	private function remettreATraiterMailsEnRetard() {
94
		$requete = "UPDATE annu_donnees_temp SET statut = '".self::STATUT_A_TRAITER."', date_debut_traitement = NULL ".
95
				"WHERE statut = '".self::STATUT_EN_TRAITEMENT."' ".
96
				"AND date_debut_traitement < (DATE_SUB(now(), INTERVAL 10 HOUR)) ";
97
 
98
		$maj = $this->bdd->requeter($requete);
99
		return ($maj !== false);
100
	}
101
 
102
	private function decoderDonneeTemporaire($donnee_encodee) {
103
		return unserialize(base64_decode($donnee_encodee['adt_donnees']));
104
	}
105
 
106
	/** Envoie un mail avec l'adresse de l'utilisateur donné en paramètre, à l'adresse donnée en paramètre.
107
	 * ATTENTION : le sujet et le contenu envoyer à cette méthode doivent avoir le même encodage que l'application.
108
	 *
109
	 * @param string $expediteur l'expediteur du message
110
	 * @param mixed $destinataires un string ou un tableau de mails qui contiennent les destinataire
111
	 * @param string $sujet sujet du mail
112
	 * @return boolean true ou false suivant le succès ou non de l'envoi
113
	 */
114
	public function envoyerMail($expediteur, $destinataires, $sujet, $message_html, $message_texte = '', $adresse_reponse = null) {
115
		if (!is_array($destinataires)) {
116
			$destinataires = array($destinataires);
117
		}
118
		$message_html = $this->encoderChainePourEnvoiMail($message_html);
119
		if ($message_texte == '') {
120
			$message_texte = $this->filtrerChaine($message_html);
121
		}
122
 
123
		$encodage = Config::get('appli_encodage');
124
		$limite = "_----------=_parties_".md5(uniqid(rand()));
125
		$eol = "\n";
126
 
127
		$entetes = '';
128
		// Définition d'un mail en texte simple et html
129
		// multipart/alternative signifie même contenu de la forme la plus simple à la plus complexe
130
		$entetes .= "X-Sender: <http://www.tela-botanica.org>".$eol.
131
		"X-Mailer: PHP-ANNUAIRE-HTML".$eol.
132
		"X-auth-smtp-user: annuaire@tela-botanica.org ".$eol.
133
		"X-abuse-contact: annuaire@tela-botanica.org ".$eol.
134
		'Date: '.date('r').$eol.
135
		'From: '.$expediteur.$eol.
136
		'MIME-Version: 1.0'.$eol;
137
		if ($adresse_reponse !== null) {
138
			$entetes .= 'Reply-To: '.$adresse_reponse.$eol;
139
		}
140
		$entetes .= "Content-Type: multipart/alternative; boundary=\"$limite\";".$eol.$eol;
141
 
142
		// message en texte simple
143
		$contenu = "--$limite".$eol.
144
		"Content-Type: text/plain; charset=\"$encodage\";".$eol.
145
		"Content-Transfer-Encoding: 8bit;".$eol.$eol.
146
		$message_texte.$eol.$eol.
147
		// le message en html est préféré s'il est lisible
148
		"--$limite".$eol.
149
		"Content-Type: text/html; charset=\"$encodage\";".$eol.
150
		"Content-Transfer-Encoding: 8bit;".$eol.$eol.
151
		$message_html.$eol.$eol.
152
		"--$limite--".$eol.$eol;
153
 
154
		$sujetEncode = mb_encode_mimeheader($this->encoderChainePourEnvoiMail($sujet), $encodage, "B", "\n");
155
		$ok = true;
156
		foreach ($destinataires as $destinataire) {
157
			$ok = mail($destinataire, $sujetEncode, $contenu, $entetes);
158
			if (!$ok) {
159
				break;
160
			}
161
		}
162
		return $ok;
163
	}
164
}
165
?>