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

  • Sébastien Inion

    Bonjour,

    Je voudrais installer Facteur en smtp avec mon compte 1and1.
    Déjà il ne prend pas le serveur SMTP mais j’ai vu sur des forums que je suis pas le seul.
    J’ai donc mis à la place l’adresse IP du serveur SMTP de 1and1 à savoir : 212.227.15.184

    Après classique port 587, identification mais sans SSL

    Pourtant j’ai ce message :

    SMTP Error : Could not connect to SMTP host.
    Warning : Cannot modify header information - headers already sent by (output started at /homepages/33/d353338983/htdocs/plugins/auto/facteur/phpmailer-php5/class.phpmailer.php:586) in /homepages/33/d353338983/htdocs/ecrire/inc/actions.php on line 213

    Quelqu’un a-t-il une idée ?

    Merci

    Répondre à ce message

  • 1

    Superbe, excellentissime, indispensable... de la balle ! Merci mille fois !

    Juste une question, j’ajoute simplement $headers = ’Bcc : machin@gmail.com’ . « \n » ;

    Mais la copie n’arrive pas... Quelqu’un a une réponse ?

    Merci...

    Répondre à ce message

  • 5

    Bonsoir,
    Je sèche sur un problème impliquant le plugin facteur, même si je ne sais pas exactement si ça vient de ce facteur...
    J’ai installé le plugin spip-lettres (anciennement d’Artego, mais j’ai récupéré la dernière version depuis spip-zone) qui nécessite facteur, clevermail et job queue.
    J’ai configuré le facteur pour envoyer les mails via smtp chez OVH et l’envoi d’un mail de test fonctionne correctement depuis cette configuration.
    J’ai ensuite créé une lettre et si celle-ci s’envoie correctement à l’adresse de l’auteur, quand je tente de l’envoyer réellement aux abonnés, la lettre ne part pas.
    J’ai le message « L’envoi de votre lettre est en cours et peut prendre plusieurs minutes selon le nombre d’abonnés, merci de patienter. » mais la page tourne indéfiniment.
    Je n’ai relevé rien de suspect dans les traces, à part l’absence de mail envoyé !
    Par ailleurs, ceci fonctionnait correctement en local.
    Voilà, j’espère que quelqu’un peut m’éclairer !
    Stéphane

    • Vu que le test marche pour l’envoi depuis Facteur, et qu’il s’agit d’envois depuis spip-lettres, il y a peu de chance que vous trouviez votre réponse ici. :)

      Il vaut mieux contacter l’auteur de spip-lettres, sur la liste de discussion spip-zone.

    • Merci, je le fais de ce pas.
      Si quelqu’un a déjà eu le problème, n’hésitez pas à répondre ici...

    • J’ai eu le même problème sur un site hébergé chez OVH.
      L’envoi par la moulinette ajax plante... apparement à cause de la version de PHP, il faut PHP5

      • vérifier ta version de PHP http://..../ecrire?exec=info
      • s’il s’agit de PHP4 passe en PHP5 en ajoutant simplement ces lignes à ton .htaccess
        SetEnv PHP_VER 5
    • Merci beaucoup pour cette réponse.
      J’étais arrivé à la même conclusion hier alors que j’étais passé sur spip-listes (qui avait un pb aussi avec PHP 4).
      Le problème venait bien du plugin facteur donc... Quelle fonction n’est pas compatible ?

    • Ben non ça ne vient pas du plugin Facteur, lui il ne fait qu’envoyer UN par UN les mails et il marche très bien puisque vous avez fait le test.

      C’est ce qui utilise ce plugin qui ne marche pas en PHP4. Donc je répète : ça ne concerne à priori pas ce forum.

      (Cela dit, on s’en fiche : PHP4 est complètement obsolète, et n’est même plus maintenu ne serait-ce que pour les bugs, c’est même limite dangereux de continuer à l’utiliser.)

    Répondre à ce message

  • 2

    Hello
    Je suis embêté avec ce plugin... à chaque fois que je récupère mon dump de site en local, il envoie la liste des nouveautés... Est-ce que ca serait une mauvaise idée de rajouter un champ dans la config genre « domaine local », qui desactiverait l’envoi smtp si on est sur ce domaine ?

    • Ben ya pas de rapport avec Facteur non ? C’est pas ce plugin qui envoie des nouveautés. Donc à priori ce serait à toi de désactiver là où se trouve réellement l’activation de l’envoi des nouveautés.

    • Si y’a un rapport, je m’explique. Pour mon site distant, j’envoie les nouveautés tous les 7 jours. Facteur est activé avec le smtp. Donc les nouveautés sont envoyées avec le smtp. Quand je rapatrie le site en local (en passant par une sauvegarde de la base), le mécanisme des nouveautés se met en marche et hop, il envoie les nouveautés, toujours avec Facteur, car je n’ai pas eu le temps de le désactiver. Donc avec un smtp. Et les nouveautés sont envoyée avec des liens correspondant évidemment à mon site en url local (en localhost si tu veux)... Donc la seule solution est de déconnecter mon ordi d’internet avant de restaurer en local puis de désactiver facteur... Et j’oublie a chaque fois.

    Répondre à ce message

  • Je viens de passer à spip 2.1.2... (avant j’étais en 2.0)
    J’ai voulu réinstaller spip-lettres mais dès que j’ajoute le plugin facteur...Il m’est impossible de visualiser la liste de plugins et par conséquent d’en ajouter...
    Qqn a déjà eu le même problème pcq moi je ne sais plus utiliser des newsletters.

    Répondre à ce message

  • 1

    Bonjour,

    Je ne sais pas si c’est une mauvaise manip de ma part, mais lorsque je veux indiquer comme serveur smtp « auth.smtp.1and1.fr » la vérification échoue (« Ce nom d’hôte n’est pas correct »).
    Ceci étant ce n’est pas un pb bloquant, puisque par l’adresse IP ça fonctionne très bien.

    Bonne continuation, et merci pour cet outil bien pratique !

    • J’ai déjà vu quelqu’un d’autre rapporter cette erreur. Il doit y avoir un problème dans l’expression régulière qui teste la forme du domaine.

    Répondre à ce message

  • Correction : la configuration est bien disponible en passant par le menu Configuration du site (nouvel onglet), mais pas en cliquant sur l’icône Outils de la liste des plugins.

    Répondre à ce message

  • 8

    Hello,

    Depuis quelques temps un soucis avec, soit facteur, soit la conf de mon serveur, fait qu’aucun mail ne part depuis le site (form de contact, newsletter, etc...)

    Chaque tentative se solde par l’erreur suivante :

    Could not instantiate mail function.
    Warning : Cannot modify header information - headers already sent by (output started at /****/******/spip/plugins/facteur/phpmailer-php5/class.phpmailer.php:586) in /****/******/spip/ecrire/inc/actions.php on line 213

    Si quelqu’un a une idée de là où ca pourrait merdouiller, je suis preneur car cela fait maintenant plusieurs jours que je cherche et teste plusieurs pistes sans résultat aucun.

    Merci par avance pour tout retour.

    • Avec tout à jour ? Et tu es allé voir les deux lignes qu’il incrimine ?

    • Oui oui tout était à jour mais j’ai enfin trouvé d’où venait le pépin. Auparvant je passais pas ssmtp comme MTA sur le serveur, branché sur le SMTP de gmail qui m’a fait comprendre à sa manière que 900+ abonnés à une newsletter c’était beaucoup trop pour lui (ca m’a même valu un blacklistage pur et simple d’une de mes adresses googleapps, choueeeette !)

      Postfix refusant clairement et enttement de fonctionner, c’est finalement l’installation et configuration d’exim4 qui m’a sauvé !

      J’attends un retour de l’admin du projet qui doit refaire un test de NL pour voir si ca tient les gros volumes.

      Affaire à suivre...

    • Ya Job Queue hein, pour pas tout envoyer en même temps. C’est ce que fait SPIP-Lettres.

    • Alors j’ai du échapper un détail dans la conf’ de l’un, l’autre ou le troisième là parce que, même du temps où la fonction mail() fonctionnait encore, le premier envoi ne s’était pas passé si bien que ça (à peine 30% de succès...) :-/

      Ya un cfg ou une page sur laquelle on peut gérer le comportement de Job_Queue à ce sujet ou c’est automatique ?

    • Non mais Job Queue ne fait rien hein. C’est un outil pour développeur qui doit appeler cette fonction. Ça fournit juste une API de fonctions à utiliser pour « add » ou pour « delete » des tâches à faire.

    • OK ! Donc ce que tu me dis, c’est que spip-lettres, via Job_queue, fait déjà ce travail de « dégroupage » des mails à envoyer, c’est ça ?

    • Ben pas de mails en général, mais des mails que CE plugin veut envoyer sachant que c’est un plugin de newsletter. Donc soit il te convient et tu peux l’utiliser tel quel, soit tu regardes son code et tu t’en inspires pour voir comment utiliser Job Queue pour ton besoin à toi.

    • Ouep ben finalement, pas eu besoin d’en faire plus. Mon admin a effectué tout à l’heure un envoi de NL et ca a plutôt bien tourné ma foi : envois réussis 964/964 :-)

      Merci pour tes retours en tout cas :-)

      Bonne soirée.

    Répondre à ce message

  • Hello,

    J’ai un petit souci sur facteur : Quand je suis déconnecté il me plante le site public et m’affiche ceci :

    Fatal error : Cannot redeclare class PHPMailer in /home/www/40a43fe8e83ha70e56cbcfda178c2770/web/plugins/auto/facteur/phpmailer-php5/class.phpmailer.php on line 43 .

    ++

    Répondre à ce message

  • 2

    bonjour,

    j’aimerais utiliser ce plugin avec le contact avancé (je ne reçois pas les mails du formulaire de contact). donc, j’aimerais voir si en passant par le smtp, ça marche... mais j’ai peur de ne pas savoir exactement ce qu’il faut écrire dans la configuration de facteur !!

    mon adresse mail est chez free.fr=> smtp.free.fr

    quand je ne renseigne que ce champ, j’ai cette erreur, au test : Erreur : The following From address failed :

    lorsque que je mets qu’il requiert une authentification, je renseigne nom d’utilisateur et mot de passe, et au test, j’ai cette erreur : Erreur : SMTP Error : Could not connect to SMTP host

    enfin, si je passe par la fonction mail() de php, j’ai cette erreur : Erreur : Could not instantiate mail function

    ps : mon site est hébergé chez ovh (demo1g, qui est une ancienne offre gratuite...)

    merci de vos réponses !!

    • Si ton serveur web est chez ovh, tu devrais sans doute plutôt envoyer tes messages via le serveur smtp de ovh.
      Ou alors chercher à atteindre le serveur de free via un autre port (587 ?) qui ne soit pas bloqué en quittant le réseau local.

    • ATTENTION : sous UNIX, si vous utilisez la fonction mail de PHP, il faut renseigner le Return-Path via l’écran de paramétrage du plugin. Sinon, message d’erreur : « Could not instantiate mail function ».

    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