Facteur

Un plugin pour regrouper toutes les fonctions avancées autour de l’envoi de courriels.

Introduction

SPIP propose une fonction générique envoyer_mail() pour envoyer un courriel. Elle est assez simple d’utilisation mais peut paraître limitée lorsqu’on veut configurer des options plus complexes : envoi par SMTP, ajout de pièces jointes, etc.

Le plugin Facteur propose d’intégrer proprement à SPIP la librairie PHPMailer. Pour que les fonctionnalités soient immédiatement disponibles, Facteur surcharge de manière compatible la fonction envoyer_mail().

Installation

Facteur (1.8.11)

Placer le contenu du paquet ZIP dans votre dossier plugins/ et activer Facteur dans l’interface d’administration des plugins.

Vous pouvez configurer les options d’envoi (SMTP notamment) en cliquant sur Configuration, puis sur Facteur.

Appel de la fonction

// Chargement de la fonction
$envoyer_mail = charger_fonction('envoyer_mail', 'inc/');
// Utilisation
$ok = $envoyer_mail(...);

Utilisation

Voici d’abord la fonction standard de SPIP :

  1. function inc_envoyer_mail($destinataire, $sujet, $texte, $from = "", $headers = ""){}
  • $destinataire : adresse de courriel du destinataire
  • $sujet : sujet du courriel
  • $texte : texte brut du message
  • $from : adresse de courriel de l’envoyeur
  • $headers : ajout d’entêtes supplémentaires au message

Avec le plugin Facteur, vous pouvez déjà utiliser cette fonction de la même façon. Ce qui signifie que le plugin ne casse pas l’existant si votre code l’utilisait déjà.

Voilà comment est déclarée la fonction dans Facteur et ce qui change :

  1. function inc_envoyer_mail($destinataire, $sujet, $corps, $from = "", $headers = ""){}
  • $destinataire : peut être le destinataire ou bien un tableau où chaque ligne contient un destinataire
  • $corps : peut être le texte brut ou bien un tableau associatif contenant toutes les options de message

Description des options

Le tableau $corps des options se présente comme suit :

$corps = array(
	'options' => 'valeur'
);

Et voici les options possibles :

  • html : le corps du message en version HTML
  • texte : le corps du message en version texte brut
  • nom_envoyeur : le nom de l’expéditeur
  • cc : une ou des adresses de courriel à mettre en copie, soit une adresse en chaine de caractère, soit plusieurs adresses dans un tableau
  • bcc : la même chose mais en copie cachée
  • repondre_a : l’email à qui les réponses seront adressées, très utile dans le cas d’une utilisation d’un SMTP externe, qui va forcer l’envoi par un nom de domaine bien précis, dans ce cas, l’expéditeur est ce nom de domaine, et le « repondre_a » devient l’email de la personne qui devra recevoir la réponse (d’un help desk par exemple)
  • pieces_jointes : un tableau décrivant les pièces jointes, chaque élément est lui-même un tableau associatif décrivant une pièce jointe comme ça :
    • chemin : le chemin complet du fichier (chemin sur le file system, pas une URL)
    • nom : le nom du fichier
    • encodage : comment sera encodé le fichier, par exemple « base64 »
    • mime : le type MIME du fichier

Exemple :

$corps = array(
   ’html’ => $message,
   'cc' => array('truc@truc', 'bidule@bidule'),
   ’pieces_jointes’ => array(
           array(’chemin’ => $chemin_absolu,
           ’nom’ => ’azerty’,
           ’encodage’ => ’base64’,
           ’mime’ => ’image/jpeg’)
           )
    );

Exemples d’usages

-  On pourra par exemple utiliser un squelette existant pour générer le message HTML :

  1. $html = recuperer_fond("inclure/mail", array('id_article' => $id_article));

-  Inversement, on pourra générer la version texte du message à partir de sa version HTML en utilisant la méthode html2text de la classe Facteur :

include_spip('classes/facteur');
$texte = Facteur::html2text($html);

