[PLUGINS] ~maj globale
[lhc/web/www.git] / www / plugins / formidable / traiter / email.php
1 <?php
2
3 // Sécurité
4 if (!defined('_ECRIRE_INC_VERSION')) {
5 return;
6 }
7
8 function traiter_email_dist($args, $retours) {
9 $formulaire = $args['formulaire'];
10 $options = $args['options'];
11 $saisies = unserialize($formulaire['saisies']);
12 $traitements = unserialize($formulaire['traitements']);
13 $champs = saisies_lister_champs($saisies);
14
15 // On récupère les destinataires
16 if ($options['champ_destinataires']) {
17 $destinataires = _request($options['champ_destinataires']);
18 if (!is_array($destinataires) and intval($destinataires)) {
19 $destinataires = array($destinataires);
20 }
21 if (is_array($destinataires)) {
22 // On récupère les mails des destinataires
23 $destinataires = array_map('intval', $destinataires);
24 $destinataires = sql_allfetsel(
25 'email',
26 'spip_auteurs',
27 sql_in('id_auteur', $destinataires)
28 );
29 $destinataires = array_map('reset', $destinataires);
30 }
31 }
32 if (!$destinataires) {
33 $destinataires = array();
34 }
35 if ($options['champ_courriel_destinataire_form']) {
36 $courriel_champ_form = _request($options['champ_courriel_destinataire_form']);
37 $destinataires[] = $courriel_champ_form;
38 }
39
40
41 // On ajoute les destinataires en plus
42 if ($options['destinataires_plus']) {
43 $destinataires_plus = explode(',', $options['destinataires_plus']);
44 $destinataires_plus = array_map('trim', $destinataires_plus);
45 $destinataires = array_merge($destinataires, $destinataires_plus);
46 $destinataires = array_unique($destinataires);
47 }
48
49 // On récupère le courriel de l'envoyeur s'il existe
50 if ($options['champ_courriel']) {
51 $courriel_envoyeur = _request($options['champ_courriel']);
52 }
53 if (!$courriel_envoyeur) {
54 $courriel_envoyeur = '';
55 }
56
57 // Si on a bien des destinataires, on peut continuer
58 if ($destinataires or ($courriel_envoyeur and $options['activer_accuse'])) {
59 include_spip('inc/filtres');
60 include_spip('inc/texte');
61
62 $nom_site_spip = supprimer_tags(typo($GLOBALS['meta']['nom_site']));
63
64 // On parcourt les champs pour générer le tableau des valeurs
65 $valeurs = array();
66 foreach ($champs as $champ) {
67 $valeurs[$champ] = _request($champ);
68 }
69
70 // On récupère le nom de l'envoyeur
71 if ($options['champ_nom']) {
72 $a_remplacer = array();
73 if (preg_match_all('/@[\w]+@/', $options['champ_nom'], $a_remplacer)) {
74 $a_remplacer = $a_remplacer[0];
75 foreach ($a_remplacer as $cle => $val) {
76 $a_remplacer[$cle] = trim($val, '@');
77 }
78 $a_remplacer = array_flip($a_remplacer);
79 $a_remplacer = array_intersect_key($valeurs, $a_remplacer);
80 $a_remplacer = array_merge($a_remplacer, array('nom_site_spip' => $nom_site_spip));
81 }
82 $nom_envoyeur = trim(_L($options['champ_nom'], $a_remplacer));
83 }
84 if (!$nom_envoyeur) {
85 $nom_envoyeur = $nom_site_spip;
86 }
87
88 // On récupère le sujet s'il existe sinon on le construit
89 if ($options['champ_sujet']) {
90 $a_remplacer = array();
91 if (preg_match_all('/@[\w]+@/', $options['champ_sujet'], $a_remplacer)) {
92 $a_remplacer = $a_remplacer[0];
93 foreach ($a_remplacer as $cle => $val) {
94 $a_remplacer[$cle] = trim($val, '@');
95 }
96 $a_remplacer = array_flip($a_remplacer);
97 $a_remplacer = array_intersect_key($valeurs, $a_remplacer);
98 $a_remplacer = array_merge($a_remplacer, array('nom_site_spip' => $nom_site_spip));
99 }
100 $sujet = trim(_L($options['champ_sujet'], $a_remplacer));
101 }
102 if (!$sujet) {
103 $sujet = _T('formidable:traiter_email_sujet', array('nom'=>$nom_envoyeur));
104 }
105 $sujet = filtrer_entites($sujet);
106
107 // Mais quel va donc être le fond ?
108 if (find_in_path('notifications/formulaire_'.$formulaire['identifiant'].'_email.html')) {
109 $notification = 'notifications/formulaire_'.$formulaire['identifiant'].'_email';
110 } else {
111 $notification = 'notifications/formulaire_email';
112 }
113
114 // On génère le mail avec le fond
115 $html = recuperer_fond(
116 $notification,
117 array(
118 'id_formulaire' => $args['id_formulaire'],
119 'titre' => _T_ou_typo($formulaire['titre']),
120 'traitements' => $traitements,
121 'saisies' => $saisies,
122 'valeurs' => $valeurs
123 )
124 );
125
126 // On génère le texte brut
127 include_spip('facteur_fonctions');
128 $texte = facteur_mail_html2text($html);
129
130 // On utilise la forme avancé de Facteur
131 $corps = array(
132 'html' => $html,
133 'texte' => $texte,
134 'nom_envoyeur' => filtrer_entites($nom_envoyeur),
135 );
136 // Si l'utilisateur n'a pas indiqué autrement, on met le courriel de l'envoyeur dans
137 // Reply-To et on laisse le from par defaut de Facteur car sinon ca bloque sur les
138 // SMTP un peu restrictifs.
139 $courriel_from = '';
140 if ($courriel_envoyeur && $options['activer_vrai_envoyeur']) {
141 $courriel_from = $courriel_envoyeur;
142 } else if ($courriel_envoyeur) {
143 $corps['repondre_a'] = $courriel_envoyeur;
144 }
145
146 // On envoie enfin le message
147 $envoyer_mail = charger_fonction('envoyer_mail', 'inc');
148
149 // On envoie aux destinataires
150 if ($destinataires) {
151 $ok = $envoyer_mail($destinataires, $sujet, $corps, $courriel_from, 'X-Originating-IP: '.$GLOBALS['ip']);
152 }
153
154 // Si c'est bon, on envoie l'accusé de réception
155 if ($ok and $courriel_envoyeur and $options['activer_accuse']) {
156 // On récupère le sujet s'il existe sinon on le construit
157 if ($options['sujet_accuse']) {
158 $a_remplacer = array();
159 if (preg_match_all('/@[\w]+@/', $options['sujet_accuse'], $a_remplacer)) {
160 $a_remplacer = $a_remplacer[0];
161 foreach ($a_remplacer as $cle => $val) {
162 $a_remplacer[$cle] = trim($val, '@');
163 }
164 $a_remplacer = array_flip($a_remplacer);
165 $a_remplacer = array_intersect_key($valeurs, $a_remplacer);
166 $a_remplacer = array_merge($a_remplacer, array('nom_site_spip' => $nom_site_spip));
167 }
168 $sujet_accuse = trim(_L($options['sujet_accuse'], $a_remplacer));
169 }
170 if (!$sujet_accuse) {
171 $sujet_accuse = _T('formidable:traiter_email_sujet_accuse');
172 }
173 $sujet_accuse = filtrer_entites($sujet_accuse);
174
175 // Si un nom d'expéditeur est précisé pour l'AR, on l'utilise, sinon on utilise le nomde l'envoyeur du courriel principal
176 $nom_envoyeur_accuse = trim($options['nom_envoyeur_accuse']);
177 if (!$nom_envoyeur_accuse) {
178 $nom_envoyeur_accuse = $nom_envoyeur;
179 }
180
181 //A fortiori, si un courriel d'expéditeur est précisé pour l'AR, on l'utilise
182 if ($options['courriel_envoyeur_accuse']) {
183 $courriel_envoyeur_accuse = $options['courriel_envoyeur_accuse'];
184 } else {
185 $courriel_envoyeur_accuse = $courriel_envoyeur;
186 }
187
188 //Et on teste si on doit mettre cela en from ou en reply-to
189 if ($options['activer_vrai_envoyeur'] and $courriel_envoyeur_accuse) {
190 $courriel_from_accuse = $courriel_envoyeur_accuse;
191 } elseif ($courriel_envoyeur_accuse) {
192 $corps['repondre_a'] = $courriel_envoyeur_accuse;
193 $courriel_from_accuse = '';
194 }
195
196 // Mais quel va donc être le fond ?
197 if (find_in_path('notifications/formulaire_'.$formulaire['identifiant'].'_accuse.html')) {
198 $accuse = 'notifications/formulaire_'.$formulaire['identifiant'].'_accuse';
199 } else {
200 $accuse = 'notifications/formulaire_accuse';
201 }
202
203 // On génère l'accusé de réception
204 $html_accuse = recuperer_fond(
205 $accuse,
206 array(
207 'id_formulaire' => $formulaire['id_formulaire'],
208 'titre' => _T_ou_typo($formulaire['titre']),
209 'message_retour' => $formulaire['message_retour'],
210 'traitements' => $traitements,
211 'saisies' => $saisies,
212 'valeurs' => $valeurs
213 )
214 );
215
216 // On génère le texte brut
217 $texte = facteur_mail_html2text($html_accuse);
218
219 $corps = array(
220 'html' => $html_accuse,
221 'texte' => $texte,
222 'nom_envoyeur' => filtrer_entites($nom_envoyeur_accuse),
223 );
224
225 $ok = $envoyer_mail($courriel_envoyeur, $sujet_accuse, $corps, $courriel_from_accuse, 'X-Originating-IP: '.$GLOBALS['ip']);
226 }
227
228 if ($ok) {
229 $retours['message_ok'] .= "\n"._T('formidable:traiter_email_message_ok');
230 } else {
231 $retours['message_erreur'] .= "\n"._T('formidable:traiter_email_message_erreur');
232 }
233 }
234
235 // noter qu'on a deja fait le boulot, pour ne pas risquer double appel
236 $retours['traitements']['email'] = true;
237 return $retours;
238 }