Subversion Repositories eFlore/Applications.cel

Rev

Rev 619 | Rev 858 | Go to most recent revision | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

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