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

143 discussions

  • Je suis en train de tester une installation de Spip 4.2 avec le Plugin Sarka-Spip sur une MV en NAT elle-même installée sur un PC portable. Je suis un particulier abonné Orange. Installation du site Ok, connexion locale et publique Ok, j’en suis venu à tester l’envoi de mail (pour la génération de mot de passe par ex.) et là cela n’a pas fonctionné.

    Après quelques recherches j’ai fini par installer le plugin Facteur et configurer son envoi par SMTP avec comme hôte smtp.laposte.net (oui je sais j’aime compliquer les choses), tout fonctionne correctement SAUF lorsque dans la configuration de Facteur je mets en copie (cachée ou non) mon adresse orange et que je teste un envoi sur cette même adresse

    Aucune adresse email de destination valable pour l’envoi du courriel.

    Ce n’est pas dramatique me direz-vous si ce n’est du qu’à l’identité des adresses et non à l’identité du domaine @orange.fr, mais est-ce normal ? En effet je ne vois pas pourquoi cela ne fonctionne pas.

    Répondre à ce message

  • Bonjour, j’ai un problème avec le couple Formidable/Facteur.
    J’utilise Facteur avec la configuration SMTP. Lorsque j’envoie le mail de test, je le reçois bien.
    nous avons configuré notre formulaire de dons pour en recevoir une copie par mail, en plus de l’enregistrement.
    Mais lorsque les internautes utilisent notre formulaire de dons, la procédure se déroule bien, les dons se font via l’interface de paiement, mais nous ne recevons pas de mail de confirmation.
    Dans les logs de Facteur, j’ai le message :
    « 2023-12-19 17:30:48 51.68.11.203 (pid 16472) :Pub:ERREUR : SPIP\Facteur\FacteurSMTP : parent::Send() : SMTP connect() failed. https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting »
    Je vous joins une impression d’écran de ma config de facteur, si cela peut vous donner des idées.
    Le plugin est à jour, mais je suis encore sous Spip 4.0.11
    Bonne soirée,
    Éric LM

    Répondre à ce message

  • 1

    J’ai un problème depuis cet été : environ 10% des mails d’une liste avec 890 inscrits ne sont pas delivrés. Les adresses mail sont pourtant valides.

    Le journal du plugin facteur indique pour chacun de ces mails non-délivrés :
    SPIP\Facteur\FacteurSMTP : parent::Send() : SMTP connect() failed.

    Je ne vois pas ce que ça peut être. Avez-vous une idée ?

    Méthode d’envoi : Mailjet.
    Spip : 4.2.2.
    Facteur : 5.0.5
    Mailshot : 3.0.12

    • Hello, dans la majorité des cas, ce n’est pas dans SPIP que tu peux voir ça, mais bien chez ton prestataire, en l’occurrence là Mailjet. Donc il faut aller dans leur interface d’admin, et voir les divers retours et erreurs rencontrées.

    Répondre à ce message

  • 5

    Bonjour,

    Je reviens chercher de l’aide sur Webhook failure / Mailjet en ouvrant une nouvelle question plutôt que ma réponse il y a 2 semaines au poste de alain bourdeau qui datait de 2022 car je n’ai toujours pas de solution à ce jour.

    Sur un site vieux de 4 ans, avec 2 à 3 news par an, sans aucun problème, j’ai soudain eu une alerte de Mailjet en juin cette année, et à nouveau en septembre, suite à l’envoi de 2 newsletters.
    Le site était encore en SPIP 3.2 en juin, et je n’avais rien changé, ni mise à jour ni réglages, puis passé en SPIP 4.2 avec mise à jour des plugins en août, et même alerte à nouveau.

    « Webhook failure… It seems one of your webhook is unresponsive and fails to process the events we are pushing. Etc. » pour la deuxième fois consécutive.

    Je ne comprends pas pourquoi, ni à quoi correspond l’URL https://monsite.fr/mailshot_webhook.api/mailjet
    De quoi parle-t-on ici ? Rastapopoulos parlait du .htaccess dans un précédent post… Mais que faudrait-il y ajouter exactement comme ligne ? Est-ce que ça suffirait pour ne plus avoir d’alerte ?

    D’ailleurs, n’est-ce pas étrange que Mailjet parle de Responsive alors qu’il semble qu’on parle d’autorisation d’accès ?
    En effet, si je teste l’adresse https://monsite.fr/mailshot_webhook.api/mailjet il y a bien une erreur 403 refus d’accès…

    D’avance merci pour vos explications / solutions pour que mon client ne reçoive plus ces alertes de Mailjet (pour autant, j’ai bien les statistiques des mails livrés / ouverts / bloqués hard et soft, etc.)
    Je sèche totalement malgré mes recherches !

    • Déjà tu as bien le .htaccess activé ? et un .htaccess à jour (celui de la version en cours de SPIP utilisée) ?

    • Merci Rastapopoulos pour ta réponse rapide.
      … Alors oui il est activé, si on parle de celui à la racine, et je viens de regarder, ouch, c’est encore celui de la version SPIP 3.2, car en effet j’ai laissé mes propres redirections dedans et n’ai pas pensé à le mettre à jour lors du passage en 4.2 en août.
      … Pour autant, en juin lors de la première alerte webhook, c’était encore un SPIP 3.2 qui tournait depuis 4 ans avec son .htaccess activé, avec des newsletters envoyées 3 fois par an sans aucun problème (la dernière avant les alertes webhook, fin janvier 2023).

    • Je n’aurai pas la possibilité de savoir si l’alerte cesse grâce à la mise à jour du .htaccess avant l’envoi de la prochaine newsletter… en janvier.
      Pour autant, la première alerte est arrivée en juin avec un SPIP 3.2 qui n’avait pas bougé depuis 4 ans, ni les plugiins, et c’était le bon .htaccess 3.2… Je n’ai pas l’impression que ça en soit la raison.

    • Facteur n’ayant rien à avoir avec Mailjet comme tu peux le non-voir dans le code, ta question porte plutôt sur le plugin Mailshot qui gère l’envoi en masse des lettres, généralement en passant par un lien avec un serveur externe. Donc tu devrais plutôt poser ta question dans le plugin Mailshot, qui depuis SPIP 3 a reçu de nombreuses mises à jour (dont pas mal sur les liens avec les services externes).

    • Je te remercie pour cette piste et cet éclaircissement, je vais donc creuser du côté de Mailshot ces jours-ci pour tenter de comprendre cette première alerte sur un site qui n’avait pas bougé alors (pas le souvenir d’avoir mis à jour aucun plugin avant la première alerte… pour ne pas dire que j’en suis sûre – mais bon, parfois on peut perdre le nord 😅)
      Bonne soirée

    Répondre à ce message

  • 8

    Bonjour,
    Sous spip 4.0.6, php 7.4.18 et Facteur 5.0.3 en lien avec Maishot 3.0.7 et MailSubscribers 3.0.8.
    J’utilise le lien smtp MAILJET.
    Si c’est prévus quelle est l’adresse locale que je dois déclarer pour les échanges des Webhooks de mailjet ?.
    J’ai créé les dossiers /mailshot_webhook.api/mailjet/ au même niveau que Spip et conforme à l’adresse proposée par mailjet. Je n’ai rien en retour dans ces dossiers.
    Merci bien
    Alain BOURDEAU

    • Je n’ai rien compris à ce que tu essayes de faire. Il n’y a strictement aucun « dossier » à créer (pourquoi des dossiers ? de quoi ?). Ya juste à configurer des choses dans l’interface quoi, les clés d’API fournies par le service choisi (ici mailjet donc).

    • C’est tout simplement savoir comment utiliser ce qui est proposé par Mailjet (voir la capture d’écran suivante).
      J’ai néanmoins les notifications par courriel des désinscriptions ou des inscriptions.
      Merci bien

    • En complément, ne plus avoir ce type de message de Mailjet :
      Webhook failure

      It seems one of your webhook is unresponsive and fails to process the events we are pushing.

      API key : xxxxxxx
      Webhook endpoint : https://choeurcrescendo.fr/mailshot_webhook.api/mailjet/

      Please resolve the issue with this webhook before 2022-05-20 14:35 UTC. After this date, we will stop sending events to your webhook.

      If you have any questions, please contact our Support Team.

      Sincerely,
      The Mailjet team
      This email was sent to you by Mailjet because you signed up for a Mailjet account. Please let us know if you feel that this email was sent to you by error.

    • Mais ça n’a pas de rapport avec Facteur. Faut juste configurer dans la config de avec ce qui est demandé, les clés d’API quoi. Mais pour Mailshot c’est propre à sa config donc, dans son peanneau de config (et dans son forum si ya un problème).

    • En complément, ne plus avoir ce type de messages de Mailjet :

      Webhook failure

      It seems one of your webhook is unresponsive and fails to process the events we are pushing.

      API key : 2f2a8367c7f629897517e64635f6ca26
      Webhook endpoint : https://choeurcrescendo.fr/mailshot_webhook.api/mailjet/

      Please resolve the issue with this webhook before 2022-05-20 14:35 UTC. After this date, we will stop sending events to your webhook.

      If you have any questions, please contact our Support Team.

      Sincerely,
      The Mailjet team
      This email was sent to you by Mailjet because you signed up for a Mailjet account. Please let us know if you feel that this email was sent to you by error.

    • Mais t’as bien le .htacess fourni par SPIP ? Sinon les URL d’API peuvent pas marcher… (toutes les URL spip/truc.api/etc)

    • Merci bien,
      Justement, je ne l’avais pas activé !!!
      Je viens de le faire, y a plus qu’a voir si « c’est mieux », ce dont je ne doute pas puisque tes conseils techniques sont rarement pris en défaut.
      Amicalement Alain BOURDEAU

    • Bonjour,
      Je viens sur ce fil car j’ai le même problème et je ne le comprends pas non plus.
      Sur un site qui existe depuis 4 ans, avec 2 à 3 news par an, j’ai eu cette même alerte de Mailjet pour la premère fois en juin, suite à l’envoi d’une news. Le site était encore en SPIP 3.2, alors que je n’avais rien changé, ni mise à jour ni réglages, et que je n’avais jamais eu ce type d’alerte auparavant.

      Passé en SPIP 4.2 cet été, j’ai à nouveau eu, en septembre sur un nouvel envoi, la même alerte à propos de :
      « Webhook failure… It seems one of your webhook is unresponsive and fails to process the events we are pushing. Etc. » pour la deuxième fois de suite.

      Je ne comprends pas pourquoi, ni à quoi correspond l’URL https://monsite.fr/mailshot_webhook.api/mailjet
      De quoi parle-t-on ici ? Rastapopoulos, tu parles du .htaccess… le principal à la racine j’imagine… Que faut-il y ajouter exactement comme ligne ? Est-ce que ça suffit ?

      C’est étrange que Mailjet parle de Responsive alors qu’il semble qu’on parle d’autorisation d’accès ?
      En effet, si je teste l’adresse https://monsite.fr/mailshot_webhook.api/mailjet il y a bien une erreur 403 refus d’accès…

      D’avance merci pour vos explications / solutions.
      Bonne journée

    Répondre à ce message

  • 1

    Bonjour,

    Une erreur PHP surgit lors de l’envoi d’un mail avec la configuration suivante :

    • PHP : 8.2.7
    • SPIP : 4.2.4
    • Facteur : 5.0.5
    Deprecated: Use of "parent" in callables is deprecated in ..plugins/auto/facteur/v5.0.5/inc/Facteur/FacteurMail.php on line 572

    Pensez-vous pourvoir la corriger ?

    Merci pour votre réponse et pour ce super plugin !

    Répondre à ce message

  • 2
    Urs Riggenbach

    Hello,
    In the SPIP 4 version, there is a change on how html2text is called.
    Maybe you could update the guide here to reflect that ?

    With SPIP 4 :

    include_spip('classes/facteur');
    $facteur_mail_html2text = charger_fonction('
    $message_texte = $facteur_mail_html2text($message_html);

    before SPIP 3 :

    include_spip('classes/facteur');
    $message_texte	=  Facteur::html2text($message_html);

    Also, it seems that the facteur html2text function is not identical to the PHPMailer html2text function.

    Thank you for the great work on this very useful plugin over the years !

    • Urs Riggenbach

      Correction, with SPIP 4 :

      include_spip('classes/facteur');
      $facteur_mail_html2text = charger_fonction('facteur_mail_html2text', 'inc');
      $message_texte = $facteur_mail_html2text($message_html);
    • Thanks, I made the correction in the doc !

    Répondre à ce message

  • 3

    Hello,
    y a-t-il un moyen de choisir l’article/le contenu utilisé par facteur pour tester la configuration : « ceci est email de test accentué » ?

    Répondre à ce message

  • Bonjour,

    J’ai détecté ce qui me semble être une anomalie dans la lib mardownify en PHP 8, quand j’utilise la fonction facteur_mail_html2text j’ai une fatal si j’ai des tags HTML qui n’existe pas dans les fonctions flushStacked_XXX de la lib, en cause :
    call_user_func(array(&$this, 'flushStacked_' . $tag));

    Corrigé par :

    if (function_exists('flushStacked_' . $tag)) {
        call_user_func(array(&$this, 'flushStacked_' . $tag));
    }

    Cette limitation de tag est-elle voulu ? Je trouve que c’est assez limitant vu qu’on ne peux même pas mettre un

      Répondre à ce message

    1. Petite astuce : dans le cas d’OVH et d’un SMTP sendinblue
      il faut indiquer le port 2525 (le port 587 ne fonctionne pas)

      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