source: spip-zone/_plugins_/mailshot/trunk/newsletter/send.php @ 112243

Last change on this file since 112243 was 112243, checked in by maieul@…, 3 years ago

en cas d'absence total de réponse du mailer, même pas de message d'erreur, envoyé quand même un message pour dire qu'on a une erreur inconnue

File size: 7.4 KB
Line 
1<?php
2/**
3 * Plugin MailShot
4 * (c) 2012 Cedric Morin
5 * Licence GNU/GPL
6 */
7
8if (!defined('_ECRIRE_INC_VERSION')) return;
9include_spip("inc/config");
10
11/**
12 * Envoi une newsletter a un destinataire
13 *
14 * @param array $destinataire
15 *   description du destinataire
16 *     string email
17 *     string nom
18 *     array listes
19 *     string lang
20 *     string status : on|pending|off
21 *     string url_unsubscribe : url de desabonnement
22 *
23 *
24 * @param array|string $corps
25 *   string id de la newsletter
26 *ou array contenu de la newsletter
27 *     string sujet
28 *     string html
29 *     string texte
30 *     string from : email de l'envoyeur (prioritaire sur argument $from de premier niveau, deprecie)
31 *     string nom_envoyeur : un nom d'envoyeur pour completer l'email from
32 *     string cc : destinataires en copie conforme
33 *     string bcc : destinataires en copie conforme cachee
34 *     string|array repondre_a : une ou plusieurs adresses a qui repondre
35 *
36 * @param array $options
37 *   options d'envoi
38 *     bool test : mode test (ajoute un [TEST] dans le sujet
39 *     string tracking_id
40 *
41 * @return string|int
42 *   vide si ok, ou message d'erreur sinon
43 */
44function newsletter_send_dist($destinataire,$corps,$options=array()){
45        static $config = null;
46        $erreur = "";
47        $options = array_merge(array('test'=>false,'tracking_id'=>''),$options);
48        if (is_null($config)){
49                $config = lire_config("mailshot/");
50                if (!isset($config['mailer'])) $config['mailer'] = 'defaut';
51        }
52
53        if (preg_match(",@example\.org$,i",$destinataire['email'])){
54                return "email invalide (@example.org)";
55        }
56
57        // refuser si pas de reglage specifique d'envoi mailshot et que facteur est configure pour utiliser mail()
58        if ($config['mailer']=='defaut' AND lire_config("facteur_smtp")=='non'){
59                $url_config = generer_url_ecrire("configurer_mailshot");
60                spip_log("mailer non configure pour l'envoi de $corps a ".$destinataire['email'],'mailshot_send'._LOG_ERREUR);
61                return _T('mailshot:erreur_aucun_service_configure',array('url'=>$url_config));
62        }
63
64        if (!is_array($corps)) {
65                $content = charger_fonction("content","newsletter");
66                $corps = $content($corps);
67                if (!$corps OR !is_array($corps)){
68                        return _T('mailshot:erreur_generation_newsletter');
69                }
70                if (isset($corps['from_email'])) {
71                        $corps['from'] = $corps['from_email'];
72                        if (isset($corps['from_name'])) {
73                                $corps['nom_envoyeur'] = $corps['from_name'];
74                        }
75                }
76        }
77        $corps = array_merge(array('html'=>'','texte'=>'','sujet'=>''),$corps);
78
79        if (!$corps['html'] AND !$corps['texte'])
80                return "rien a envoyer !";
81        if (!$corps['sujet'])
82                return "il faut un sujet !";
83
84        $corps_cont = array();
85
86        // proceder au remplacement des variables contextuelles du destinataire
87        $contextualize = charger_fonction("contextualize","newsletter");
88        $corps_cont['sujet'] = $contextualize($corps['sujet'], $destinataire);
89        $corps_cont['html'] = $contextualize($corps['html'], $destinataire);
90        $corps_cont['texte'] = $contextualize($corps['texte'], $destinataire);
91
92        // preparer les messages : generer un texte si manquant ou un html si manquant ?
93        if (!$corps_cont['html']){
94                $corps_cont['html'] = recuperer_fond("emails/texte",array('texte'=>$corps_cont['texte'],'sujet'=>$corps_cont['sujet']));
95        }
96        elseif (!$corps_cont['texte']){
97                // tant pis... : pas de bras, pas de chocolat
98        }
99
100        // Mode test ?
101        if ($options['test'])
102                $corps_cont['sujet'] = "["._T('newsletter:info_test_sujet')."] " . $corps_cont['sujet'];
103
104        // TODO : ajouter le tracking (1 image tracker + clic tracking sur les liens)
105
106
107
108        // ---- Envoi proprement dit
109        if (!function_exists('nettoyer_titre_email'))
110                $envoyer_mail = charger_fonction('envoyer_mail','inc'); // pour nettoyer_titre_email()
111
112        $sujet = nettoyer_titre_email($corps_cont['sujet']);
113        $sujet = filtrer_entites($sujet);
114        $sujet = str_replace('&amp;','&', $sujet);
115        $dest_email = $destinataire['email'];
116
117        // mode TEST : forcer l'email
118        if (defined('_TEST_EMAIL_DEST')) {
119                if (!_TEST_EMAIL_DEST)
120                        return _T('mailshot:erreur_envoi_mail_bloque_debug');
121                else {
122                        $dest_email = _TEST_EMAIL_DEST;
123                        // signaler cela comme une erreur, mais on continue quand meme
124                        $erreur = _T('mailshot:erreur_envoi_mail_force_debug',array('email'=>_TEST_EMAIL_DEST));
125                }
126        }
127
128        // On cree l'objet Mailer (PHPMailer) pour le manipuler ensuite
129        if (!$mailer_factory = charger_fonction($config['mailer'],'bulkmailer',true)
130          OR !$mailer = $mailer_factory(
131                        array(
132                                'email' => $dest_email,
133                                'sujet' => $sujet,
134                                'html' => &$corps_cont['html'],
135                                'texte' => &$corps_cont['texte'],
136                        ))){
137
138                $url_config = generer_url_ecrire("configurer_mailshot");
139                spip_log("mailer non configure pour l'envoi de $corps a ".$destinataire['email'],'mailshot_send'._LOG_ERREUR);
140                return _T('mailshot:erreur_aucun_service_configure',array('url'=>$url_config));
141        }
142
143        # Regler le From si fourni dans $corps a l'appel
144        if (isset($corps['from']) and $corps['from']){
145                $from = $corps['from'];
146                if (isset($corps['nom_envoyeur']) and $corps['nom_envoyeur']){
147                        $nom_envoyeur = $corps['nom_envoyeur'];
148                }
149        }
150        // Un from par defaut sinon ?
151        if (empty($from) AND empty($mailer->From)) {
152                $from = $GLOBALS['meta']["email_envoi"];
153                if (empty($from) OR !email_valide($from)) {
154                        spip_log("Meta email_envoi invalide. Le mail sera probablement vu comme spam.","mailshot_send");
155                        $from = $dest_email;
156                }
157        }
158        // "Marie Toto <Marie@toto.com>"
159        if (preg_match(",^([^<>\"]*)<([^<>\"]+)>$,i",$from,$m)){
160                $nom_envoyeur = trim($m[1]);
161                $from = trim($m[2]);
162        }
163        if (!empty($from)){
164                $mailer->From = $from;
165                // la valeur par defaut de la config n'est probablement pas valable pour ce mail,
166                // on l'ecrase pour cet envoi
167                $mailer->FromName = $from;
168        }
169        // On ajoute le nom de l'envoyeur s'il fait partie des options
170        if ($nom_envoyeur)
171                $mailer->FromName = $nom_envoyeur;
172        // Si plusieurs emails dans le from, pas de Name !
173        if (strpos($mailer->From,",")!==false){
174                $mailer->FromName = "";
175        }
176
177        # Regler le cc
178        if (isset($corps['cc']) AND $cc=$corps['cc']){
179                if (is_array($cc)) foreach ($cc as $courriel) $mailer->AddCC($courriel);
180                else $mailer->AddCC($cc);
181        }
182
183        # Regler le bcc
184        if (isset($corps['bcc']) AND $bcc=$corps['bcc']){
185                if (is_array($bcc)) foreach ($bcc as $courriel) $mailer->AddBCC($courriel);
186                else $mailer->AddBCC($bcc);
187        }
188
189        # Regler le Reply-to
190        # TODO : reglage specifique mailshot
191        if (isset($corps['repondre_a']) AND $repondre_a=$corps['repondre_a']){
192                if (is_array($repondre_a)) foreach ($repondre_a as $courriel) $mailer->AddReplyTo($courriel);
193                else $mailer->AddReplyTo($repondre_a);
194        }
195
196        // Si une adresse email a ete specifiee pour les retours en erreur, on l'ajoute
197        if (!empty($corps['adresse_erreur']))
198                $mailer->Sender = $corps['adresse_erreur'];
199
200
201        // On passe dans un pipeline pour modifier tout le facteur avant l'envoi
202        $mailer = pipeline('newsletter_pre_envoi', $mailer);
203
204        // On genere les headers
205        $head = $mailer->CreateHeader();
206
207        // Et c'est parti on envoie enfin
208        spip_log("mail via mailshot\n$head"."Destinataire:".print_r($destinataire['email'],true),'mail');
209        spip_log("mail "."a :".print_r($destinataire['email'],true)."\n".trim($head),'mailshot_send'._LOG_DEBUG);
210
211        // fixer les options d'envoi si possible (non dispo par Facteur mais par les surcharges)
212        if (isset($mailer->send_options))
213                $mailer->send_options = $options;
214        $retour = $mailer->Send();
215
216        if (!$retour) {
217                spip_log("Erreur Envoi mail ($dest_email) via Facteur : ".print_r($mailer->ErrorInfo,true),'mailshot_send'._LOG_ERREUR);
218                if ($mailer->ErrorInfo) {
219                        return $mailer->ErrorInfo;
220                } else {
221                        return _T("mailshot:erreur_envoi_newsletter");
222                }
223        }
224
225        return $erreur;
226}
227
Note: See TracBrowser for help on using the repository browser.