Encodeur d'adresses emails

Soyez le premier à donner votre avis sur cette source.

Snippet vu 5 974 fois - Téléchargée 16 fois

Contenu du snippet

On trouve pas mal de sites qui proposent d'encoder des adresses email pour vous, pour pouvoir faire des liens "mailto" sans que ça passe directement dans le 1er robot venu.

Le "problème" est qu'il n'y a que l'interface, jamais le code qui permet d'encoder l'adresse. Comme j'en avait marre de devoir faire des copier-coller adresse par adresse, j'ai fait ma propre fonction d'encodage, et quitte à faire, autant en faire profiter tout le monde.

Celle-ci est basée sur l'encodage de caractère en décimal et hexadécimal. Pour chaque caractère de l'adresse email, la fonction le code soit en hexa, soit en décimal, soit ne le code pas. Ainsi, on obtient un email avec un codage totalement aléatoire. Comme il n'y a plus de logique directe, cela permet de compliquer fortement la tâche aux robots.

Je me doute bien que certains robots réussiront quand même à passer au travers, mais c'est une des solutions les plus efficaces que j'aie trouvé jusqu'à maintenant (en dehors de passer par un formulaire + captcha, mais ça n'est pas la question ici).

A noter que le mail codé peut être utilisé aussi bien pour le lien mailto que pour l'affichage même de l'adresse email.

Source / Exemple :


function encode_mail($email) {
    $mail_encoded = "";
    for($i = 0; $i < strlen($email); $i++) {
        $alea = rand(1, 300);
        switch(($alea % 3)) {
            case 0:
                $mail_encoded .= "&#".ord($email[$i]).";";
                break;
            case 1:
                $mail_encoded .= "&#x".bin2hex($email[$i]).";";
                break;
            case 2:
                $mail_encoded .= $email[$i];
                break;
            default:
                echo "Error";
                break;
        }
    }
    return $mail_encoded;
}

// Exemple d'utilisation :
echo "<a href=\"mailto:".encode_mail($mail)."\">".encode_mail($mail)."</a>";

// Version alternative permettant plus d'aléatoire avec l'ajout des caractères codés en ASCII (notation utilisée pour les URL), mais incompatible pour l'affichage.
function encode_mail2($email) {
    $mail_encoded = "";
    for($i = 0; $i < strlen($email); $i++) {
        $alea = rand(1, 400);
        switch(($alea % 4)) {
            case 0:
                $mail_encoded .= "&#".ord($email[$i]).";";
                break;
            case 1:
                $mail_encoded .= "&#x".bin2hex($email[$i]).";";
                break;
            case 2:
                $mail_encoded .= "%".bin2hex($email[$i])."";
                break;
            case 3:
                $mail_encoded .= $email[$i];
                break;
            default:
                echo "Error";
                break;
        }
    }
    return $mail_encoded;
}

Conclusion :


Je suis bien sûr ouvert à toute critique/suggestion (tant que cela reste constructif, cela va de soi).

Profitez-en bien! :-)

A voir également

Ajouter un commentaire

Commentaires

Messages postés
10
Date d'inscription
lundi 29 octobre 2007
Statut
Membre
Dernière intervention
30 avril 2015

Oui, oui, je suis parfaitement dans cette approche !
Messages postés
6
Date d'inscription
lundi 18 septembre 2006
Statut
Membre
Dernière intervention
26 octobre 2011

Aucune solution n'est fiable à 100%, et oui, c'est décodable.
Ici, on joue essentiellement sur la notion d'aléatoire, et aussi sur le fait que pour décoder un système comme celui-là, cela demande beaucoup plus de lignes de code, et demande également plus de temps. Du coup, moins d'intérêt pour les hackers & cie.

Mais tout comme les captcha images, il y aura toujours des pirates qui parviendront à passer la barrière plus ou moins facilement. Cela dit, c'est mieux que rien, et ça présente deux avantages :
- Pas d'image, pas de truc à moitié lisible, etc.
- 100% compliant html et xhtml. ;-)

C'est avant tout un compromis entre fiabilité et accessibilité, aussi bien pour le développeur que pour le visiteur. ;-)
Messages postés
10
Date d'inscription
lundi 29 octobre 2007
Statut
Membre
Dernière intervention
30 avril 2015

Bonjour,

Je ne sais pas si mon commentaire à été modéré ou si j'ai buggué, mais je me demandais à quel point ce codage pouvait être efficace, s'il respecte les notation standard html, est-ce que les bots ne vont pas justement être capable de lire une telle adresse ?

Merci d'avance.

Sinon si ça marche c'est un super petit code que je me suis empressé de récupérer.

A bientôt.
Messages postés
6
Date d'inscription
lundi 18 septembre 2006
Statut
Membre
Dernière intervention
26 octobre 2011

Il n'y a pas de fonction de décodage. C'est automatique.
Pour l'encodage des caractères en "&#quelquechose", c'est le navigateur qui fait la conversion du caractère automatiquement (notation standard html des caractères spéciaux UTF-8), et pour les caractères encodés en "%xx", c'est le codage au format ISO défini pour les URL, donc n'importe quel logiciel conforme aux standards établis est capable de lire une telle adresse.
Fait un essai avec ce code dans une page web :
echo "["mailto:".encode_mail2($mail)."\ ".encode_mail($mail)."";
Et compare le code html généré, ce que ça t'affiche, et ce que ça fait quand tu cliques sur le lien. Ca sera beaucoup plus parlant. ;-)

Juste pour rappel, la 1ère version de la fonction peut servir aussi bien pour l'affichage que pour mettre dans un champ URL (comme ]), mais la 2nde ne sert que pour les URL. A l'affichage, la 2nde affichera certains des caractères sous forme de code %xx.
Messages postés
10
Date d'inscription
lundi 29 octobre 2007
Statut
Membre
Dernière intervention
30 avril 2015

Bonjour,

Ce script serait exactement ce que je recherche, en revanche, je ne comprends pas comment le lien peut fonctionner une fois le mail encodé. Ou est la fonction de décodage pour que quand je clique sur le lien, j'ai une adresse correcte qui s'affiche dans mon outlook afin de pouvoir envoyer le mail?
Afficher les 16 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.