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

  • 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

    2. 1

      Bonjour,

      J’ai un site sous Spip 4.1.7 / Facteur 5.0.4 sur un serveur Debian 11 / PHP 7.4.33.
      Postfix est bien installé, j’ai testé l’envoi de mail depuis la ligne de commande, tout passe bien.
      J’ai également testé la fonction mail() de PHP, qui fonctionne également, depuis un script indépendant.

      Quand j’essaie d’envoyer un mail de test par Facteur, j’ai ce message d’erreur :

      Could not instantiate mail function

      Que faire ?

      • Ah tiens, J’ai fini par trouver..
        Erreur dans la config de postfix j’avais ces messages

        postfix/postdrop[322784]: warning: uid=33: File too large postfix/sendmail[322783]: fatal: www-data(33): message file too big

        Donc j’ai ajouté un parametre dans la config
        message_size_limit=0

        Et ca marche !

        Désolé pour le bruit

      Répondre à ce message

    3. 1

      bonjour,
      un problème de configuration pour l’utilisation avec sendinblue sur un nouveau site...
      cela fonctionne pour d’autres sites (identiques à la version spip4 près)
      il y a peut-être eu un changement coté sendinblue car les anciens site sont configurés avec un expéditeur validé par des entrées TXT du DNS, alors que sur mon nouveau site, il me demande de valider le domaine lui-même... ou sinon, vérifie l’expéditeur par mail...
      En tout cas, vu de spip/facteur, je ne vois pas de différence

      et le constat, c’est que les logs spip semblent indiquer que le mail est parti, alors que les logs sendinblue ne voient rien (et que le mail n’arrive pas !)

      merci d’avance d’une piste...

      coté log facteur

      mail
      /home/venissie/spip-olp/plugins/auto/facteur/v5.0.4/inc/envoyer_mail.php L98 [facteur_envoyer_mail(),inc_envoyer_mail(),facteur_envoyer_mail_test(),formulaires_tester_facteur_traiter_dist(),traiter_formulaires_dynamiques()]
      Sent by SPIP\Facteur\FacteurSendinblue
      Date : 2023-01-17 09:59:57
      From : « Oser la Paix ! » <contact@oserlapaix.fr>
      To : pamillet@venissieux.org
      Subject : [2023-01-17 09:59:57] Ceci est un email de test accentué
      Message : Body(11687c) AltBody(4950c)

      et aussi un log que je ne connaissais pas (sans doute parceque j’ai activé le debug total ?)

      2023-01-17 08:52:49 	2a01:e0a:5d0:e4a0:168f:30eb:8d08:785a 	3756 	Privé 	debug 	
      SPIP\Facteur\FacteurBulkSendinblue: sendAlertIfNeeded sendFailFunction: NOT
      2023-01-17 08:52:49 	2a01:e0a:5d0:e4a0:168f:30eb:8d08:785a 	3756 	Privé 	debug 	
      SPIP\Facteur\FacteurBulkSendinblue: sendAlertIfNeeded Important:
      2023-01-17 08:52:49 	2a01:e0a:5d0:e4a0:168f:30eb:8d08:785a 	3756 	Privé 	debug 	
      SPIP\Facteur\FacteurBulkSendinblue: sendAlertIfNeeded {}
      2023-01-17 08:52:49 	2a01:e0a:5d0:e4a0:168f:30eb:8d08:785a 	3756 	Privé 	debug 	
      SPIP\Facteur\FacteurBulkSendinblue: Send() : result {"messageId":"<202301170752.36367733204@smtp-relay.mailin.fr>"}

      et coté sendinblue.... rien

      • un élément de plus
        sur une lettre mailshot, les envois ne démarrent pas
        et j’ai dans le log facteur bulksendinblue

        SPIP\Facteur\FacteurBulkSendinblue : initWebHooks() : Rien a faire : webhook #705475 complet

        je ne sais pas ce que ca veut dire...

      Répondre à ce message

    4. 7

      Bonjour
      :Facteur v5.0.4 spip 4.1.5
      j’ utilise facteur avec « SSL, le certificat SSL du serveur SMTP est émis par une Autorité de Certification avec une authentification »
      avec cette configuration je configure facteur vers une adresse de la messagerie du serveur qui a différents alias.

      si je j’écris a l’auteur spip a qui j’ai attribué une adresse mail égale a cette messagerie .... j’ai une erreur technique ... et pas d’envoi de mail

      si je teste la configuration facteur avec un des noms alias de la messagerie, j’obtiens « Aucune adresse email de destination valable pour l’envoi du courriel »

      j’ai un site encore en spip 4.0.6 avec facteur4.3.4 sur le même serveur pour lequel ces deux cas fonctionnent

      Est-ce un changement volontaire ? est-ce une erreur ?

      • Je ne suis pas sûr d’avoir compris avec les termes utilisés. (par ex je ne vois pas ce que veut dire « je configure facteur vers une adresse de la messagerie du serveur »)

        Est-ce que tu peux réexpliquer en utilisant les termes « adresse d’envoi », « destinataire » ? Et surtout en donnant des exemples même si fictif (quelle adresse configurée dans facteur, à quelle adresse est envoyé, etc)

      • je configure l ’adresse d envoi par défaut de facteur adresse.envoi@hotmail.com

        Problème 1

        Je met cette adresse adresse.envoi@serveur a un auteur spip toto.
        j utilise le formulaire contact pour écrire a cet auteur toto .
        Erreur.

        Si je change l adresse de l’ auteur en ad.autre@hotmail.com et que j utilise le formulaire de contact , le mail part bien

        Problème 2
        L’adresse d envoi par défaut adresse.envoi@serveur a des alias dont alia.tyty@orange.fr
        Si j écris a cet alia.tyty@orange.fr par le formulaire contact ou si je le met pour adresse de test dans ’tester la configuration de facteur ’. L envoi ne marche pas

      • Il faut aussi expliquer quelle est ta *vraie* configuration d’envoi. Car l’adresse d’envoi c’est juste déclaratif, ce qui envoie c’est la configuration du SMTP (ou fonction mail() de PHP).

        Il est plutôt interdit, par exemple, d’affirmer une adresse d’envoi qui ne correspond pas aux droits à envoyer par le SMTP qui envoie (concrètement si l’adresse d’envoi c’est @hotmail, ton SMTP d’envoi devrait être celui de hotmail, pour le cas courant).

      • La configuration facteur SMTP est égale a l adresse d envoi par defaut adresse.envoi@serveur

        L envoi de mail fonctionne si j écris a une adresse différente de l adresse SMTP par exemple ad.autre@hotmail par l intermédiaire du formulaire contact de la dist.
        Ce qui ne marche plus c’est si j écris a l adresse SMTP adresse.envoi@serveur ou a un de ses alias alors que cela fonctionnait avant

      • Bon en fait avec cette version il suffit de ne pas mettre l adresse SMTP a un auteur et de mettre cette adresse SMTP en copie dans la conf facteur pour que le message soit aussi envoye à cette adresse

      • Je ne comprends toujours pas vraiment, car ça n’existe pas une « adresse SMTP ».

        Il y a *l’adresse d’envoi*, qui est une adresse *déclarative*, qui correspond à ce qui sera mis dans l’entête « From » de l’email pour savoir de qui ça vient. Mais cela ne préjuge absolument pas, *du serveur réel* avec lequel sera envoyé l’email. Et qui lui est configuré dans la configuration de l’envoi, càd soit la fonction mail() de PHP, soit un serveur SMTP *précis*. Et donc bien un « serveur SMTP », pas une « adresse SMTP ». Càd un domaine, un port, un identifiant mdp, etc. C’est ça la configuration de l’envoi dont je demandais quelle était-elle.

        Comme dit plus haut, en théorie l’adresse d’envoi déclaré (pour le From) DEVRAIT correspondre le plus souvent à une adresse autorisée du serveur d’envoi configuré (autrement dit si on déclare utiliser une adresse @hotmail pour le From, alors il faut normalement configurer pour utiliser le SMTP de hotmail pour faire les envois, dans le cas courant où on utilise pas un prestataire dédié comme Mailjet etc).

      • je m’exprime mal mais c’est bien ce que je fait et cela fonctionne.
        un mail envoyé par le site a un auteur spip est bien reçu.
        L’utilisateur / mot de passe SMTP correspond a un compte ( webmail) qui a des alias qui envois le courrier reçu vers des adresses mail associés ( free, hotmail etc).
        je peux aussi envoyer un mail par ma messagerie ( donc sans passer par le site) a cet utilisateur / mot de passe et chaque adresse de l’alias reçois le mail.

        ce qui ne fonctionne plus c’est quand je met cet utilisateur / mot de passe comme mail d’un auteur SPIP
        .
        laisse tomber. je vais simplement ne pas mettre cela a un auteur mais en copie des mails de facteur.

      Répondre à ce message

    5. 1

      Bonjour,

      Avec les services pro d’OVH, la connexion SMTP doit suivre le protocole STARTTLS.
      Or, facteur ne propose pas ce mode :(

      Tout ce que facteur affiche lorsqu’on tente un test, c’est :

      SMTP Error : data not accepted.

      Est-ce que c’est une erreur de paramétrage de notre côté, ou une limitation de facteur insurmontable ?

      • starttls c’est tls, mais plus souple, avec un démarrage en clair non chiffré, donc à priori la lib sait forcément le gérer… mais j’avoue que suivant les serveurs et les combinaisons de mode, ports, etc des fois c’est le tatonnage pour trouver.

      Répondre à ce message

    6. Bonjour à tous,
      Le plugin fonctionne bien, j’ai associé à un compte gmail pour l’envoi
      Seulement je recois toujours ce message d’erreur dans les mails envoyés :

      Erreur d’exécution plugins/auto/facteur-2c4f9-v4.1.1/emails/texte.html

      Quelqu’un saurait il me dire ce qui ne va pas ? Je suis sous Spip 4.0.0 et facteur 4.1.1

      Répondre à ce message

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

      Répondre à ce message

    8. 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 grandes méchantes 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.

      Répondre à ce message

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

      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