source: spip-zone/_plugins_/formidable/trunk/traiter/email.php @ 58926

Last change on this file since 58926 was 58926, checked in by cedric@…, 8 years ago

Gestion des from sur les emails envoyés post saisie : il faut garder le from par defaut de SPIP car sinon on ne peut pas utiliser les SMTP un peu sécurisés, et de plus un mail avec même dest et from a toutes les chances de se faire arrêter par les antispams...

File size: 6.6 KB
Line 
1<?php
2
3// Sécurité
4if (!defined("_ECRIRE_INC_VERSION")) return;
5
6function traiter_email_dist($args, $retours){
7        $formulaire = $args['formulaire'];
8        $options = $args['options'];
9        $saisies = unserialize($formulaire['saisies']);
10        $traitements = unserialize($formulaire['traitements']);
11        $champs = saisies_lister_champs($saisies);
12       
13        // On récupère les destinataires
14        if ($options['champ_destinataires']){
15                $destinataires = _request($options['champ_destinataires']);
16                if (!is_array($destinataires) and intval($destinataires)){
17                        $destinataires = array($destinataires);
18                }
19                if (is_array($destinataires)){
20                        // On récupère les mails des destinataires
21                        $destinataires = array_map('intval', $destinataires);
22                        $destinataires = sql_allfetsel(
23                                'email',
24                                'spip_auteurs',
25                                sql_in('id_auteur', $destinataires)
26                        );
27                        $destinataires = array_map('reset', $destinataires);
28                }
29        }
30        if (!$destinataires)
31                $destinataires = array();
32       
33        // On ajoute les destinataires en plus
34        if ($options['destinataires_plus']){
35                $destinataires_plus = explode(',', $options['destinataires_plus']);
36                $destinataires_plus = array_map('trim', $destinataires_plus);
37                $destinataires = array_merge($destinataires, $destinataires_plus);
38                $destinataires = array_unique($destinataires);
39        }
40       
41        // On récupère le courriel de l'envoyeur s'il existe
42        if ($options['champ_courriel']){
43                $courriel_envoyeur = _request($options['champ_courriel']);
44        }
45        if (!$courriel_envoyeur) $courriel_envoyeur = '';
46       
47        // Si on a bien des destinataires, on peut continuer
48        if ($destinataires or ($courriel_envoyeur and $options['activer_accuse'])){
49                include_spip('inc/filtres');
50                include_spip('inc/texte');
51               
52                $nom_site_spip = supprimer_tags(typo($GLOBALS['meta']['nom_site']));
53               
54                // On parcourt les champs pour générer le tableau des valeurs
55                $valeurs = array();
56                foreach ($champs as $champ){
57                        $valeurs[$champ] = _request($champ);
58                }
59               
60                // On récupère le nom de l'envoyeur
61                if ($options['champ_nom']){
62                        $a_remplacer = array();
63                        if (preg_match_all('/@[\w]+@/', $options['champ_nom'], $a_remplacer)){
64                                $a_remplacer = $a_remplacer[0];
65                                foreach ($a_remplacer as $cle=>$val) $a_remplacer[$cle] = trim($val, '@');
66                                $a_remplacer = array_flip($a_remplacer);
67                                $a_remplacer = array_intersect_key($valeurs, $a_remplacer);
68                                $a_remplacer = array_merge($a_remplacer, array('nom_site_spip' => $nom_site_spip));
69                        }
70                        $nom_envoyeur = trim(_L($options['champ_nom'], $a_remplacer));
71                }
72                if (!$nom_envoyeur) $nom_envoyeur = $GLOBALS['meta']['nom_site'];
73               
74                // On récupère le sujet s'il existe sinon on le construit
75                if ($options['champ_sujet']){
76                        $a_remplacer = array();
77                        if (preg_match_all('/@[\w]+@/', $options['champ_sujet'], $a_remplacer)){
78                                $a_remplacer = $a_remplacer[0];
79                                foreach ($a_remplacer as $cle=>$val) $a_remplacer[$cle] = trim($val, '@');
80                                $a_remplacer = array_flip($a_remplacer);
81                                $a_remplacer = array_intersect_key($valeurs, $a_remplacer);
82                                $a_remplacer = array_merge($a_remplacer, array('nom_site_spip' => $nom_site_spip));
83                        }
84                        $sujet = trim(_L($options['champ_sujet'], $a_remplacer));
85                }
86                if (!$sujet) $sujet = _T('formidable:traiter_email_sujet', array('nom'=>$nom_envoyeur));
87                $sujet = filtrer_entites($sujet);
88               
89                // Mais quel va donc être le fond ?
90                if (find_in_path('notifications/formulaire_'.$formulaire['identifiant'].'_email.html'))
91                        $notification = 'notifications/formulaire_'.$formulaire['identifiant'].'_email';
92                else
93                        $notification = 'notifications/formulaire_email';
94               
95                // On génère le mail avec le fond
96                $html = recuperer_fond(
97                        $notification,
98                        array(
99                                'id_formulaire' => $formulaire['id_formulaire'],
100                                'titre' => _T_ou_typo($formulaire['titre']),
101                                'traitements' => $traitements,
102                                'saisies' => $saisies,
103                                'valeurs' => $valeurs
104                        )
105                );
106               
107                // On génère le texte brut
108                include_spip('classes/facteur');
109                $texte = Facteur::html2text($html);
110               
111                // On utilise la forme avancé de Facteur
112                $corps = array(
113                        'html' => $html,
114                        'texte' => $texte,
115                        'nom_envoyeur' => $nom_envoyeur
116                );
117                // on mets le couriel de l'envoyeur dans Reply-To et on laisse
118                // le from par defaut de Facteur car sinon ca bloque sur les SMTP un peu restrictifs
119                if ($courriel_envoyeur){
120                        $corps['repondre_a'] = $courriel_envoyeur;
121                }
122               
123                // On envoie enfin le message
124                $envoyer_mail = charger_fonction('envoyer_mail','inc');
125               
126                // On envoie aux destinataires
127                if ($destinataires)
128                        $ok = $envoyer_mail($destinataires, $sujet, $corps, "", "X-Originating-IP: ".$GLOBALS['ip']);
129               
130                // Si c'est bon, on envoie l'accusé de réception
131                if ($ok and $courriel_envoyeur and $options['activer_accuse']){
132                        // On récupère le sujet s'il existe sinon on le construit
133                        if ($options['sujet_accuse']){
134                                $a_remplacer = array();
135                                if (preg_match_all('/@[\w]+@/', $options['sujet_accuse'], $a_remplacer)){
136                                        $a_remplacer = $a_remplacer[0];
137                                        foreach ($a_remplacer as $cle=>$val) $a_remplacer[$cle] = trim($val, '@');
138                                        $a_remplacer = array_flip($a_remplacer);
139                                        $a_remplacer = array_intersect_key($valeurs, $a_remplacer);
140                                        $a_remplacer = array_merge($a_remplacer, array('nom_site_spip' => $nom_site_spip));
141                                }
142                                $sujet_accuse = trim(_L($options['sujet_accuse'], $a_remplacer));
143                        }
144                        if (!$sujet_accuse) $sujet_accuse = _T('formidable:traiter_email_sujet_accuse');
145                        $sujet_accuse = filtrer_entites($sujet_accuse);
146                       
147                        // Mais quel va donc être le fond ?
148                        if (find_in_path('notifications/formulaire_'.$formulaire['identifiant'].'_accuse.html'))
149                                $accuse = 'notifications/formulaire_'.$formulaire['identifiant'].'_accuse';
150                        else
151                                $accuse = 'notifications/formulaire_accuse';
152                               
153                        // On génère l'accusé de réception
154                        $html_accuse = recuperer_fond(
155                                $accuse,
156                                array(
157                                        'id_formulaire' => $formulaire['id_formulaire'],
158                                        'titre' => _T_ou_typo($formulaire['titre']),
159                                        'message_retour' => $formulaire['message_retour'],
160                                        'traitements' => $traitements,
161                                        'saisies' => $saisies,
162                                        'valeurs' => $valeurs
163                                )
164                        );
165                       
166                        // On génère le texte brut
167                        $texte = Facteur::html2text($html_accuse);
168                       
169                        $corps = array(
170                                'html' => $html_accuse,
171                                'texte' => $texte,
172                                'nom_envoyeur' => $nom_site_spip
173                        );
174
175                        // Ne pas mettre from=$courriel_envoyeur car ça declenche facilement les antispams
176                        // garder le from par defaut de facteur (ou celui du site)
177                        $ok = $envoyer_mail($courriel_envoyeur, $sujet_accuse, $corps, "", "X-Originating-IP: ".$GLOBALS['ip']);
178                }
179               
180                if ($ok){
181                        $retours['message_ok'] .= "\n<br/>"._T('formidable:traiter_email_message_ok');
182                }
183                else{
184                        $retours['message_erreur'] .= "\n<br/>"._T('formidable:traiter_email_message_erreur');
185                }
186        }
187       
188        return $retours;
189}
190
191?>
Note: See TracBrowser for help on using the repository browser.