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

Last change on this file since 113361 was 113361, checked in by root, 2 months ago

true manquant

File size: 7.8 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                if (!$corps_cont['texte']) {
95                        // il y a eu un gros probleme, on ne peut rien faire => log et erreur
96                        spip_log("Message vide pour " . $corps['sujet'] . " destinataire : ". var_export($destinataire, true), "mailshot_send" . _LOG_CRITIQUE);
97                        return "erreur lors de la personalisation de la newsletter";
98                }
99                $corps_cont['html'] = recuperer_fond("emails/texte",array('texte'=>$corps_cont['texte'],'sujet'=>$corps_cont['sujet']));
100        }
101        elseif (!$corps_cont['texte']){
102                // tant pis... : pas de bras, pas de chocolat
103        }
104
105        // Mode test ?
106        if ($options['test'])
107                $corps_cont['sujet'] = "["._T('newsletter:info_test_sujet')."] " . $corps_cont['sujet'];
108
109        // TODO : ajouter le tracking (1 image tracker + clic tracking sur les liens)
110
111
112
113        // ---- Envoi proprement dit
114        if (!function_exists('nettoyer_titre_email'))
115                $envoyer_mail = charger_fonction('envoyer_mail','inc'); // pour nettoyer_titre_email()
116
117        $sujet = nettoyer_titre_email($corps_cont['sujet']);
118        $sujet = filtrer_entites($sujet);
119        $sujet = str_replace('&amp;','&', $sujet);
120        $dest_email = $destinataire['email'];
121
122        // mode TEST : forcer l'email
123        if (defined('_TEST_EMAIL_DEST')) {
124                if (!_TEST_EMAIL_DEST)
125                        return _T('mailshot:erreur_envoi_mail_bloque_debug');
126                else {
127                        $dest_email = _TEST_EMAIL_DEST;
128                        // signaler cela comme une erreur, mais on continue quand meme
129                        $erreur = _T('mailshot:erreur_envoi_mail_force_debug',array('email'=>_TEST_EMAIL_DEST));
130                }
131        }
132
133        // On cree l'objet Mailer (PHPMailer) pour le manipuler ensuite
134        if (!$mailer_factory = charger_fonction($config['mailer'],'bulkmailer',true)
135          OR !$mailer = $mailer_factory(
136                        array(
137                                'email' => $dest_email,
138                                'sujet' => $sujet,
139                                'html' => &$corps_cont['html'],
140                                'texte' => &$corps_cont['texte'],
141                        ))){
142
143                $url_config = generer_url_ecrire("configurer_mailshot");
144                spip_log("mailer non configure pour l'envoi de $corps a ".$destinataire['email'],'mailshot_send'._LOG_ERREUR);
145                return _T('mailshot:erreur_aucun_service_configure',array('url'=>$url_config));
146        }
147
148        # Regler le From si fourni dans $corps a l'appel
149        if (isset($corps['from']) and $corps['from']){
150                $from = $corps['from'];
151                if (isset($corps['nom_envoyeur']) and $corps['nom_envoyeur']){
152                        $nom_envoyeur = $corps['nom_envoyeur'];
153                }
154        }
155        // Un from par defaut sinon ?
156        if (empty($from) AND empty($mailer->From)) {
157                $from = $GLOBALS['meta']["email_envoi"];
158                if (empty($from) OR !email_valide($from)) {
159                        spip_log("Meta email_envoi invalide. Le mail sera probablement vu comme spam.","mailshot_send");
160                        $from = $dest_email;
161                }
162        }
163        // "Marie Toto <Marie@toto.com>"
164        if (preg_match(",^([^<>\"]*)<([^<>\"]+)>$,i",$from,$m)){
165                $nom_envoyeur = trim($m[1]);
166                $from = trim($m[2]);
167        }
168        if (!empty($from)){
169                $mailer->From = $from;
170                // la valeur par defaut de la config n'est probablement pas valable pour ce mail,
171                // on l'ecrase pour cet envoi
172                $mailer->FromName = $from;
173        }
174        // On ajoute le nom de l'envoyeur s'il fait partie des options
175        if ($nom_envoyeur)
176                $mailer->FromName = $nom_envoyeur;
177        // Si plusieurs emails dans le from, pas de Name !
178        if (strpos($mailer->From,",")!==false){
179                $mailer->FromName = "";
180        }
181
182        # Regler le cc
183        if (isset($corps['cc']) AND $cc=$corps['cc']){
184                if (is_array($cc)) foreach ($cc as $courriel) $mailer->AddCC($courriel);
185                else $mailer->AddCC($cc);
186        }
187
188        # Regler le bcc
189        if (isset($corps['bcc']) AND $bcc=$corps['bcc']){
190                if (is_array($bcc)) foreach ($bcc as $courriel) $mailer->AddBCC($courriel);
191                else $mailer->AddBCC($bcc);
192        }
193
194        # Regler le Reply-to
195        # TODO : reglage specifique mailshot
196        if (isset($corps['repondre_a']) AND $repondre_a=$corps['repondre_a']){
197                if (is_array($repondre_a)) foreach ($repondre_a as $courriel) $mailer->AddReplyTo($courriel);
198                else $mailer->AddReplyTo($repondre_a);
199        }
200
201        // Si une adresse email a ete specifiee pour les retours en erreur, on l'ajoute
202        if (!empty($corps['adresse_erreur']))
203                $mailer->Sender = $corps['adresse_erreur'];
204
205
206        // On passe dans un pipeline pour modifier tout le facteur avant l'envoi
207        $mailer = pipeline('newsletter_pre_envoi', $mailer);
208
209        // On genere les headers
210        $head = $mailer->CreateHeader();
211
212        // Et c'est parti on envoie enfin
213        spip_log("mail via mailshot\n$head"."Destinataire:".print_r($destinataire['email'],true),'mail');
214        spip_log("mail "."a :".print_r($destinataire['email'],true)."\n".trim($head)."\nHTML Length : ".strlen($corps_cont['html']) . " | Texte Length : " . strlen($corps_cont['texte']),'mailshot_send'._LOG_DEBUG);
215
216        // fixer les options d'envoi si possible (non dispo par Facteur mais par les surcharges)
217        if (isset($mailer->send_options))
218                $mailer->send_options = $options;
219        $retour = $mailer->Send();
220
221        if (!$retour) {
222                spip_log("Erreur Envoi mail ($dest_email) via Facteur : ".print_r($mailer->ErrorInfo,true),'mailshot_send'._LOG_ERREUR);
223                if ($mailer->ErrorInfo) {
224                        return $mailer->ErrorInfo;
225                } else {
226                        return _T("mailshot:erreur_envoi_newsletter");
227                }
228        }
229
230        return $erreur;
231}
232
Note: See TracBrowser for help on using the repository browser.