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

  • 1

    Bonjour,
    Quand je veux mettre Facteur, j’ai un message d’erreur sur les pages de gestion des plugins, à la place de listes de plugins :

    Fatal error : Call to undefined function plugin_get_infos() in plugins/facteur/base/facteur.php on line 6

    Sur Spip 2.1, avec CFG, Crayons, Forms et Tables (que je voudrais remplacer justement, car bugs), Spip-listes, Bonux, thickbox2

    Après vidage de cache, rien ne change. Que faire ?

    • Je me réponds. Ca marche à présent.
      Apparemment, un problème lors du chargement ftp ou un télescopage avec une ancienne version...

      Je vais pouvoir tester le plugin Formidable.

    Répondre à ce message

  • 2

    J’ai trouvé, en fait j’initialisais pas mon tableau de pièce jointe de manière correcte, voici comment procéder :

    $corps = array(

    ’html’ => $message,

    ’pieces_jointes’ => array(
    array(’chemin’ => $chemin_destination.$_FILES[’pj’][’name’],
    ’nom’ => ’azerty’,
    ’encodage’ => ’base64’,
    ’mime’ => ’image/jpeg’)
    )

    ) ;

    Et en effet faut rajouter le chemin complet ;) Si tu pouvais rajouter cet exemple dans la doc ca pourrait aider les futurs utilisateurs de ce super plugin ;)

    Merci encore RastaPopoulos

    • Ah oui la faute à la con, genre oublier un point virgule. C’est toujours là-dessus qu’on passe le plus de temps.

      Effectivement la doc dit :

      un tableau décrivant les pièces jointes, chaque élément est lui-même un tableau associatif

    • Exact, un truc a se tirer les cheveux, tout marche nickel maintenant c’est le principal ;)

    Répondre à ce message

  • 4
    guizm0w

    Bonjour,

    J’essaye d’utiliser le plugin facteur pour l’envoi de pieces jointes par mail dans le formulaire de contact,

    Cependant quand j’envois mon mail il m’affiche une erreur a l’écran :

    Could not access file : C Could not access file : i

    Voici comment j’ai paramétré le corps de ma fonction mail :

    $corps = array(
    ’html’ => $message,
    ’pieces_jointes’ => array(
    ’chemin’ => $chemin_destination,
    ’nom’ => $_FILES[’pj’][’name’]

    ),
    ) ;
    La structure vous parait elle bonne ?

    • Et bien je n’en sais rien... « Could not access file » veut à priori dire ce que ça veut dire. :) C’est-à-dire qu’il n’arrive pas à accéder au fichier voulu, donc possiblement que le chemin n’est pas bon. En affichant var_dump() le contenu du chemin, ça donne quoi ? C’est un chemin qui existe et qui pointe bien un fichier ?

    • Bonsoir RastaPopoulos et merci de bien vouloir m’apporter une aide ! :p

      Pourtant le chemin ou mon fichier est uploadé est bon (je l’ai meme indiqué en dur dans mon code)
      et le fichier uploadé est bien transféré dans ce dossier.

      C’est peut etre ce dossier que j’ai indiqué en dur qu’il n’aime pas, je vais du coup essayer de faire autrement.
      La syntaxe des options de pieces_jointes est bonne sinon ? c’est bien un sous tableau de $corps ?
      Merci.

      Voici en gros ce que fais ma fonction formulaires_contact_traiter_dist(){}

      function formulaires_contact_traiter_dist()

      $chemin_destination = ’C :/wamp/www/monprojet/squelettes/upload/’ ;

      //je déplace mon fichier uploadé vers le chemin de destination.
      move_uploaded_file($_FILES[’pj’][’tmp_name’], $chemin_destination.$_FILES[’pj’][’name’]) ;

      /*Chargement de la fonction*/
      $envoyer_mail = charger_fonction(’envoyer_mail’,’inc’) ;

      $email_to = ’monemail@email.com ;

      $email_from = _request(’email’) ;
      $sujet = ’sujet’ ;
      $message = _request(’nom’) ;

      $corps = array(
      ’html’ => $message,
      ’pieces_jointes’ => array(
      ’chemin’ => $chemin_destination,
      ’nom’ => $_FILES[’pj’][’name’],
      ’encodage’ => ’base64’,
      ’mime’=> ’image/jpeg’

      ),
      ) ;

      //go email.
      $envoyer_mail($email_to,$sujet,$corps,$email_from) ;
      return array(’message_ok’=> _T(’email_succes’)) ;

    • Raaaah toute mes excuses, la documentation est fausse je crois. « chemin » doit être le chemin complet du fichier : pas juste du dossier. Donc /dossier/dossier/fichier.

      Testes avec ça et si c’est bien le cas je modifie la doc.

    • Malheureusement, j’ai rajouté le chemin complet dans l’envoi du mail mais ca fait toujours la même erreur.
      $corps = array(
      ’html’ => $message,
      ’pieces_jointes’ => array(
      ’chemin’ => $chemin_destination.$_FILES[’pj’][’name’],
      ’nom’ => $_FILES[’pj’][’name’],
      ’encodage’ => ’base64’,
      ’mime’=> ’image/jpeg’

      Mais peut être qu’il faut l’ajouter quand même ;) à tester.

    Répondre à ce message

  • 2

    bonjour,
    j’avais utilisé facteur dans ses précédentes versions et là j’ai un problème : facteur vérifie la syntaxe du serveur smtp et refuse l’écriture d’une simple adresse ip.
    je comprend la volonté de vérifier mais pour moi c’est bloquant. ou peut-on retirer cette vérification ?
    j’ai cherché mais je n’ai pas réussi a l’enlever

    merci

    • bon ca y est j’ai trouve

      commenter les lignes 43 et 44 de /formulaires/configurer_facteur.php

    • Je viens de corriger le plugin pour que la validation soit un peu plus robuste et accepte une adresse IP, mais en ajoutant un controle de validité du host rentré (par une requete DNS)

    Répondre à ce message

  • Je me réponds à Moi même et aussi E-Papoulos que je remercie
    Oui le plugin Facteur remplace SMTP mail avec sarrkaspip3.0.3 et spip2.0.10 car cela marche chez moi.
    Toutefois je n’arrive pas à mettre plusieurs personnes comme destinataire de
    Formulaire de conatct avance - évolué ou est ce qu’il faut cocher je ne voie pas trop
    Par aillers sur sur le squelette sarkaspip3.0.3
    Au lieu que le formulaire se mette à la place de noistte formualire - conatct générique à gauche il reste comme une rubrique à part entière ;
    Et qd je clique sur noisette conatct générique de sraka à gauche, ceci me marque ce message curieux
    ERREUR 404 ;
    L’adresse URL que vous demandez n’existe pas. Le Plan du site peut vous aider à trouver l’information recherchée.

    Répondre à ce message

  • 1

    Bonjour ; Mail SMTP plugin ne marcherait plus IL SERAIT REMPLACE PAR FACTEUR
    POUR FORMULAIRE DE CONTACT AVANCE PEU T - ON PRENDRE FACTEUR EN LOCAL SUR WAMP SVP
    Le mail smtp ne marche plus sur les toutes dernières versions de sarkaspip3.0.3 et spip2.0.10
    En local sur wamp 1.7.0
    Dans configuration avancée dans spip2.0.10
    On a bien la Boite de dialogue
    Mais quand on remplit
    ex :
    smtp-q.otsqm.fr (*)
    port : 25
    J’ai bien fait les changements dans php.ini
    remplacé Localhost par ceci ci6dessus :(*)
    Il ne prend pas en compte
    C.a.d quand je valide sous spip 2.0.10
    La validation ne se fait pas ???
    Doc quand j’envoie de message dans le formulaire de
    Formulaire de conatct avance / évolué que j’ai installé
    Le message n’arrive pas à ma boite d’ e-mail
    Ni de personnes ?
    est ce que quelq’un a une solution SVP je suis vraiment bloqué
    Merci de votre aide SVP

    • J’ai pas tout compris. Et je ne connais pas Mail SMTP (à part que c’est le vieil ancêtre de Facteur). Donc je ne sais pas trop quoi dire, à part d’installer tout simplement Facteur et de le configurer.

    Répondre à ce message

  • 2

    Bonjour
    Juste un truc qui m’embete un peu, c’est le fait que le mot de passe smtp s’affiche en clair... Ca ne serait pas possible d’utiliser plutot un field password qui affiche des etoiles (histoire que les autres admin ne voient pas mon mot de passe) ?

    • Si, c’est d’ailleurs comme ça que c’était avant que Cédric change le formulaire de config en un formulaire CVT propre. Mais ça ne changerait pas grand chose pour vous : un champ password ne fait RIEN : il suffit de modifier le type=« password » en type=« text » dans Firebug (ou autre outil de webmaster), et hop on lit le contenu du champ.

      Je ne sais plus si c’est le cas, mais il faudrait surtout que la config de Facteur ne soit fait que par les comptes « webmaster » et non pas les comptes simplement « admin ». Dans ce cas, seules une ou deux personnes autorisées pourraient voir ce champ.

    • Oui, je sais qu’avec Firebug on peut dévoiler les étoiles... mais déjà ca serait un acte de « piratage » de le faire... Les admins non webmestres ne sont pas généralement des développeurs. Bref ca serait déjà ca. Si Cédric peut remettre le bon type, ça serait mieux.
      Et je viens de tester la config, elle accessible aux admins... Et oui, ça serait bien de la limiter aux webmasters.

    Répondre à ce message

  • Bonjour
    comment fait-on pour restreindre en fonction de leurs extensions les fichiers en pièces jointe ?
    je veux garder les doc, pdf, docx
    merci d’avance

    Répondre à ce message

  • 2

    Bonjour,

    Depuis plusieurs jours j’essaie d’utiliser conjointement Facteur et Clevermail 2.
    J’ai paramétré le Facteur de 2 manières sur OVH, les 2 m’envoient bien le mail de tests avec les accents.

    D’après ce que j’ai compris, le Facteur passe toutes les minutes ... et pourtant j’ai plusieurs messages fabriqués par Clevermail2 que le Facteur n’arrive pas à relever.

    Je n’arrive pas à trouver ce qui se passe, quelqu’un a t-il déjà eu ce type de problème ?

    Quels tests je peux lancer manuellement ?

    Merci de votre aide.

    ps : Je suis en SPIP 2.0.10, plugin Bonux, Facteur, CFG, Clevermail2 sur un hébergement OVH 90

    • Euh le facteur il fait rien du tout ! C’est juste un outil pour avoir plus d’options dans l’envoi de mails. Mais ça fait rien de lui-même. Donc le problème est à priori plutôt du côté de tel ou tel plugin qui l’utilise.

    • Merci pour ce retour rapide.

      Je vais donc repartir sur Clevermail qui utilise le Facteur.

    Répondre à ce message

  • 2

    Bonjour !

    Ce plugin semble très utile.

    Malheureusement je n’arrive pas à récuperer les valeurs des champs type « file » depuis les données du formulaire pour les utiliser dans le tableau pieces_jointes. J’ai essaié _request en plusieures variations, mais sans succés.

    Je suis sûr que la solution est triviale ... un petit exemple serait néanmoins extrêmement bienvenu :-)

    • Ce n’est pas vraiment en rapport avec ce plugin, mais tout simplement à l’utilisation des fichiers envoyés dans un formulaire HTML vers un script PHP :
      Chargements de fichiers par méthode POST

      Lors d’un envoi de formulaire, les fichiers ne sont pas dans le _request() mais sont dans la variable globale $_FILES.

      Vous pourrez trouver des exemples d’utilisation dans le code du plugin Médiathèque ou du plugin Contact avancé.

    • Merci de me diriger vers le plugin « Contact avancé » — cet exemple m’a permis de conçevoir mon propre formulaire. J’avais déjà compris que les données des fichiers postées se trouvent dans $_FILES, ce qui me manquait était la méthode de les passer d’une étape du processus à l’autre (vérifier -> traiter le formulaire). Au debut j’ai esperé que ça soit possible en utilisant « _request » ou une autre fonction déjà présente dans SPIP et je n’avais pas encore realisé qu’il faut coder ça moi-même ;-)

    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