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

128 discussions

  • 1

    Bonsoir,

    Je n’arrive pas à configurer le plugin Facteur pour une boite mail yahoo.

    j’ai testé plein de réglages différent sans succès.

    À noté que si je regarde les réglage smtp sous thunderbird la méthode d’authentification est “OAuth2” et là je ne vois pas où entrer cela dans le plugin.

    Une idée?

    Merci d’avance,

    Cordialement,

    Hervé

    Reply to this message

  • 4

    Bonjour,

    J’essaie de configurer ce plugin pour des envois de courriels authentifiés, depuis un serveur smtp externe.
    J’ai coché et renseigné les options suivantes:

    • Utiliser SMTP
    • Hôte: monhote.truc
    • Port: 587
    • Requiert une authentification —> oui
    • Connexion sécurisée —> TLS
    • Vérification du certificat SSL —> le certificat SSL du serveur SMTP est émis par une Autorité de Certification (recommandé)

    Lorsque je teste la configuration, je reçois bien le courriel.
    Cependant, dans l’en-tête du courriel que je reçois, je ne trouve pas d’en-tête DKIM et j’ai “Agent utilisateur” à “PHPMailer 6.1.3 (https://github.com/PHPMailer/PHPMailer)”.
    Sans l’en-tête DKIM, les grand·e·s méchant·e·s du mail vont évidemment mettre ça dans les spams dans le meilleur des cas, voir, ne pas délivrer le courriel et ne rien dire. C’est fâcheux. ;-)

    Est-ce que j’ai oublié quelque chose?

    Je précise qu’en utilisant mon courriel via le webmail ou bien un autre client, j’obtiens bien l’en-tête DKIM.

    • Bonsoir,

      Tu as testé https://www.mail-tester.com/ pour aider à la configuration ?
      Il doit manquer dans les dns du domaine l’ip du serveur smtp qui envoi afin de l’authentifier.

    • J’avais testé avec mail tester.
      En gros, l’envoi via facteur (avec l’option smtp) obtient une note de 8.7/10, sans signature DKIM.
      Si je reteste depuis le webmail de l’hébergeur, j’obtiens la note 10/10, avec la signature DKIM.

      Ça me donne vraiment l’impression que facteur n’utilise pas vraiment l’authentification smtp pour l’envoi de mes courriels depuis le site.

    • et smtp de l’ hébergeur ou un autre smtp ?

    • Oui. Pour avoir la bonne signature DKIM dans l’en-tête de mes courriels provenant du site, j’essaie bien sûre d’utiliser le smtp de mon hébergeur.

    Reply to this message

  • 1

    Bonjour,

    le plugin facteur existe-t-il pour formidable avec spip 4.0 ?

    • Il manquait un tag sur la dernière version marquée pour SPIP 4 afin que ça génère le paquet ZIP pour le commun des mortels. C’est fait, ça va arriver dans les heures qui suivent.

    Reply to this message

  • 2

    Bonjour,

    Pour mettre à jour phpmailer, il suffit de remplacer la lib ?

    • Je suis aussi intéressé par la question dans la mesure ou une alerte de sécurité sur la librairie a été publiée dernièrement.
      Merci.

    • Il faut remplacer la lib et possiblement les chemins dans les utilisations si le nom de dossier a changé. S’il y a eu des mises à jour récemment oui faut proposer une mise à jour, si quelqu’un se sent de faire une PR sur le projet Git. Dans tous les cas ce serait mieux de faire un ticket qu’ici où c’est pour du support à l’utilisation.
      https://git.spip.net/spip-contrib-extensions/facteur/issues

    Reply to this message

  • 3

    Je reviens avec une petite question concernant le paramétrage de ce plugin : est-il possible d’imposer un paramétrage par fichier ?

    En effet, le même paramétrage de SMTP doit être utilisé pour toute une série de sites : déployer le plugin avec sa configuration dans /config serait un gros + !

    • C’est une fonctionnalité qui ne serait pas propre à ce plugin, et non ça n’existe pas, SPIP ne permet pas ça.

      En revanche il y a peut-être pour toi le plugin “Import/Export de configuration”, qui permet d’enregistrer une série de configuration dans un fichier (yaml je crois) qu’on peut alors importer dans d’autres sites, sans avoir à recocher ou remplir tous ces champs (mais il faut quand même faire l’opération d’importer). Ça me fait penser que ce plugin (import/export) pourrait avoir des commandes SPIP-Cli pour faire ça sans avoir besoin d’aller dans l’admin de chacun des sites.

    • Merci pour ce retour !
      Je vais tester ce plugin d’import/export de config ;-)

    Reply to this message

  • 2

    Je souhaite légèrement surcharger le template emails/texte.html dans un plugin dédié pour l’envoi des mails automatiques (interactivité).
    Mais en recopiant la même arborescence (plugins/mon-plugin-email/emails/texte.html) ce template n’est pas pris en charge : quelle(s) action(s) faut-il effectuer en plus ?

    • Ton plugin doit absolument nécessiter ou utiliser (dans son xml) le plugin à surcharger, pour être sûr de passer après, par dessus.

    • C’est bien cela :
      <necessite nom="Facteur" compatibilite='[4.1.0;]' />

      Merci beaucoup !

    Reply to this message

  • 1

    Bonjour,

    J’aurais bien aimer pouvoir utiliser Oauth pour se connecter avec le compte gmail pour simplifier la connexion au serveur SMTP mais cela ne semble pas possible.
    J’ai vu dans le code des traces d’authentification Oauth mais ça ne me semble pas opérationnel en l’état.
    Est ce qu’il y a moyen d’activer cela?

    Merci pour vos réponses

    • Non ce n’est pas prévu. Je ne savais même pas qu’on pouvait se connecter à un serveur SMTP par OAuth. Mais OAuth c’est pour faire de la délégation, pour le cas de la config de Facteur, en quoi ça simplifie par rapport à mettre le login pass du serveur SMTP ?

    Reply to this message

  • 3

    Bonsoir,

    Depuis 2 jours facteur refuse de fonctionner. Il est paramétré depuis longtemps avec un smtp externe. Quand j’envoie un message de test, je recois le message
    SMTP connect() failed. https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting
    Le monitoring du facteur affiche bien évidemment un message d’erreur.
    Rien n’a changé sur le serveur
    Je suis en SPIP 3.2.7 [24473] et facteur 4.0.4 : je viens de passer en version 4 pour tester
    Si quelqu’un a une piste, d’avance merci

    • Bé si ça ne marchait pas déjà d’un coup avant de faire mise à jour, peut-être qu’il y a des problèmes ou modifs *sur le SMTP* justement non ? Donc à voir avec l’hébergeur ? Le SMTP fonctionne sur d’autres outils (thunderbird etc) avec les mêmes identifiants ?

    • Rien n’a changé, le service mail fonctionne parfaitement sur d’autres outils.
      J’ai testé avec un autre mail qui fonctionne très bien également sur un autre hébergeur et dès que j’essaie sur facteur, bingo le message est le même.
      Le problème est le même sur 2 sites spip sur le même serveur et qui utilisent le même smtp
      Aucun changement de firewall, de dns, de ssl, etc...

    • Facteur n’a pas changé depuis 2 jours, donc si tu dis que ça marchait encore il y a 3 jours et que ensuite depuis 2 jours ça ne marche plus, il n’y a (à priori) pas de raison que ça vienne de Facteur. SI s’il y a justement eu une mise à jour de faire juste avant que ça ne marche plus.

    Reply to this message

  • 6

    Bonjour à toutes et à tous,
    Je suis sur Spip 3.2.5, Facteur 3.7.2 et Formidable 3.46.7, site hébergé chez OVH.
    Depuis quelques temps, mais je n’ai pas vraiment vu QUAND et surtout POURQUOI ?
    Les formulaires n’arrivent plus !
    Après être remonté au plugin Facteur, les messages de tests partent bien, mais n’arrivent pas, avec :
    “L’email de test a correctement été envoyé. Si vous ne le recevez pas correctement, vérifiez la configuration de votre serveur ou contactez un administrateur du serveur.”

    Des directions ???
    par avance, merci.
    Alain

    • Si SPIP ne dit rien de mal, je suppose que c’est à OVH qu’il faut demander. C’est configuré pour envoyer avec quoi, la fonction mail() de PHP ou un SMTP configuré ?

    • Merci je pensais pareil, mais sans savoir ou chercher ?
      Sinon, j’étais en fonction mail php, quand ça ne marchait plus, j’ai essayé en SMTP, mais sans plus de résultat.
      Je continue ma recherche...

    • Merci, je viens de tester avec une page mail.php et :

      <?php
       $to      = 'personne@example.com';
       $subject = 'le sujet';
       $message = 'Bonjour !';
       $headers = 'From: webmaster@example.com' . "\r\n" .
       'Reply-To: webmaster@example.com' . "\r\n" .
       'X-Mailer: PHP/' . phpversion();
      
       mail($to, $subject, $message, $headers);
       ?>

      Et c’est passé !
      je continue ma recherche ...
      Merci à ceux qui ont connu ce problème de me donner des directions même celles qui se sont avérées pas bonnes

    • Bonjour

      Je viens de faire des tests également, Sylvain m’ayant dit que son site https://sylvain-gillet.fr ne semblait pas envoyer de mails. C’est chez OVH aussi. A priori les tests sont positifs.
      La personne qui avait dit qu’elle avait écrit via le site ne l’a peut-être finalement pas fait...

      Est-ce que Facteur est supposé stocker les messages dans la BDD ? Et si oui à quel endroit ? Voilà qui permettrait de vérifier.

      Merci

    • non, le facteur ne sauve pas les messages en bdd.

      Tu peux par contre loguer l’ensembel des mails du facteur en mettant dans mes_options,php

      define('_LOG_FACTEUR',_LOG_INFO_IMPORTANTE);
    • Toujours aussi rapide ! :)

      Merci

    Reply to this message

  • 6

    Ça serait quand même bien pratique de pouvoir envoyer un mail avec un contenu html qui utilise lui aussi l’habillage générique utilisé pour les mails en texte.

    Qu’on puisse faire $envoyer_mail($dest, $sujet, $texte, $exp); tout simplement, et que le facteur compose tout seul en multipart, que $texte soit du html ou pas :

    • la partie texte brut avec Facteur::html2text($texte)
    • la partie html avec recuperer_fond("emails/texte",array('texte'=>$texte,'sujet'=>$sujet));

    Du coup, le nom du template emails/texte ne serait plus logique, mais à garder pour la compat.

    Qu’en pensez vous ?

    • En fait ya déjà une fonction fournie, qui contient un test pour savoir si c’est vraiment du texte brut OU du semi-html simplifié (pas le html complet). C’est la fonction facteur_email_wrap_to_html.

      Si tu as du morceau de html basique (un texte, un bouton, un gros lien joli etc) dans un squelette, dedans tu ajoutes #FILTRE{facteur_email_wrap_to_html} et c’est tout, ton email utilisera l’entourage commun et donc cohérent avec l’ensemble de tes emails.

      On pourrait imaginer qu’il y ait un test plus compliqué/complet dans envoyer_mail qui fasse tout ça au même endroit du genre
      -  si ya aucune balise c’est du texte brut, on envoie à l’entourage dans le contexte “texte”
      -  si ya des balises, et qu’il y a </body> mais PAS </html>, c’est un html basique, on envoie à l’entourage dans le contexte “html”
      -  si ya </html> c’est un html complet, on fait rien, on le laisse comme ça

      Pour l’instant envoyer_mail fait la distinction texte brut VS html. Et le filtre à mettre dans #FILTRE fait la distinction entre texte brut et semi html et ajoute l’entourage.

    • Je confirme, #FILTRE{facteur_email_wrap_to_html} fonctionne bien, dans les /mails comme dans les /notifications

      J’ai donc surchargé celles de Formidable parce que de base elles sont vraiment toutes moches : une liste de saisies brutes en Times, noir et blanc, sans entête, avec juste un peu de gras pour égayer.
      C’est pas le Pérou mais ça fait un peu moins brut de décoffrage.

      On pourrait peut être leur mettre ce filtre par défaut, non ?

    • Si ya bien toutes les dépendances (à priori oui puisque ça nécessite Facteur), carrément oui !

    • nicod, cela donnerait quoi en capture d’écran? Parce que personnellement je trouve que les mails de notifs que je recois avec notifications sont hyper chargé. Il y a un entête hyper long avant d’arriver au contenu. Le côté hyper sobre des mails de Formidable, j’apprécie. On arrive directement aux réponses...

    • (EDIT : Oups pas posté au bon endroit)
      Le modele standard de mail de Facteur ajoute un bandeau en haut et utilise 4 niveaux de tables imbriquées. C’est difficile de faire “répondre” à un tel mail (avec thunderbird en tout cas): car ça insère plein d’espaces vides là où on s’insère pour répondre - si bien que la réponse doit se faire plus bas aprés avoir scrollé sur un autre écran, loin du texte auquel on répond (J’imagine que c’est à cause des padding et margins par défaut des 15 niveaux d’imbrication qu’il y a au total dans le HTML).

      Ça n’est pas gênant pour une newsletter de pure information sans attente de réponse, mais c’est inadapté pour des mails auxquels on doit pouvoir répondre. En fait, dans mon cas présent, un simple mail en texte irait bien. Mais y a t il un moyen d’envoyer des mails simplement au format TEXTE avec Facteur ?
      Ou sinon quel modèle HTML de mail serait recommandé pour ne pas rencontrer cette difficulté de réponse ?

    • Pour résoudre ce pb j’ai créé un template simplifié (surcharge squelette de emails/texte.html) :

      <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
      <html>
      <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>[(#ENV*{sujet})]</title>
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
      </head>
      <body leftmargin="0" marginwidth="0" topmargin="0" marginheight="0" offset="0"
        style="margin: 0;padding: 0;width: 100% !important;background-color: #DDDDDD;">
      <center>
        <div class='text' style="color:#222222;font-family: Verdana, Geneva, sans-serif;font-size:100%;line-height:150%;text-align:left;word-wrap:break-word;">
          [(#ENV*{html,#ENV*{texte}|replace{'<','&lt;'}|facteur_nl2br_si_pas_autobr|propre|replace{'<br />\s*<br />(\s*<br />)+?','<br /> <br />'}|concat{'<br /> <br />'}})]
        </div>
      </center>
      </body>
      </html>

    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