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

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.
Exemple en local, entrer smtp.orange.fr et port 25.

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 :

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 :

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 :

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

-  Générer le message HTML avec une variable $texte en utilisant le squelette d’email fourni par le plugin

$html = recuperer_fond("emails/texte", array('texte' => $texte));

-  Générer le message HTML avec une variable $html en utilisant le squelette d’email fourni par le plugin

$html = recuperer_fond("emails/texte", array('html' => $html));

-  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

Discussion

122 discussions

  • 3
    jeromeD

    Bonjour, Depuis quelque temps l’envoi des mails via le la fonction mail PHP et je ne comprends pas pourquoi.

    Cela ne fonctionne plus depuis que j’ai changé la configuration de mailshot en abandonnant mandrill pour mailjet.

    Mais ni les réponses aux fomulaires formidables, ni mes newsletters n’arrivent alors que les plugins me disent qu’elles partent.
    Avez-vous une idée...
    Cela se passe sur le site saint-cergues.fr par exemple sur le formulaire: http://www.saint-cergues.fr/Demande-d-utilisation-du-panneau.html

    En vous remerciant par avance

    • Facteur à jour ? Ya eu pas mal de changement dernièrement.

    • jeromeD

      Bonsoir,

      oui facteur est à jour...cela a d’ailleurs été mon premier réflexe.

      Une autre piste?

      Merci d’avance

    • Non pas d’autre piste vu que ça marche en plein d’endroit, et qu’en plus Mailshot n’a pas de rapport avec Facteur normalement.

      Pour tester il faut toujours tout désactiver ce qui n’est pas obligatoire à la chose qu’on veut tester, comme expliquer dans le lien “Les choses à faire avant de poser une question”.

    Reply to this message

  • 8
    laurent

    Bonjour à tous,

    j’ai créé un formulaire avec le plugin Formidable mais quand je teste l’envoi de mail dans l’espace privé j’ai des messages d’erreur.
    Si j’utilise la fonction mail de PHP dans Facteur j’ai ce message d’erreur “Could not instantiate mail function.” et pour SMTP après la config j’ai celui-là
    “SMTP Error: Could not connect to SMTP host.”

    le destinataire est bien indiqué (email yahoo.fr)
    J’ai également modifié php.ini: smtp= localhost ou 127.0.0.1 ou smtp.mail.yahoo.fr, mais le problème reste entier.
    Je bloque et si vous pouviez me mettre sur la bonne voie ce serait sympa.
    Je vous remercie à l’avance.

    SPIP 2.1.12 en local (Wamp)
    PHP 5.3.5
    Facteur 1.8.5
    Formidable 0.6.6

    • En général si tu configures un SMTP, il y a une authentification derrière. T’as bien mis le bon identifiant / mot de passe ? Et le mode SSL ou pas suivant la config du serveur en question ?

    • laurent

      tout d’abord un grand merci pour ta réponse.
      je suis toujours là-dessus et de plus depuis quelques heures je ne parviens plus à aller dans “gérer mes plugins”, cela m’affiche tout un tas de ligne de php (que je connais à peine). Un problème de temps je crois que j’ai modifié en faisant “max_execution_time = 55”. au lieu 30.

      J’ai bien mis Connexion sécurisée : ssl avec identifiant/mot de passe .
      Il s’agit de yahoo et quand je mets le smtp de yahoo: smtp.mail.yahoo.fr (comme pour mon serveur de messagerie) Port 465, j’ai 2 erreurs: smtp et port, et quand je modifie par: smtp.yahoo.fr Port 25, la configuration du facteur s’enregistre.
      Et ensuite si je teste la config par l’envoi du mail, j’ai “SMTP Error: Could not connect to SMTP host.” et je vois que le message est 1 article entier du site que j’ai commencé avec une photo d’une autre rubrique: “Ceci est un email de test accentué
      Version HTML.... etc ..;”

      Et si j’utilise la fonction mail de PHP putôt que le smtp, l’erreur est “Could not instantiate mail function.”

      En fait je fais du surplace ....

      Enfin avant d’utiliser Facteur et Formidable , j’avais créé je ne sais plus avec quel outil un formulaire avec la possibilité de joindre 1 document mais je ne suis pas parvenu non plus à envoyer 1 mail.

      Pardon si c’est confus mais je découvre et me bats avec spip depuis plusieurs semaines, l’outil est extra mais pour sa prise en main c’est une autre histoire.
      merci encore pour ta réponse

    • En l’occurrence là il ne s’agit pas vraiment de SPIP mais de la configuration de ton serveur. Forcément si celui-ci ne propose pas d’office une fonction pour envoyer des mails, c’est forcément à toi de passer plus de temps à configurer des choses pour que ça marche.

      Tu es sur quel hébergement ? Enfin à priori ça ne change rien pour ce point puisque tu as le message « Could not instantiate mail function. » donc c’est qu’à priori le serveur n’a pas de fonction mail().

      Pour le SMTP, je ne vois pas quoi dire de plus que suivre les instructions de celui qui fournit ce serveur SMTP (ici Yahoo chez toi). Chaque service a ses particularités, donc je ne peux pas tout connaître. D’ailleurs, certains services refusent l’utilisation de leur SMTP pour envoyer depuis un site internet (ça limite l’envoi de spam par leur service, entre autre). Donc là aussi ça dépend de chaque service...

    • laurent

      RastaPopoulos

      je viens de modifier l’adresse mail Yahoo pour une d’Orange et là tout s’est correctement passé. Mail envoyé et reçu ...
      merci quand même.

    • laurent

      Merci encore pour ton aide mais ma config était fausse pour Yahoo et je m’en suis rendu compte en vérifiant la config smtp yahoo sur Thunderbird. A savoir que cela ne requiert pas de connexion sécurisée que ce soit Yahoo ou Orange.
      Toutefois cela ne règle pas le problème du mail Yahoo, vu le refus dans Facteur de l’hôte SMTP.
      Je verrais plus tard et je peux poursuivre mon apprentissage.
      Et bien sûr merci pour tes plugins car je crois que tu as créé également Formidable.
      Bonne soirée

    • Je confirme : le code qui vérifie que le SMTP est au bon format donne pour smtp.mail.yahoo.com :

      Ce nom d’hôte n’est pas correct

    • Ça devrait résoudre à priori (si on parle bien juste du formulaire de config) :
      http://zone.spip.org/trac/spip-zone/changeset/96484

    Reply to this message

  • 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.

    Reply to this 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

    Reply to this 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?

    Reply to this 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.

    Reply to this 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. :)

    Reply to this 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.

    Reply to this 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 ! :-/

    Reply to this 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.

    Reply to this message

