Subversion Repositories eFlore/Applications.cel

Rev

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

Rev Author Line No. Line
619 aurelien 1
<?php
858 aurelien 2
// ATTENTION ! Classe compatible uniquement avec nouveau format de bdd du cel //
3
 
619 aurelien 4
/**
5
 * Service d'import d'image à partir de mails
6
 * Encodage en entrée : utf8
7
 * Encodage en sortie : utf8
8
 *
9
 * @author Aurélien PERONNET <aurelien@tela-botanica.org>
10
 * @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
11
 * @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
12
 * @version $Id$
13
 */
14
Class InventoryImportMail extends Cel {
15
 
16
	/**
17
	 * Appelée en mode client, lit le mail envoyé sur l'entrée stdin
18
	 * et le stocke dans le dossier temporaire en attendant
19
	 * qu'une tache périodique associée traite les mails en attente
20
	 *
21
	 * @param array $params les paramètres du script client, l'utilisateur est indiqué avec le paramètre -s
22
	 */
23
	public function stockerMailCli($params)
24
	{
25
		$contenu_mail = file_get_contents('php://stdin');
26
 
27
		$parametres_ajout = array();
858 aurelien 28
		$parametres_ajout['mail_utilisateur'] = $params['-s'];
619 aurelien 29
 
30
		$stockage = $this->stockerMailTemporaire($parametres_ajout, $contenu_mail);
31
 
32
		if($stockage) {
33
			$message_attente = 'Votre messsage a été reçu, et est en attente de traitement, '.
34
									'vous recevrez un message lorsque celui-ci aura été effectué';
858 aurelien 35
			mail($parametres_ajout['mail_utilisateur'],'Votre message est en attente de traitement',$message_attente);
619 aurelien 36
		} else {
37
			$message_echec = 'Votre messsage a été reçu, mais il n\'a pas pu être stocké';
858 aurelien 38
			mail($parametres_ajout['mail_utilisateur'],'Problème lors de reception du message',$message_echec);
619 aurelien 39
		}
40
 
767 aurelien 41
		exit;
619 aurelien 42
	}
43
 
44
	private function stockerMailTemporaire($parametres_ajout, $contenu_mail) {
45
 
858 aurelien 46
		$expediteur = $parametres_ajout['mail_utilisateur'];
619 aurelien 47
		$nom_fichier_temp = $this->fabriquerNomTemporaireStockageMail($expediteur);
48
 
49
		$dossier_stockage_temp = $this->config['chemin_stockage_temp'];
50
		$chemin_stockage_image_temp = $dossier_stockage_temp.'/mails/';
51
 
52
		return file_put_contents($chemin_stockage_image_temp.$nom_fichier_temp);
53
	}
54
 
55
	/**
56
	 * Appelée en mode client, lit le mail envoyé sur l'entrée stdin
57
	 * extrait les images en pièces jointes, et les ajoute au cel de l'utilisateur
58
	 * expediteur
59
	 *
60
	 * @param array $params les paramètres du script client, l'utilisateur est indiqué avec le paramètre -s
61
	 */
62
	public function traiterMailCli($params)
63
	{
64
 
65
		$contenu_mail = file_get_contents('php://stdin');
66
 
67
		$parametres_ajout = array();
858 aurelien 68
		$parametres_ajout['mail_utilisateur'] = $params['-s'];
619 aurelien 69
 
70
		$ids_stockage = $this->traiterMail($parametres_ajout, $contenu_mail);
71
 
72
		foreach($ids_stockage as $nom_image => $id_stockage) {
73
 
74
			if($id_stockage) {
858 aurelien 75
				mail($parametres_ajout['mail_utilisateur'],'Votre image a été ajoutée au Carnet en ligne','Votre image '.$nom_image.' a été ajoutée avec succès');
619 aurelien 76
			} else {
77
 
858 aurelien 78
				mail($parametres_ajout['mail_utilisateur'],'Problème lors de l\'ajout au Carnet en ligne','Votre image '.$nom_image.' n\'a pas pu être ajoutée');
619 aurelien 79
			}
80
		}
81
 
82
		exit();
83
	}
84
 
85
	/**
86
	 * Traite le mail fourni en paramètre extrait les images en pièces jointes,
87
	 * et les ajoute au cel de l'utilisateur expediteur
88
	 *
89
	 * @param array $params les paramètres du script client, l'utilisateur est indiqué dans la case 'identifiant'
90
	*/
91
	public function traiterMail($params, $contenu_mail)
858 aurelien 92
	{
619 aurelien 93
		$pieces_jointes = $this->extrairePiecesJointes($contenu_mail);
94
 
95
		$stockeur_image = new InventoryImage($this->config);
96
 
97
		$ids = array();
98
 
858 aurelien 99
		$infos_utilisateur = $this->getInfosComplementairesUtilisateurPourMail($params['mail_utilisateur']);
100
 
101
		$params['ce_utilisateur'] = $infos_utilisateur['id_utilisateur'];
619 aurelien 102
		foreach($pieces_jointes as $piece_jointe) {
103
 
104
			$nouvel_id_image = $stockeur_image->ajouterImageSurDdEtBdd($params, $piece_jointe);
105
 
106
			if($nouvel_id_image)
107
			{
108
				$ids[$piece_jointe['name']] = $nouvel_id_image;
109
			}
110
			else
111
			{
112
				$ids[$piece_jointe['name']] = false;
113
			}
114
		}
115
 
116
		// TODO: permettre la création d'observations liées aux images à partir du mail
117
		// et d'une syntaxe simple à définir
118
		return $ids;
119
	}
120
 
121
	/**
122
	 * Appelée en mode client, parse le dossier ou sont stockés les mails
123
	 * extrait les images en pièces jointes, et les ajoute au cel de l'utilisateur
124
	 *
125
	*/
126
	public function parserDossierMail()
127
	{
128
 
129
		$dossier_stockage_temp = $this->config['chemin_stockage_temp'];
130
		$chemin_stockage_image_temp = $dossier_stockage_temp.'/mails/';
131
 
132
		foreach (new DirectoryIterator($chemin_stockage_image_temp) as $fichier_a_stocker) {
133
 
134
			if($fichier_ou_dossier->isDot()) {
135
				continue;
136
			}
137
 
138
			$chemin_fichier = $fichier_a_stocker->getPathname();
139
			$nom_fichier = $fichier_ou_dossier->getFilename();
140
 
767 aurelien 141
			$expediteur_mail = $this->obtenirExpediteurPourNomTemporaireMail($nom_fichier);
619 aurelien 142
			$contenu_mail = file_get_contents($chemin_fichier);
143
 
858 aurelien 144
			$parametres = array('courriel_utilisateur' => $expediteur_mail);
619 aurelien 145
 
767 aurelien 146
			$this->traiterMail($parametres, $contenu_mail);
147
 
148
			unlink($chemin_fichier);
619 aurelien 149
		}
150
	}
151
 
152
	private function extrairePiecesJointes($mail) {
153
 
154
		$pieces_jointes = array();
155
 
156
		$args['include_bodies'] = true;
157
		$args['decode_bodies'] = true;
158
		$args['decode_headers'] = true;
159
		$args['input'] = $mail;
160
 
161
		$dossier_stockage_temp = $this->config['chemin_stockage_temp'];
162
 
163
		$tableau_mail_decode = Mail_mimeDecode::decode($args);
164
 
165
		foreach ($tableau_mail_decode->parts as $partie) {
166
 
167
			if ($partie->ctype_primary == 'image' && $partie->ctype_secondary == 'jpeg') {
168
 
169
				$informations = array();
170
 
171
				$nom_original = $partie->ctype_parameters['name'];
172
				$fichier =  $partie->body;
173
 
174
				$hash = md5(time());
175
 
176
				$chemin_temp = $dossier_stockage_temp.'/images/'.$hash.'.jpg';
177
 
178
				$temp = fopen($chemin_temp,'w+');
179
				fwrite($temp,$fichier);
180
				fclose($temp);
181
				chmod($chemin_temp, 0777);
182
 
183
				$informations = array('tmp_name' => $chemin_temp,'name' => $nom_original,'type' => 'image/jpeg','size' => filesize($chemin_temp));
184
 
185
				$pieces_jointes[] = $informations;
186
			}
187
		}
188
 
189
  		return $pieces_jointes;
190
	}
191
 
192
	private function fabriquerNomTemporaireStockageMail($expediteur) {
193
		return time().'_'.$expediteur;
194
	}
195
 
196
	private function obtenirExpediteurPourNomTemporaireMail($nom_temp) {
197
 
198
		$chaine_separee = explode('_', $nom_temp,1);
199
 
767 aurelien 200
		$nom_expediteur = false;
619 aurelien 201
 
202
		if($chaine_separee && count($chaine_separee) > 1) {
203
			$nom_expediteur = $chaine_separee[1];
204
		}
205
 
206
		return $nom_expediteur;
207
	}
208
}
209
?>