MailCrypt version 2

MailCrypt remplace les liens de courriels dans vos textes par un lien javascript afin d’éviter que des robots spammeurs ne collectent les emails affichés sur votre site. La modification est transparente sur un navigateur disposant de javascript. Lorsque javascript n’est pas installé, le mail reste compréhensible par un être humain.

Historique

MailCrypt a d’abord été développée par Paolo sous forme de contribution pour SPIP 1.8.3 puis portée sous forme de plugins pour SPIP 1.9 avec l’aide d’Alexis Roussel (voir Mailcrypt, système antispam). Elle a ensuite été intégrée au Couteau Suisse et améliorée par Patrice Vanneufville (voir De beaux liens hypertexte). Enfin, Joseph a mis à jour le plugin autonome pour SPIP 2.1 en reprenant les avancées apportées par le Couteau Suisse.

Fonctionnement

Ordinairement, SPIP transforme le raccourci suivant [->nom@domaine.org] produit le code HTML :

<a href="mailto:nom@domaine.org" class="spip_mail">nom@domaine.org</a>

L’adresse nom@domaine.org est de fait directement accessible à deux endroits : dans le lien (attribut href de la balise <a>) et dans le texte du lien.

Une fois activé, MailCrypt 2 détectera automatiquement les courriels présents dans le texte, qu’ils soient en lien et/ou en texte du lien. Ainsi, [->nom@domaine.org] produira le code HTML :

<a href="#" title="nom..åt..domaine.org" onclick="location.href=mc_lancerlien('nom','domaine.org'); return false;" class="spip_mail">nom<span class="mcrypt"> chez </span>domaine.org</a>

Visuellement, cela ressemblera à nom chez domaine.org.

En l’absence de javascript, le lien est inopérant : un clic sur le lien ne produira rien. Cependant, l’adresse email sera visible au survol du lien dans un format compréhensible par un être humain (nom..åt..domaine.org) de même qu’un email dans le texte sera affiché sous la forme : nom chez domaine.com. Cette forme ne contient pas d’arobase (@) et ne sera donc pas détectée par un robot mais reste compréhensible par un être humain, le texte chez [1] devant être remplacé par un @ pour obtenir l’adresse email complète.

Lorsque javascript est actif, le lien devient opérationnel, la fonction mc_lancerlien permettant de reconstituer le mail complet et de le transmettre au navigateur. Pour le visiteur, l’opération est totalement transparente. De plus, via jQuery, une fois la page chargée, le texte du mail ainsi que le titre du lien sont corrigés pour réintroduire l’@ au bon endroit. Le visiteur verra alors : nom@domaine.org.

Filtres propre et mailcrypt

MailCrypt utilise le pipeline post_propre pour détecter et protéger les courriels. Il sera donc sans effet sur un email indiqué en dur dans un squelette ou dans une balise qui ne passe pas par la fonction propre.

Pour appliquer MailCrypt sur ces balises dans votre squelette, vous pouvez soit leur appliquer le filtre |propre (ce qui entrainera également le traitement de tous les raccourcis SPIP) soit juste le filte |mailcrypt qui ne traitera que les courriels.

Pour un courriel indiqué en dur dans votre squelette, vous pouvez faire :