Add a comment

Avant de faire part d’un problème sur un plugin X, merci de lire ce qui suit :

  • Désactiver tous les plugins que vous ne voulez pas tester afin de vous assurer que le bug vient bien du plugin X. Cela vous évitera d’écrire sur le forum d’une contribution qui n’est finalement pas en cause.
  • Cherchez et notez les numéros de version de tout ce qui est en place au moment du test :
    • version de SPIP, en bas de la partie privée
    • version du plugin testé et des éventuels plugins nécessités
    • version de PHP (exec=info en partie privée)
    • version de MySQL / SQLite / PostgreSQL
  • Si votre problème concerne la partie publique de votre site, donnez une URL où le bug est visible, pour que les gens puissent voir par eux-mêmes.
  • En cas de page blanche, merci d’activer l’affichage des erreurs, et d’indiquer ensuite l’erreur qui apparait.

Merci d’avance pour les personnes qui vous aideront !

Par ailleurs, n’oubliez pas que les contributeurs et contributrices ont une vie en dehors de SPIP.

Who are you?
[Log in]

To show your avatar with your message, register it first on gravatar.com (free et painless) and don’t forget to indicate your Email addresse here.

Enter your comment here

This form accepts SPIP shortcuts {{bold}} {italic} -*list [text->url] <quote> <code> and HTML code <q> <del> <ins>. To create paragraphs, just leave empty lines.

Add a document

Follow the comments: RSS 2.0 | Atom