Facteur

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

Important !

A partir de la version 4.3.0 si vous utilisez un fournisseur commercial pour l’envoi des mails (Mailjet, Sendinblue, Mandrill) vous devez installer en plus le plugin Mailshot pour conserver votre fournisseur d’envoi !

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 :

$facteur_mail_html2text = charger_fonction('facteur_mail_html2text', 'inc');
$message_texte = $facteur_mail_html2text($message_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

144 discussions

  • 2

    Bonjour,

    Serait-il possible d’ajouter dans la configuration de Facteur, la possibilité d’inscrire un sujet (toujours le même) aux messages envoyés à partir de Facteur ?

    La raison est que je travaille sur un site hébergé à l’université et tous les messages envoyés à partir de la fonction mail() de PHP sont bloqués. Je peux faire débloquer une adresse courriel et un sujet. Ainsi, si je pouvais configurer Facteur pour qu’il utilise toujours le même sujet dans l’envoi de courriel, ça serait super !!!

    Merci de votre aide !

    Zaa

    • Je pense que ce besoin est trop spécifique pour ajouter une option pour tous. Car ce que tu demandes c’est même pas d’avoir un sujet par défaut lorsqu’il n’y en a pas (ça n’arrive à vrai dire jamais) mais de surcharger le sujet qui est déjà défini par ceux qui appellent la fonction envoyer_mail() de SPIP.

      En revanche, en PHP tu peux t’insérer dans la porte d’entrée facteur_pre_envoi qui reçoit en paramètre un objet PHPMailer. Tu peux alors redéfinir le paramètre $facteur->Subject = ... avant l’envoi du courrier.

      Par contre, je ne connais pas ton utilisation, mais cela signifie que tous les mails auront le même sujet, que ce soit les mails de SPIP, les mails de notifications de tel ou tel plugins, etc. Pas très pratique pour ceux qui les recevront.

      Pourquoi n’utilises-tu pas plutôt la possibilité de configurer explicitement le serveur SMTP utilisé pour envoyer les mails ? Ce qui fait qu’ils ne partent pas depuis ton serveur mais depuis un que tu configures (Gmail ou autre fournisseur).

    • Merci beaucoup pour tes réponses !

      Je vais essayer le SMTP !

    Répondre à ce message

  • 1

    Bonjour,

    Qd je teste Facteur, j’ai ceci :

    Parse error : syntax error, unexpected T_STRING, expecting T_OLD_FUNCTION or T_FUNCTION or T_VAR or ’}’ in /htdocs/public/www/Om/plugins/auto/facteur/inline-style/InlineStyle.php on line 37

    et pas d’envoi de mail...

    Vous me conseillez de faire quoi ?

    Merci d’avance !

    • Salut,
      J’ai eu le même problème, après avoir passé du temps à chercher j’ai vu qu’en désactivant l’option suivante ça fonctionne :
      Transformer les styles contenus entre

      et

      en des styles « en ligne », utile pour les webmails car les styles en ligne ont la priorité sur les styles externes.

      Ça doit être un problème de compatibilté de la bibliothèque utilisée avec Php4.

      Ouf !

    Répondre à ce message

  • 5
    mbourlier

    Bonjour,
    Mon site est sous Spip 2.1.11, squelette Sarka-spip 3.1.0 et ce matin le passage automatique via « le couteau suisse » de la révision 52840 du 07/10 à la révision 54251 du 09/11 ne se fait pas correctement. Mais j’ai remarqué que l’installation des paquets se fait dans le dossier /lib/facteur ; est-ce normal ?

    Cordialement
    M. BOURLIER

    • Frédéric

      Bonjour,
      Même souci, la mise à jour (via le couteau suisse et en direct via le gestionnaire de plugin) m’indique qu’elle ne peut se faire car le répertoire ../lib n’existe pas !
      J’attends sagement une nouvelle version...
      Bonne journée
      Frédéric

    • mbourlier

      Bonjour,
      Loin de moi l’idée de mettre en cause directement le plugin. J’ai désactivé le CS et fait la mise à jour de Facteur par FTP. Un autre problème apparaît maintenant dans la liste des plugins : Facteur est visible à 3 endroits (plugins/auto, plugins/auto/facteur/trunck et plugins/auto/facteur/branches/v1 (voir le fichier joint).
      Pour l’instant, je reviens à la version précédente en attendant.
      Cordialement

      M. BOURLIER

    • Apparemment il y a un bug avec la génération des paquets.

      Il y a deux paquets pour ce plugin : « facteur.zip » contenant la version stable pour 2.1 et « facteur-2.0.zip » contenant la version pour SPIP 3.

      Le deuxième ZIP est correcte est contient bien uniquement la bonne version. Mais « facteur.zip » contient actuellement TOUT le dossier de Facteur donc avec toutes les versions.

      On essaye de comprendre.

    • mbourlier

      Bonsoir,

      Tout est rentré dans l’ordre avec ces modifications. Bravo et merci pour votre réactivité.
      Cordialement

      M. BOURLIER

    Répondre à ce message

  • Bonjour,
    lorsque je fais un essai d’envoi de mail depuis l’interface de gestion de facteur, avec « utiliser la fonction mail de php », j’ai un message qui me dis que le mail a bien été envoyé, mais je ne le reçois pas.
    Il y a de plus un cadre qui s’ouvre dans la page (iframe ?) avec une page spip d’erreur avec le texte « emails/test_email_html : accès interdit »

    Si quelqu’un a une idée, je suis preneur.
    Merci d’avance.

    Répondre à ce message

  • 1

    Salut !
    Existe-t-il un moyen propre de passer un squelette à Facteur ? Je compte utiliser un modèle de mail précis pour l’envoi automatique de formulaires Formidable ! via Facteur.
    J’aurai besoin de lui fournir un titre et un message qui sont accédés via les balises de contexte dans le squelette.

    Mojo

    • Ben si tu l’utilises en PHP, tu mets bien ce que tu veux dans les paramètres, donc la fonction « recuperer_fond(squelette, tableau de contexte) » qui va te renvoyer une chaîne de caractères correspondant à la compilation d’un squelette.

    Répondre à ce message

  • 4

    Bonjour à tous,

    Nous (Paolo et moi) avons découvert un problème avec la vérification des adresses emails avec le plugin. Il paraît qu’en PHP 5.2.12 (sur FreeBSD) la fonction filter_var (appelée dans phpmailer-php5/class.phpmailer.php::ValidateAddress() ) ne fonctionne pas correctement et rejette toutes les addresse qu’on lui donne. Le résultat est que toute adresse écrite donne les erreurs « Invalid address : [adresse]You must provide at least one recipient email address. »

    Ce problème est réglé en la version 5.3.3, mais s’il n’est pas possible de mettre à jour la version de votre serveur, vous pouvez l’éviter en supprimant l’appel à filter_var dans la fonction ; l’option avec la preg_match marche très bien.

    • Super, merci pour ce rapport ! Il fallait le trouver ce bug...

    • Précision : On ne sait pas que c’est la version 5.3.3 qui résout ce problème. Plutôt nous constatons qu’avec 5.2.12 cela ne marche pas, mais avec 5.3.3 ça marche.

    • Salut !
      Où en êtes-vous avec ce problème ? Je rencontre actuellement un bug similaire : tous mes formulaires issus du plugin fonctionnent bien, les emails partent, la base est renseignée, le message de confirmation s’affiche bien... mais « Invalid address : » s’affiche systématiquement en haut de page pour chaque email utilisé. Ce ne serait pas trop grave si ce genre d’echo ne plantait pas systématiquement les pages affichées par IE.
      Y a-t-il moyen de corriger ça dans le plugin, en l’absence d’une intervention possible côté serveur ?

      Mojo

    • J’ai trouvé le coupable au moyen de quelques debug bien placés. C’est la fonction AddAnAddress() qui me posait problème : en fait elle appelle systématiquement ValidateAddress() pour vérifier tous les champs adresse des formulaires... même les champs vides (en l’occurence pour moi, les champs Cc et Bc) !
      J’ai donc ajouté un contrôle pour encadrer l’appel de ValidateAddress() dans AddAnAddress(), de sorte que l’on ne contrôle les adresse supplémentaires que si elles sont effectivement renseignées. Ajouter la correction dans ValidateAddress serait une erreur puisque il faut pouvoir vérifier que certains champs adresses sont effectivement remplis et renvoyer une erreur le cas échéant.

      if($address!=""){
              if (!self::ValidateAddress($address)) {
      ...
      }

      C’est du bricolage à la va-vite... pas trop le temps de faire mieux dans l’immédiat.

      Mojo

    Répondre à ce message

  • Bonjour,

    j’ai deux légers soucis avec Facteur (SPIP 2.1.8 et facteur 1.7.2 [49786]) :

    • Quand le corps de mon message contient un caractère étrange, par exemple œ le message arrive avec un œ à la place. Mon message est à priori en UTF-8.
    • J’appelle la fonction :
      $envoyer_mail($destinataire,$sujet,$corps,$from);
      avec dans le champs $from une chaine du type nom <adresse@serveur.truc> et j’ai n’importe quoi comme expéditeur à l’arrivée du mail, genre <nom <adresse@serveur.truc>><<nom <adresse@serveur.truc>>>

    Tout cela marche bien si Facteur est désactivé (en utilisant la fonction envoyer_mail du core). Une idée ?

    merci

    Répondre à ce message

  • 5

    Bonjour,
    J’utilise ce plugin pour pouvoir attaché des fichiers à mon formulaire. Alors j’avoue que je suis un peu perdu pour l’utilisation de ce plugin...quels sont les fichiers du plugin qu’on doit modifier pour pouvoir attaché un fichier ??? Voici mon formulaire ici l’envoie du formulaire ce passe surper bien sauf quand j’essaie d’upload un fichier (là rien ne se passe). Merci de votre aide.

    • Pourquoi faudrait-il modifier des fichiers ?

      Il faut déjà apprendre à uploader des fichiers, et ensuite utiliser ce fichier téléchargé pour l’envoyer par mail avec ce qui est décrit plus haut dans cette documentation.

    • Excuses moi d’insister, mais j’ai retourné la question dans tous les sens mais j’ai toujours pas bien compris peu être parce que je ne connais rien en dev. J’upload le fichier mais l’envoie pause un problème, si je clique sur le bouton envoie rien ne se passe http://www.enseigneraletranger.org/...
      S’il vous plait clique sur le lien et peut être tu verra d’où vient le problème.

      Tu me dis qu’on doit pas modifier les fichiers, alors dans ce cas ou est ce que je dois mettre ceci ??

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

      Et surtout quand je clique sur le bonton envoyé pourquoi rien ne se passe ??? qu’est ce que j’ai loupé ? Merci pour votre aide

    • Personnellement, j’ai beau relire : je ne comprends absolument pas de quoi tu parles. :)

      Tu as fait un formulaire ? De quoi parles-tu, à la base, au démarrage du tout début du commencement ? :)

      Je rappelle que là on est sur le forum du plugin Facteur, qui est un outil pour développeur, pour aider les développeurs de code PHP à envoyer plus facilement des emails.

    • Merci pour votre réponse rapide, ok je commence par le commencement
      1/ j’ai utilisé le plugin de formulaire de contact avancé pour pouvoir envoyé les formulaires, ce plugin n’autorise pas les pièces jointes. Pour cela, il faut utiliser le plugin facteur( c’est là que tu rentres en jeux :) ).
      2/ Bon j’ai installé le plugin facteur mais j’arrive pas à le faire tourné, aprés avoir fait un upload dès que je clique sur le bouton envoyer rien ne se passe. C’est pourquoi je t’ai filé le lien du site de la page en question pour que cela t’aide a comprendre mon problème. J’espère que cette fois je suis clair. Merci encore

    • Ah ok, donc ce n’est pas un problème du plugin Facteur, mais un problème du formulaire de contact avancé. Donc faut poser la question sur son forum. Sinon on va s’y perdre et ça n’aidera pas les autres.

    Répondre à ce message

  • 7
    Philippe

    impossible de faire fonctionner le plugin :
    Fichier configurer_facteur introuvable
    SPIP 2.1.10 [17657]
    help !

    • Et toutes les plugins à jour ? Et testé en enlevant les plugins non nécessaires pour être sûr que ça vient bien de celui là ?

    • Philippe

      Oui hélas,
      Le problème « Fichier configurer_facteur introuvable » est identique avec le plugin CleverMail 2 qui, pour fonctionner, a besoin de Facteur.
      Donc en voulant configurer Facteur, je retrouve le même message « Fichier configurer_facteur introuvable ».
      Sur ta remarque, j’ai retiré les autres plugins pour tester mais rien n’y fait.

      En regardant dans les fichiers des plugins Facteur et CleverMail, je ne trouve pas le fichier configurer_nom_du_plugin". Donc je me demande si le problème ne vient pas d’ailleurs.

      Merci de ton aide,
      Philippe

    • Sauf que tu ne dis à aucun moment OÙ tu as ce message d’erreur ? Donc comment reproduire ?

      La configuration se trouve dans Configuration => Facteur et la page exacte est « / ?exec=facteur », à aucun moment il n’y a d’appel de page « configurer_facteur ».

    • Philippe

      Effectivement. je vais dans le menu « Configuration » > Plugins actifs > Facteur > l’icône clef à molette et tournevis. Et là le problème se reproduit tant que tu veux.

      Je viens de comprendre ce qui ne vas pas : en cliquant sur cette icône, on fait appel au script configurer_facteur … qui n’existe pas. Quand je remplace « configurer_facteur » dans l’URL par «  ?exec=facteur », çà marche.
      Idem pour Clevermail.

      C’est donc que j’ai un mauvais lien sur l’icône de configuration de ces 2 plugins.

    • Ce que je ne comprends pas c’est que moi je n’ai jamais eu cette icône (ce qui est normal puisqu’elle n’a pas de raison d’être vu qu’il n’y a ni page CFG ni exec=configurer_facteur) su aucun des sites où j’ai Facteur.

    • Philippe

      A mon avis, le problème vient du plugin CFG, mais je ne vois pas trop comment résoudre le problème car j’ai installé la dernière version.

    • Philippe

      Euréka !

      Pour accéder au plugin directement il faut une URL de ce type : http://URL/ecrire/?exec=clevermail.
      En essayant de passer par le plugin CFG, on tombe sur un mauvais lien.

      Dans une page HTML du squelette, pour que l’appel au formulaire « #FORMULAIRE_CLEVERMAIL » donne un résultat, il faut :

      * qu’une newsletter soit créée ;
      * qu’il y au moins un abonné ;
      * que la modération soit « ouverte » et pas fermée

      Le problème venait donc de CleverMail, pas de Facteur.
      Merci pour le coup de main qui m’a fait chercher dans le bon sens.
      Philippe

    Répondre à ce message

  • 3

    Bonjour,

    Je voudrais utiliser Facteur couplé à un formulaire CVT pour envoyer des mails avec pièces jointes. Je reçois bien les mails, mais aucune pièce jointe n’est attachée - et l’upload se passe bien.

    J’ai beau retourner le code dans tous les sens, jene vois pas où j’ai fais une erreur ! Et je n’ai aucun message d’erreur dans les logs de facteur.

    Voici comment j’écris mon code :

    $corps =array(
    		'texte' => 'bonjour, ceci est un test',
    		'pieces_jointes' => array(
    			array(
    				'chemin' => '/home/sarah/'.$pj['name'],
    				'nom' => $pj['name'],
    				'encodage' =>'base64',
    				'mime'=>$pj['type']
    			)
    		)
    	);
    
    	$envoyer_mail($destinataire,$sujet,$corps,$from);
    • Tu as fait un var_dump() des variables ? Elles contiennent bien ce que tu veux ? Le fichier existe bien à ce chemin complet ? À priori oui parce que je crois que la lib PHPMailer retourne une erreur quand le fichier n’existe pas. À vérifier quand même.

      Sinon je ne vois pas. :(

      Pour tester tu peux aller dans le inc/encoyer_mail de Facteur et tester ce que retourne $facteur->AddAttachment() ligne 83. Ça retourne un booléen, true ou false.

    • J’ai vérifié les variables depuis la fonction AddAttechment, et elles sont bien remplies.

      Par contre, AssAttachement renvoie false.

      Le chemin doit bien être le chemin absolu sur mon ordinateur ? Ou sur le serveur ?

    • C’est résolu !

      je ne récupérai pas bien le chemin du fichier, qui était dans $_FILES[’truc’][’tmp_name’]

    Répondre à ce message

Ajouter un commentaire

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
  • 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 apparaît.

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.

Qui êtes-vous ?
[Se connecter]

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