[(#VAL{<a href="mailto:nom@domaine.com">nom@domaine.com</a>}|mailcrypt)]

Remarques sur la protection des adresses emails

Bien que MailCrypt permette de bloquer la plupart des robots collecteurs d’adresse email, il est toujours possible pour un programmeur voulant spécifiquement récupérer les mails de votre site de prendre le temps d’analyser le contenu de vos pages pour créer un programme spécifique de collecte des adresses email.

Le moyen le plus sûr pour éviter qu’un email ne soit récupéré est de ne jamais l’afficher. Il reste possible de fournir des formulaires de contact qui permettront aux visiteurs de votre site de vous envoyer un email sans pour autant connaître votre adresse. Pour cela, vous pouvez utiliser la balise #FORMULAIRE_ECRIRE_AUTEUR, le plugin Formulaire de contact avancé ou encore le plugin Contact Libre.

Notes

[1Traduit selon la langue du contexte, par exemple at en anglais.

Discussion

17 discussions

  • Chourak

    Bonjour,

    J’ai identifié un léger souci que je n’arrive pas à corriger :

    Dans le cas d’une adresse de courriel protégée dans un squelette, si ce squelette est inclus en ajax et piloté via un ajaxReload on se retrouve avec le lien mail sans l’arobase mais avec le « chez ».
    J’ai pensé à la solution de lancer la fonction mc_lancerlien au callback de l’ajaxReload sans succès.

    Et je suppose que c’est le même genre de souci qu’on peut retrouver dans les infobulles de GIS.

    Y’a t’il un moyen de palier à ce problème ?

    Bien cordialement,

    Répondre à ce message

  • Bonjour,
    Je voudrais utiliser #TEXTE|maildecrypt dans une newsletter mais cela ne fonctionne pas (les adresses emails ne sont pas cliquables dans l’infolettre reçue).
    Je n’utilise pas le couteau suisse, seulement le plugin Mailcrypt.

    Y-a-t-il un autre moyen de désactiver Mailcrypt sur certain champs ?

    Merci

    Répondre à ce message

  • 1

    Je note une différence de comportement dans les traitements fait sur les adresses email avec ou sans lien.

    Prenons un article avec dans le texte une phrase seule avec une adresse email :

    «Contacter toto@domain.tld»

    Il est transformé en « toto chez domain.tld » (et pas de javascript).

    La même phrase avec un lien est affiché avec un @ et du javascript :

    - «Contacter [->toto@domain.tld]»
    - «Contacter [->mailto:toto@domain.tld]»

    Un mélange des 2 et le premier exemple a aussi @ et du JS :

    - «Contacter tata@domain.tld et [->toto@domain.tld]»

    J’aurais préféré que tout soit modifié comme dans les 2 derniers exemples (@ + js). Mais en tout cas il y a une différence de traitement sur un courriel seul, s’il y a ailleurs un lien ou pas dans le texte.

    • Pardon, précisions pour :

      - «Contacter tata@domain.tld et [->toto@domain.tld]»

      Le premier email a bien l’@ (et pas « chez »), mais pas le JS évidemment.

      <span class="mcrypt">@</span>

    Répondre à ce message

  • Bonjour,

    Sur une version SPIP 3.1 en php 7 et avec le plugin mailcrypt en version 2.4.2, je constate qu’en cliquant sur un lien mailto, il manque l’arobase @ dans les adresses récupérées par les webmails et logiciels de messagerie.

    Le même défaut se retrouve avec la lame du couteau suisse...

    Cordialement,

    Raphaël

    Répondre à ce message

  • Bonjour,

    Les adresses email dans le champ descriptif d’un point GIS sont inopérantes (site en 3.21 plugin Mailcrypt à jour).

    Le lien [mail->nom@wanadoo.fr] renvoie à la page en cours : http://www.site.org/-rubrique-8-#nom#mc#wanadoo.fr#
    (il y a une carte GIS avec des points sur cette page rubrique et le lien mail est dans la bulle GIS)

    et cela donne une erreur visible dans les logs :
    [error] [client xxx] File does not exist : /srv/d_site/www/www.site.org/htdocs/mc_lancerlien(’nom’,’wanadoo.fr’) ;

    J’ai testé sur 2 navigateurs différents

    dd

    Répondre à ce message

  • 3

    Bonjour,

    Quelle différence d’efficacité entre « MailCrypt version 2 » et la lame du Couteau suisse « MailCrypt » ?

    Les deux peuvent-ils être utilisés ensemble ou bien l’un est-il plus efficace que l’autre ?

    Merci d’avance de votre éclairage.

    • Il faut utiliser l’un ou l’autre mais pas les deux.

      Le but premier de maildecrypt2 est de ne pas avoir besoin du CS pour utiliser cette fonctionnalité.

    • Comme j’utilise déjà le Couteau Suisse pour d’autres fonctions, je vais donc lui ouvrir la lame « MailCrypt ».

      Merci du conseil ;)

    • Effectivement les 2 solutions sont exactement les mêmes, et elle ne doivent pas être utilisées ensemble.

    Répondre à ce message

  • 7

    Bonjour.

    J’aimerais savoir, en PHP, comment désactiver le traitement du plugin quand on génère une adresse en dur avec les classes spip puis qu’on applique le filtre propre. Parce-que sinon, on se retrouve avec quelque chose d’affreux et inopérant.

    Merci.

    • Bonjour.
      Peut-être grâce aux balises <html></html> ?
      Le Couteau Suisse en tient compte.

    • Merci ; j’essaye ça.

    • Et tout simplement le filtre maildecrypt.

    • Bonjour.

      Merci Joseph. Mais j’ai déjà implémenté la solution de Pat (r79683) et j’ai des retours comme quoi ça fonctionne. Cependant, je suis curieux de savoir comment utiliser le filtre maildecrypt (pour info, mon code récupère différents champs qu’il concatène en rajoutant sa sauce au passage $sortie .= "<html><a title='". _T('asso:ecrire_a') ." $courriel[email]' href='mailto:$courriel[email]' class='spip_out value'>"; /* ... */ $sortie .= '</a></html>'; et pour finir on fait appel à propre($sortie) et le plugin ne nécessite pas MailCrypt —ce sont ceux qui ont les deux installés qui m’ont remonté le souci)

    • La solution avec la balise HTML fonctionne dans le cas présent.

      Le filtre maildecrypt permet de supprimer les traitements effectués par mailcrypt sur une chaine de caractère qui a déjà été traité avec mailcrypt.

      Ceci étant posé, quel étaoit le problème rencontré (avant ta correction) avec mailcrypt ? En effet, le but de mailcrypt est d’éviter qu’une adresse email soit visible en clair ce qui est le cas avec ta correction.

    • Bonjour Joseph.

      Le problème qui m’avait été remonté (cf. capture) est que les adresses étaient transformées de sorte qu’elles n’étaient plus opérantes et s’affichaient étrangement (d’après le code source, que j’ai pu voir, la chaine initiale étaient coupée au niveau de l’attribut class et mal refermé)

      Je veux bien que l’adresse ne soit pas en clair (quoique je ne sais pas trop quel est l’intérêt de donner une adresse qui doit ensuite apparaitre brouillée et/ou inaccessible) ...mais même dans l’espace privé ? (les pages en PHP en question dans le cas du plugin en question sont ceux de l’espace privé)

    • Mailcrypt n’insère pas le JS de reconstruction des emails dans l’espace privé.

      Par ailleurs, je pense que l’expression régulière se plantait car on injectait du HTML là où de la syntaxe SPIP est attendu dans propre (sauf bien sur le code HTML indiqué par la balise du même nom).

      Dès lors, si on est dans l’espace privé, il me semble que l’approche avec la balise HTML est la bonne.

      Si on avait été dans l’espace public, j’aurai plutôt suggéré qu’au lieu de rajouter un lien HTML avant de passer par propre, il aurait été plus pertinent de rajouter un lien SPIP(qui aurait traiter ensuite par propre).

      Bien cordialement

    Répondre à ce message

  • 6

    Bonjour,
    en utilisant mailcrypt et bootstrap en même temps il y a un petit conflit : mailcrypt pose un span.spancrypt et bootstrap le prend pour un [class*=« span »] et lui colle un float et des marges...
    ... proposition : on pourrait définir précisément les styles dans le le plugin mailcrypt

    .spancrypt { float:none; margin:0; /*et pendant qu'on y est*/ display:inline; }

    ... ??

    • Oui, tu peux procéder à ces ajouts par SVN si tu veux. Les CSS s’appliqueront cependant en fonction de l’ordre d’appel...

    • Pourquoi pas... mais avant... j’ai testé en ajoutant une fonction insert_head_css pour lier la feuille css/mailcrypt.css et ça fonctionne, enfin la règle suivante est dominante, même si la règle de bootstrap est déclarée après (dans perso.css par exemple) :
      dans css/mailcrypt.css
      span.spancrypt { float:none; margin:0; display:inline; }
      ma question :
      -  est-on obligé de passer par insert_head_css juste pour ça ?

    • Ca me semble un peu lourd de passer par insert_head_css juste pour cela. Et sait-on jamais s’il y aurait d’autre conflit css...

      Renommer le span.spancrypt en span.mcrypt serait finalement plus simple non ?

    • absolument, si c’est possible, c’est vraiment plus simple...

    • OK. Je viens de faire la correction sur le code du plugin, ainsi que sur celui du Couteau Suisse. Ce dernier intègre en plus les précautions sur margin, float et display.
      Prochain paquet vers 16h.

    • super, merci !
      ça règle le soucis...

    Répondre à ce message

  • 11

    Avec MailCrypt, peut-on prévoir plusieurs adresses dans la même balise ; à la fois en direct dans un seul lot (toto@tata.com ; tutu@toto.com), ou en copie, ou en copie cachée ? et encore du texte dans l’objet ? et du texte dans le corps de la lettre ?
    Merci !

    • Salut, difficile de comprendre ton message...

    • Salut, il veut pouvoir envoyez le mail avec un CC et un CCi mais que ce soit dans le cryptage. Il me semble en tout cas ...

    • oui, à deux expéditeurs à la fois.

    • Ok je crois comprendre.

      Je viens de faire quelques tests (détails de la syntaxe mailto sur Wikipedia) :

      [->mailto:toto@toto.com]
      [->mailto:toto@toto.com?subject=HELLO]

      fonctionnent sans problème.

      [->mailto:toto@toto.com,titi@titi.com]
      [->mailto:toto@toto.com?cc=tata@tata.com]

      plantent.

      Autrement dit, l’expression régulière actuelle ne sait pas gérer le cas de figure où il y a plusieurs expéditeurs.

      Je ne suis pas un pro des expressions régulières. A voir comment prendre ça en compte.

    • Peux tu essayer la version 2.4.0 ? Normalement elle prends en charge des liens de la forme [test->mailto:toto@toto.com,titi@titi.com?cc=tata@tata.com&bcc=tutu@tutu.com].

      NB : le mailto est précisé dans le lien, car sinon je ne suis pas sur que le lien est correctement détecté comme étant un email.

    • Ah merci Joseph, c’est beaucoup plus clair. Je viens de mettre à jour le Couteau Suisse pour prendre en compte la syntaxe complète de mailto: http://zone.spip.org/trac/spip-zone/changeset/71343.

      Ce travail n’était pas vraiment anodin. Le plugin autonome est-il encore compatible avec la lame du Couteau Suisse ou s’en est-il éloigné ?

    • Oups, je vois qu’on a bossé en parallèle...
      Pour ma part, j’ai dû modifier le fonctionnement de la fonction JS.
      Joseph, je te laisse comparer les codes si tu veux.

    • J’a également modifié le comportment de la fonction JS.
      Grosso, si plusieurs destinataires, ils apparraissent dans la partie droite de l’email. Le @ est alors remplacé par _MAILCRYPT_AROBASE_JS et la fonction mc_lancerlien corrige la partie droite à la volée.

      En reprenant mon example : je produis le code HTML suivant : <a class="spip_mail" onclick="location.href=mc_lancerlien('toto','toto.com,titi..åt..titi.com?cc=tata..åt..tata.com&amp;bcc=tutu..åt..tutu.com'); return false;" title="toto@toto.com,titi@titi.com?cc=tata@tata.com&amp;bcc=tutu@tutu.com" href="#toto#mc#toto.com,titi..åt..titi.com?cc=tata..åt..tata.com&amp;bcc=tutu..åt..tutu.com#">test</a>

      Le fonctionnement reste inchangé. Par contre je ne vois pas trop ce que fait maintenant le couteau suisse.

      Dans tous les cas, peu importe, les deux ne sont pas obligés de traiter les emails de la même façon. Il ne pourrait y avoir incompatibilité que si le plugin et la lame sont activés en même temps. Mais je ne sais pas si le CS donne la main à MailCrypt si ce dernier est actif.

    • Oups, c’est le code après passage du javascript sur le title. Le code source contient également ..åt.. dans le title, remplacé automatiquement en @ par javascript

    • Très franchement, plus besoin des 2 arguments pour la fonction JS, un seul suffirait... J’avais conservé pour ma part un codage PHP de l’arobase avec uniqueid() en modifiant les arguments de la fonction JS.

      Sinon, il y a une incompatibilité fatale, car tu n’as pas changé le nom des fonctions mailcrypt et demailcrypt, présentes dans les 2 plugins.

    • Ceci dit, pour l’incompatibilité ce n’est pas vraiment un problème. Les deux plugins n’ont pas vocation à être installé ensemble. Soit on a le CS, soit on a mailcrypt.

      Quand aux deux fonctions mailcrypt et maildecrypt, c’est bien volontaire. Le but est qu’un plugin/squelette puisse appeler ces deux filtres peu importe que soit utilisé le plugin ou la lame.

    Répondre à ce message

  • 4

    salut,

    j’ai un petit problème avec mailcrypt (dans le couteau suisse) que je ne parviens pas à comprendre.

    Vous pouvez le voir sur cette page, par exemple : http://www.anticorrida.com/Une-delegation-en-France.html

    J’ignore pourquoi le onclick reprend l’url du site avant d’appeler la fonction javascript, donc je me retrouve avec un : location.href=http://www.anticorrida.com/lancerlien(’mail,’ndd.xxx’) ; return false ;

    Le .htaccess semble correct et je n’ai pas trouvé de balise <base> (j’avais eu un problème similaire autrefois, sur ce même site je crois, à cause de cette balise).

    Du coup, j’ai une erreur logique dans la console de firebug et surtout le lien n’est pas cliquable puisque la fonction n’est pas appelée.

    z’avez une idée de quoi que ça peut venir svp ?

    merci

    • Je vois le problème. Et je n’ai pas d’idée d’où cela pourrait venir. Suggestion : faire un squelette test extrêmement simple (juste une boucle article par ex.). Et voir si un texte contenant une adresse marche comme prévu avec ce squelette. Si oui, c’est quelque chose dans le squelette qui interfère avec le CS.

    • Salut,

      S’agit-il d’un article ? d’un squelette ? Quel en est le code source ? Quels sont les plugins activés ?

      C’est vrai que le code source devrait être : onclick="location.href=lancerlien(...) et non : onclick="location.href=http://www.anticorrida.com/lancerlien(...)

      A voir qui (ou quoi !) insère cette URL à tort...

    • bien vue l’idée de faire un squelette test vide, des fois on se fatigue et on oublie le B-A-BA :)

      en effet, ça fonctionne parfaitement sur http://www.anticorrida.com/?page=test_email

      il ne me reste plus qu’à tester les lignes du head une par une

      merci (et c’est la première fois, en bien dix ans de spip derrière moi, que j’ai deux réponses aussi rapidement sur ce forum, ça fait plaisir de voir que la communauté fonctionne toujours !)

    • mouahaha j’ai trouvé et c’était très bête !

      J’avais laissé le filtre abs_url sur le champs #TEXTE

      Même s’il ne me parait pas logique que ce filtre modifie les appels javascript, mais pas grave il ne m’était plus utile sur ce squelette.

      merci pour votre aide (pour que je cherche où il faut) !

    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