-  Enfin, on pourra rassembler ces éléments dans le tableau avant de les envoyer :

$corps = array( 
    'html' => $html, 
    'texte' => $texte, 
    'nom_envoyeur' => $nom_envoyeur 
     );

Activer le mode débug

Si l’envoi des envois échoue, vous pouvez activer le mode débug
Ajouter dans votre fichier config/mes_options.php

define('_LOG_FILTRE_GRAVITE', 8);
define('_FACTEUR_DEBUG_SMTP',4); // 0,1,2,3,4  est la valeur la plus verbeuse

Dernière modification de cette page le 13 février 2019

Discussion

120 discussions

  • 15

    Bonjour,

    Avec la version 3.3.2

    message d’erreur ligne 395 dans classes/facteur.php

    L’erreur disparaît en enlevant la ligne

    public function Send()
    return $this->callWrapper(« parent::Send »,func_get_args()) ;

    SPIP 3.1.0 envoi avec fonction mail php (et non smtp)

    • Euh c’est la fonction d’envoi principale hein, si tu l’enlèves ça risque pas de marcher très fort.

    • Bizarre bizarre,

      Les tests de mail accentués refonctionnent sur les deux sites concernés.
      J’ai reçu aussi des alertes de modération de forum.

    • Idem, j’ai un site où le facteur fonctionnait et la mise à jour de la gestion des erreurs de la version 3.3.2 lève
      Fatal error: func_get_args(): Can't be used as a function parameter in /var/www/***/html/plugins/auto/facteur/v3.3.2/classes/facteur.php on line 396

    • Ok je viens de trouver ça :
      http://phpsadness.com/sad/25

      Ces modifs font qu’il faut au moins PHP 5.3 pour utiliser func_get_args() comme argument d’une autre fonction.

      Donc c’est à cause d’une version de PHP trop basse.

      Pour info, même PHP 5.3 et 5.4 sont officiellement obsolètes et n’ont même plus de patchs de sécurités. Donc il est très important de mettre à jour. Cf :
      http://php.net/supported-versions.php

    • Mais un correctif arrive quand même pour les anciennes versions de PHP. :)

    • Encore un petit soucis, sur la 3.3.3

      Warning: call_user_func_array() [function.call-user-func-array]: First argument is expected to be a valid callback, 'parent::AddAttachment' was given in /var/www/xxx/html/plugins/auto/facteur/v3.3.3/classes/facteur.php on line 376
      
      Warning: call_user_func_array() [function.call-user-func-array]: First argument is expected to be a valid callback, 'parent::Send' was given in /var/www/xxx/html/plugins/auto/facteur/v3.3.3/classes/facteur.php on line 376
    • @erational : http://php.net/manual/en/function.call-user-func-array.php

      Je cite :

      5.3.0 The interpretation of object oriented keywords like parent and self has changed. Previously, calling them using the double colon syntax would emit an E_STRICT warning because they were interpreted as static.

      Donc là encore, c’est seulement à partir de 5.3 que ça ne fait plus ce Warning.

    • J’ai aussi le même problème (Warning : call_user_func_array() [function.call-user-func-array] : First argument is expected to be a valid callback, ’parent::Send’ was given in /var/www/vhosts/xxxx.xx/httpdocs/plugins/auto/facteur/v3.3.3/classes/facteur.php on line 376) avec facteur v3.3.3 Rév. 95619... PHP Version 5.2.17

    • Bah même problème, même réponse. Cet appel de fonction se fait sans erreur à partir de 5.3, cf la citation précédente.

    • Ok, merci. Ma question est donc : Est-ce qu’un correctif va sortir prochainement ou dois-je demander à mon FAI de mettre à jour sa version de PHP ? :-)

    • Pour le correctif précédent (cf plus haut dans le même fil) c’était facile. Pour celui là, je n’en ai pas l’impression. Donc je ne sais pas encore, ptet ben oui ptet ben non. :)

      Dans tous les cas, c’est vraiment beaucoup mieux de ne pas rester en 5.2 sachant que c’est une version totalement obsolète qui n’a donc même plus de patchs de sécurité.

    • Bonjour RastaPopoulos,

      Merci pour le suivi. Je viens d’envoyer une demande au FAI pour mettre à jour la version de PHP sur le serveur mutualisé. On verra leur réponse. En attendant, si je downgrade le plugin facteur, est-ce que cela fonctionnera comme avant ? Ou je dois m’attendre à voir apparaître des erreurs sur d’autres plugins comme mailshot, mailsuscriber,... ?

      En passant, j’ai un soucis sur le site de contrib.spip.net... lorsque je veux me connecter suite au clic sur le lien ’répondre à ce message’, la modalbox s’ouvre mais le formulaire de connexion ne s’affiche pas. Par contre si je me connecte via le bouton ’se connecter’ sur l’en-tête de page, pas de soucis... Je ne sais pas où faire remonter le problème ??...

      Bonne journée

    • Tu dois pouvoir reculer, c’était des modifs pour entourer les appels à PHPMailer et attraper les erreurs éventuelles.

      Pour contrib, c’est géré sur la liste spip-zone.

    • Pour info, le sujet sur spip-zone : http://thread.gmane.org/gmane.comp.web.spip.zone/40286
      Cédric apporte une solution qui semble fonctionner.

    Répondre à ce message

  • 1

    Bonjour,
    Un problème que je n’avais pas rencontré, alors que j’utilise Facteur sur d’autres sites, mais c’est la première fois sur l’hébergeur lautre.net.
    Configuration SMTP de lautre.net correcte (1) car le SMTP est opérationnel en messagerie et dans le webmail, donc a priori ça ne vient pas de là.
    Le simple envoi « Tester la configuration », qui n’envoie donc qu’un seul mail (on n’est donc pas dans le cas cité dans ce forum d’un envoi en nombre) ça ne part pas, avec le message : Erreur Envoi mail via Facteur : SMTP connect() failed.
    Je ne sais pas où chercher. Merci.

    (1) Note aux lecteurs : on n’a accès au SMTP uniquement après adhésion, pas pendant l’offre d’essai.

    • Pareil pour moi avec la combinaison SPIP 3.0.21 + Facteur 3.1.3 (issu de facteur-3.0.zip !?)
      Cela ne marche déjà pas depuis mon ordi (Mac + MAMP)

      Avec SMTPDebug = 3 j’obtiens :

      2016-01-11 18:16:15 ::1 (pid 4644) :Pri:ERREUR : Erreur Facteur->Send : 2016-01-11 17:16:14 Connection : opening to ssl ://smtp.gmail.com:587, timeout=300, options=array (
      )
      2016-01-11 17:16:15 SMTP ERROR : Failed to connect to server : (0)
      2016-01-11 17:16:15 SMTP connect() failed. https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting

      2016-01-11 18:16:15 ::1 (pid 4644) :Pri:ERREUR : Erreur Envoi mail via Facteur : SMTP connect() failed. https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting

    Répondre à ce message

  • Bonjour,

    j’ai le message ci-dessous sur la page privé (adminstrateur) :

    Le plugin facteur semble rencontrer actuellement des problèmes d’envoi ou de réception d’emails.

    Que faire ?

    Répondre à ce message

  • 2
    Jaseur Boreal

    Suite du message : http://contrib.spip.net/Facteur#forum476284

    Bonjour,

    Des trucs bizarres sur un SPIP 3.017 chez OVH avec FACTEUR, correctement configuré.
    avec Hote = ssl0.ovh.net et port = 465, etc ...

    « SMTP Error : Could not authenticate. »

    Les courriels, infolettres de tests partent une fois sur deux, sans arriver à détecter le pourquoi du comment.
    Une constatation simple : quand on refait le test après un paquet de minutes écoulées, c’est bon, le courriel-test part correctement.
    Y aurait-il un « délai » à régler quelque part ?
    Cela fonctionnait avant je ne sais plus quelle mises à jour ... mais depuis 3 mois je n’avais pas testé.

    Une solution ?
    Merci

    • C’est peut-être OVH qui bloque de son côté l’envoi de plusieurs emails d’affilés, je ne sais pas… En tout cas pour l’envoi de mail en masse, il est plus conseillé d’utiliser un prestataire d’envoi dédié (et garder un SMTP normal uniquement pour les emails unitaires, genre notif aux admins par ci par là).

    • Je constate aussi le problème avec OVH qui parfois renvoie des problèmes de connection sur SMTP assez aléatoires.

      La solution la plus pérenne est de changer de fournisseur SMTP, par exemple, en se branchant sur un serveur d’envoi SMTP Mandrill.

    Répondre à ce message

  • 1

    Bonjour,

    J’utilise spip 3.0.17 et facteur 3.0.13 et je n’arrive pas à envoyer de mail html utilisant le gabarit texte.html. De ce que j’ai compris, celui ci est sensé être utilisé automatiquement quand on a un texte ou du html simple.

    le mail part bien mais le html s’affiche dans le mail. Au lieu d’avoir un retour a la ligne, par exemple, j’ai la balise br qui s’affiche. Quand je regarde le source du message, je vois que <br/> a été remplacé par &lt;br/>. J’ai déjà constaté ce problème en utilisant un filtre perso mais je ne sais pas d’ou cela provient. J’ai désactivé tous les plugins, toujours le même résultat. le code de mon formulaire donne a peu près ça :

    $msghtml = "<body>".
                    _T('form_forum_message_auto')."<br/><br/>"
                    . _T('form_forum_bonjour', array('nom'=>$nom))."<br/><br/>"
                    . _T($msg, array('nom_site_spip' => $nom_site_spip,
                            'adresse_site' => $adresse_site . '/',
                            'adresse_login' => $adresse_login)) . "<br/><br/>- "
                    . _T('form_forum_login')." " . $desc['login'] . "<br/>- "
                    . _T('form_forum_pass'). " " . $desc['pass'] . "<br/><br/>"
                    . _T('confirmerinscript')." <a href=\"".$adresse_site."/spip.php?page=activation&id=".$desc['codeactivation']."\">"._T('celien')."</a><br/><br/>"
                    . _T('pied_inscription').
                    "</body>";
    
            $msgtext = Facteur::html2text($msghtml);
    
            $envoyer_mail = charger_fonction('envoyer_mail','inc');
            if (!$envoyer_mail($mail_complet, $sujet, $msghtml, $from, $head))
                    return _T('form_forum_probleme_mail');

    Dans certains cas, j’obtiens ce genre de msg d’erreur. On peut y voir le même problème de remplacement du premier caractère des balises :

    Oct 07 00:55:55 127.0.0.1 (pid 7041) :Pub:ERREUR: mail via facteur
    Date: Tue, 7 Oct 2014 00:55:55 +0200
    Return-Path: contact@monsite.com
    From: "contact@monsite.com" &lt;contact@monsite.com>
    Message-ID: &lt;afe8f93f09ffb263cbc8ae605664890a@localhost>
    X-Priority: 3
    X-Mailer: PHPMailer 5.1 (phpmailer.sourceforge.net)
    MIME-Version: 1.0
    Destinataire:Array
    (
        [0] => test@monsite.com
    )

    Si qq1 a une idée svp, je suis preneur

    • Ben oui, ça n’existe pas ce que tu fais. Le troisième paramètre c’est SOIT le texte brut (directement une chaîne comme tu le fais là, mais DONC c’est le texte tel quel), SOIT un tableau associatif, avec plein d’options possibles, contenant la version html, la version texte, etc, etc.

      Cf la description des options. Ya tout, là, juste au-dessus. :)

    Répondre à ce message

  • 1
    Ploufplouf

    Bonjour,
    Je suis sur un spip 3.0.19 avec formidable et facteur 3.1.1 (mis à jour tous les plugins), mon site est hébergé chez OVH, mon smtp est sur laposte.net, port 465, codage SSL.
    Mes formulaires fonctionnaient très bien et en début d’année j’ai eu un retour sur une erreur d’envoi du mail. En effet les mails ne partent plus mais les données sont bien enregistrées dans la BDD.
    J’ai donc vérifier tous les plugins et chargés les dernières versions, vérifier mes données de configuration de Facteur mais rien à faire...

    Avez-vous une idée SVP ?

    Merci par avance

    • Il faut déjà voir s’il y a des erreurs dans les logs (tmp/logs), par exemple des erreurs d’authentification au SMTP. Peut-être que ça a changé côté Poste.

    Répondre à ce message

  • Problème dû à Facteur ? Je n’en sais rien donc je demande...
    Je suis en SPIP 3.0.19, Sarka-SPIP 3.2.36
    Les messages partent, les accusés de réception aussi, et tout ce beau monde arrive bien. Il reste que le contenu des messages est illisible à l’arrivée dans l’interface privée uniquement. Voir copie d’écran jointe.
    Merci d’avance ! :-/

    Répondre à ce message

  • 1

    Bonjour,

    Depuis la mise en jour 3.1.0, le plugin n’enregistre plus les informations d’authentification du serveur SMTP (le nom est bien conservé, mais pas le mot de passe ni le champ sécurité sans-SSL-TSL).

    Les tentatives de vider les caches ou de nettoyer la base sqlite (la base spip_meta:facteur_xxxx) n’ont rien donné.

    Un retour sur une version antérieure est la seule solution qui fonctionne.

    Merci par avance.

    Répondre à ce message

  • 4

    Bonjour,

    En lien avec un problème posté à http://contrib.spip.net/Mailsubscribers#forum476276

    Facteur (3.0.13) ne peut m’envoyer des courriels. Pourtant le smtp (ovh) est configuré comme mon client de courriel.

    Mailershot 1.6.5 est par ailleurs installé

    Certaines personnes ont-elle eu le cas chez OVH ?

    Cordialement,
    Pierre-Yves

    • Bonjour
      Pour le smtp chez ovh, il faut mettre dans :
      Hote = ssl0.ovh.net
      port = 445
      Requiert une authentification = oui (puis rentrer ses identifiants)
      Connexion sécurisée = SSL

      Maintenant bon courage, je pars en vacance :-D

    • Bonjour Franck,
      Et merci pour la réponse,
      Il s’agit bien de cela. Mais avec le port 465 d’après http://guide.ovh.com/ConfigurationEmail

      Celà ne marche pas encore pleinement. Ca passe par moment, à d’autre non... Un problème de communication entre serveurs de courriels ?

      Je poursuis mes investigations.

      Bonnes vacances du coup !
      Pierre-Yves

    • Jaseur Boreal

      Bonjour,

      Même probleme constaté sur un spip 3.017 chez OVh avec SMTP Configuré correctement.
      (avec aussi Mailshot ...)
      Parfois les mails de test du facteur partent, parfois ils sont bloqués avec erreur ...
      Idem , parfois les mails de Test Infolettre partent, parfois ils ne partent pas ...
      Bizarre...

      Une piste de solution ?

    • Je constate le même problème

    Répondre à ce message

  • Salut,

    pour info, la Version 2.4.5 renvoie vers une erreur 404.

    Merci pour le beau boulot en tout cas !

    Répondre à ce message

Ajouter un commentaire

Qui êtes-vous ?

Pour afficher votre trombine avec votre message, enregistrez-la d’abord sur gravatar.com (gratuit et indolore) et n’oubliez pas d’indiquer votre adresse e-mail ici.

Ajoutez votre commentaire ici

Ce champ accepte les raccourcis SPIP {{gras}} {italique} -*liste [texte->url] <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.

Ajouter un document

Suivre les commentaires : RSS 2.0 | Atom