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

  • 5

    Bonjour,
    Petit soucis sur 2 de mes sites qui sont chez des hébergeurs différents. Alors que jusque là les messages fonctionnaient très bien, aujourd’hui impossible d’envoyer des messages depuis les sites et la fonction test de facteur (quelle que soit la config choisie php ou smtp) ne fonctionne pas et retourne des erreurs ou alors me dit que l’email test a été envoyé mais en fait on ne reçoit rien.
    Je ne vois pas où est le problème.
    SPIP 3.2, Escal v3.87.47, PHP 5.6.8 pour l’un et 5.4.45 pour l’autre
    Yann

    • Mais « aujourd’hui » quoi ? Tu as fait des modifs entre temps ? Si le plugin n’a pas bougé, c’est que ça viendrait d’un autre changement ?

    • Je n’ai fait aucune modification. Les seuls plugins qui ont étémis à jour sont : Agenda, Escal et Saisies. L’un de mes sites utilise la fonction mail de PHP. Quand j’utilise la fonction tester de facteur, 9a me dit que l’email est envoyé mais je ne reçois rien. Quand j’essaie sur le site public j’obtiens le message d’erreur : Erreur : à cause d’un problème technique, l’email ne peut pas être envoyé.

      Pour l’autre site qui est chez un autre hébergeur, j’utilise SMTP. Le test dans facteur me donne le message : SMTP Error : The following recipients failed : webmestre45@free.fr : : Relay access denied
      et en testant sur le site public j’obtiens : Erreur : à cause d’un problème technique, l’email ne peut pas être envoyé.

    • Il me semblait qu’avant l’envoi du message il y avait une prévisualisation. Or je n’ai plus cette prévisualisation.

    • Bah ça ressemble plus à un problème SMTP chez ton prestataire.

      Dans tous les cas, moi qui suis aussi chez Free, ya eu au moins 2j complet depuis le week-end avec des coupures complètes, aucun mail qui n’arrivent et parfois qui partent mais lentement.

    • Bonjour,
      Merci. Je me suis rapproché de mon prestataire et effet quelques règles avaient changé. J’ai donc paramétré en conséquence et tout fonctionne. Pour le second site qui est chez Free, je comprends mieux s’il y a eu 2 jours de coupure. Cela semble fonctionner de nouveau.

    Répondre à ce message

  • J’ai toujours des soucis avec l’envoi d’emails. Sur l’un des sites, j’ai désactivé tous les plugins non nécessaires et je n’ai laissé que ceux nécessaires aux emails (facteur, formulaires de contacts avancés, formidable. J’ai fait un test d’envoi à partir du site et j’ai été obligé de cliquer 3 fois avant d’obtenir le message d’envoi. Les 2 premières fois un message m’invitant à renouveler l’opération s’affichait. Je n’ai rien reçu dans la boîte mail, par contre le message est bien enregistré (3 fois) dans Spip. J’y perds mon latin.
    Yann

    Répondre à ce message

  • 5

    Bonjour et merci pour ce plugin,

    Ce n’est pas une question mais une suggestion afin de rendre compatible le plugin pour les version 2.0,2.1 de SPIP avec PHP 7.
    J’ai réussi à le faire fonctionner en remplaçant des fonctions qui n’existe plus dans /auto/facteur/phpmailer-php4/class.phpmailer.php :
    -  ligne 470 :

    $toArr = split(',', $to);

    =>

    $toArr = explode(',', $to);


    -  j’ai commenté les lignes 1217, 1218 et 1222 car tout ce qui magic quotes n’existe plus, il faudrait donc ajouter une condition selon la version de PHP
    -  ligne 1723 :

    $fileParts = split("\.", $filename);

    =>

    $fileParts = preg_split("\.", $filename);
    • En fait je me rend compte que ce n’est pas phpmailer-php4 qui doit être appelé mais phpmailer-php5.
      Le problème vient de ces lignes dans classes/facteur.php :

      if (intval(phpversion()) == 5) {
      	include_spip('phpmailer-php5/class.phpmailer');
      	include_spip('phpmailer-php5/class.smtp');
      } else {
      	include_spip('phpmailer-php4/class.phpmailer');
      	include_spip('phpmailer-php4/class.smtp');
      }

      Comme la version est 7 il va dans le else et charge phpmailer-php4...

    • Merci,

      corrigé.

      https://zone.spip.org/trac/spip-zone/changeset/106412
      Mais attention, il est pas certain que d’autres fonctionnalités de SPIP 2.1 soient compatibles PHP 7.

    • Merci.
      Il me semblait que SPIP 2.1 était compatible avec PHP 7. En tout cas je n’ai pas eu de problème jusqu’ici.

    • Non 2.1 n’est pas du tout officiellement compatible PHP7, il n’y a aucune assurance que ça marche bien partout et que ça continue de marcher au fil du temps. Il était même question de créer une nouvelle branche 2.X dédiée pour assurer la compat PHP7, mais donc la 2.1 ne l’est pas même si certains trucs peuvent fonctionner. Le conseil est donc plutôt de rester sur un PHP5.X, et si on ne contrôle pas l’hébergement, le mieux (et dans tous les cas c’est le mieux) est de migrer vers SPIP 3.X.

    • Je m’étais référer à ce lien https://contrib.spip.net/SPIP-et-PHP7 qui sort en premier sur google avec la recherche « spip 2.1 php 7 » mais il semblerait qu’il s’agisse plutôt d’un brouillon.
      Effectivement cette page https://www.spip.net/fr_article4351.html ne mentionne pas de compatibilité. Ceci dit ça tourne sans problème chez moi, c’est parfois les plugins qui peuvent poser problème.

    Répondre à ce message

  • 3

    Bonjour,
    J’ai un souci lors de la configuration de Facteur avec le smtp de Gandi en simple hosting, le nom d’hôte indiqué par Gandi : « ssl ://mail.gandi.net » est considéré comme n’étant "pas correct" par le formulaire.

    Problème de fonction vérifier ou type d’adresse smtp non conforme au standards ?

    • Essaye plutôt de juste mettre le domaine, et de cocher que c’est en SSL.

    • Merci, ça a bien fonctionné.

    • gillesq, peux-tu me dire exactement quels réglages tu as mis pour le facteur ?

      De mon côté j’ai fait de nombreux tests sans succès.

      actuellement mon réglage est le suivant :
      Hôte : gandi.net
      Port : 465
      Authentification : email complet + mot de passe
      Connexion sécurisée : SSL
      Validation : le certificat SSL du serveur SMTP est émis par une Autorité de Certification (recommandé).

      avec comme hôte mail.gandi.net le résultat est le même :
      « SMTP connect() failed. https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting »

      Merci d’avance,

      Hervé

    Répondre à ce message

  • Bonjour,

    Je viens demandé de l’aide à propos de ce plugin, que je connais très bien et utilise depuis quelque temps déjà sur plusieurs site couplé avec l’API Mailjet (pas de soucis avec Sparkpost par exemple)

    Depuis trois jours, aucun emails ne partent lorsque je fais un envoi vers un destinataire unique en utilisant la fonction « newsletter_send_dist » issu du plugin Mailshot pour le plugin Newsletter.
    Par exemple quand je veux m’envoyer une infolettre de test (Plugin Newsletter), un message vert me dit que « La newsletter a bien été envoyée à (mon email » mais le mail n’arrive plus chez Mailjet. Je trouve ensuite dans mes logs (mailshot_send.log) :
    Erreur Envoi mail (mon email) via Facteur :

    Je suis sous SPIP 3.0.24, tous les plugins à jour.
    L’envoi sur une liste de diffusion fonctionne et les test d’envois via la page de configuration de Facteur fonctionne très également.

    J’ai plusieurs sites impactés, j’utilise la fonction « newsletter_send_dist » dans plusieurs fonctions sur mes sites... autant dire que je suis dans la mouise :(

    Je vous remercie par avance de vos lumières !

    Jul

    Répondre à ce message

  • 8
    Pierrot

    Bonjour,

    Je me demandais si quelqu’un avait déjà fait fonctionner Facteur avec MailJet ?

    J’ai le cas d’un site ou l’envoi par Facteur+Mail() marche, l’envoi avec MailShot+MailJet marche, mais si j’essaye Facteur+MailJet, marche pas, avec les mêmes identifiants que dans MailShot ... J’ai essayé avec les ports 25, 465, 587 avec la sécurité correspondante ...

    J’ai cette erreur qui vient de PHPMailer, c’est tout, spip me dit juste que Oups. Une erreur inattendue a empêché de soumettre le formulaire. Vous pouvez essayer à nouveau.

    2017-04-19 13:56:33 92.154.37.49 (pid 13204) :Pri:ERREUR: parent::Send() : SMTP connect() failed. https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting

    Ça ressemble à une erreur d’authentification, mais bon, ça marche avec MailShot mais par l’API donc, bien qu’à priori les identifiants SMTP de MailJet soient identiques aux identifiants API. Au niveau domaine, SPF et DKIM, tout est ok bien sûr, ça marche avec MailShot.

    Une idée ou je pourrai gratter pour identifier le souci ? et savoir si quelqu’un a déjà réussi Facteur+Mailjet serait intéressant.

    Merci d’avance !
    Pierre

    • Ya pas un problème avec TLS/ancien SSL ? Jamais utilisé Mailjet par le SMTP directement donc je peux pas trop aider.

    • Pierrot

      Ben j’ai essayé TLS/587, TLS/465, SSL/587, SSL/465 et même sans rien port 25, rien ne marche ... J’ai aussi testé CA officielle ou auto-signé (mais bon MailJet doit bien avoir un vrai certif SSL) ..
      J’ai aussi testé directement depuis un client lourd (Thunderbird) avec ces identifiants SMTP, ça marche ... On dirait vraiment que c’est Facteur ou PHPMailer qui a un souci avec MailJet ...

      Si quelqu’un d’autre a déjà fait ça, ce serait intéressant de le savoir :-)

      Question annexe : MailShot utilise PHPMailer ?
      PS : tout est à jour bien sûr.

    • Hello Pierrot,

      je me suis confronté également à cette idée de Facteur + MailJet mais cela ne peut pas marcher en l’état.

      Dixit la hotline de Mailjet : « Lа méthode d’authentification que nous proposons est uniquement via la clé API / la clé secrète » . Mailshot propose cette méthode d’authentification, mais pas Facteur

    • pierrot

      Erational a répondu qu’il y arrivait (sur la liste Spip zone) mais moi non avec la même configuration (port 587 mais sans SSL ni TLS) ...
      J’avais déjà lu la doc Mailjet et ça n’explique pas pourquoi j’y arrive avec Thunderbird qui fait du SMTP normal ...

    • siromac

      Bonjour,

      Je vois que je ne suis pas le seul !
      Donc même problème avec le couple facteur/Mailjet.

      Quand je fais tester un envoi , il me dit : « L’email de test a correctement été envoyé »
      (SMTP correctement configuré avec leurs paramètres et le port 587 sans TSL/SSL).

      Mais je ne reçois rien !

      en PHP cela fonctionne normalement.

      Heureux de vous lire.

    • siromac

      Bjr !

      En fait cela fonctionne si on n’oublie pas de déclarer le nom de domaine dans l’interface de Mailjet.
      Ce que j’avais omis...

      Méa Culpa donc

      Et Merci Rasta et les autres pour votre excellent travail de dev pour Spip !

    • Pierrot

      Quel hébergeur ? moi de mon côté j’ai bien le domaine de déclaré, mais marche pas. Il semble que ça marche chez OVH mais pas chez 1&1.

    • siromac

      Je suis chez O2switch

    Répondre à ce message

  • 1

    Bonjour,

    J’aimerais pouvoir appeler un fichier HTML qui est la réponse à un message envoyé via un formulaire spip (AR), je pense que c’est possible avec Facteur, mais je patauge…
    J’aurais peut-être dû le faire ici, mais j’explique plus en détail mon souhait sur le forum, merci à vous.

    • Un *fichier* comment ça un fichier ? On balance à Facteur un *contenu* HTML mais pas un fichier. Et toute la doc est juste au dessus, avec dans quelle clé du tableau d’options mettre le contenu HTML et le contenu texte brut. (Dans la clé… « html » tout simplement.)

      À part ça je ne vois pas trop l’intérêt de réinventer la roue, en plus en surchargeant un formulaire de la dist et donc en perdant ses changements futures quand mise à jour (puisque ça utilisera ta version surchargée).

      Il y a effectivement déjà des plugins qui font ça, dont Formidable qui permet en plus de personnaliser le contenu dans un squelette quand on veut pas ce qui est fournit par défaut. Donc sans rien avoir à bidouiller.

    Répondre à ce message

  • 4

    Bonjour,
    Depuis une dizaine de jours, lorsque je teste la configuration dans Facteur, j’obtiens le message suivant « SMTP Error : Could not authenticate ».
    J’ai contacté le support de l’hébergeur, DRI, qui m’a assuré qu’il n’a fait de changement ni sur le serveur mail ni sur serveur web.
    D’ailleurs, les messages créés dans les boîtes email chez l’hébergeur sont bien envoyés et reçus.
    Avez-vous des pistes pour résoudre ce problème car cela nous empêche d’envoyer les infolettres créés avec le plugin newsletters.
    Merci pour votre aide et tout le travail réalisé.

    • Chourak

      Bonjour,

      J’ai à priori le même souci...sur 2 sites avec 2 version différentes de Facteur (3.4.7 et 3.4.10) mais avec les mêmes infos smtp
      PHP 5.6 sur les 2 sites

      Cela fonctionnait très bien jusque ... et bien je ne sais pas exactement

      Le message d’erreur est le suivant :
      « Warning : stream_socket_enable_crypto() : SSL operation failed with code 1. OpenSSL Error messages : error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed in /**path**/plugins/auto/facteur/v3.4.10/phpmailer-php5/class.smtp.php on line 369 »

      Alors j’ai bien lu que la vérification du certificat avait failed mais je ne comprend pas pourquoi (quand ca marchait bien il y a peu de temps)

    • Chourak

      Bon en utilisant une connexion non sécurisée ca résout mes problèmes.

    • Tant mieux pour vous si cela fonctionne.
      Ce n’est pas le cas en ce qui me concerne bien que les paramètres n’aient pas changé.
      C’est gênant parce que cela nous empêche d’utiliser le plugin newsletter.

    • Je n’ai pas vraiment d’info là dessus et c’est difficile car chaque configuration a sa spécificité. Le SSL peut par exemple ne pas marcher parce que ça utilise justement SSL (obsolète, à ne plus utiliser) au lieu de TLS, et que du coup le serveur refuse le vieux truc. C’est un exemple…

    Répondre à ce message

  • 5

    Bonjour,

    J’obtiens un

    Fatal error: Maximum execution time of 300 seconds exceeded in /home/www/6ec95ea7395259b74e88d82b9e03d5/web/spip312/plugins/auto/facteur/trunk/phpmailer-php5/class.phpmailer.php on line 1088. 

    ...sur la page de configuration du facteur. Je suis en spip 3.1.3 et facteur dernière version de SVN.
    Le site est hébergé chez infomaniak. Une idée du problème ?

    Répondre à ce message

  • Bonjour,

    Je viens de rencontrer un bug assez gênant avec Facteur (+CleverMail) (SPIP 3.1.1)
    Cette lettre de 90Ko avec ses images s’est retrouvée à peser 30Mo à l’envoi.

    Il semblerait que ce soit la conjonction de 2 choses :

    1. images intégrées en dans le texte alors qu’elles sont dans le portfolio (donc, on voit une vignette cliquable qui renvoie sur l’original)
    2. [Embarquer les images référencées dans les emails] coché dans la configuration de Facteur

    Hypothèse confirmée : en passant les images dans les illustration et en renvoyant le mail, les images originales ne sont plus embarquées.

    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