Eddie: E-Mail-Adresse encoden, on-the-fly

Hallo,
wisst Ihr, was der einfachste Weg ist, E-Mail-Adressen auf ihrem Weg von der Datenbank zum mailto-Link zu verschluesseln?

Und zwar ungefaehr so, wie das hier geschieht:
http://www.wbwip.com/wbw/emailencoder.html

Danke Euch,
Eddie

  1. Hallo.

    [ ] Du hast Dir schon mal den Quelltext Deines Links angesehen.
    [ ] Du wolltest gerade den Quelltext Deines Links ansehen.

    Markieren -> "Strg"+"C" -> eigene Seite -> "Strg"+"V". Jetzt noch den richtigen Parameter an die Funktion übergeben, fertig.

    Grüße aus Würzburg
    Julian

    --
    resist - Sich dem Irak-Krieg widersetzen!
    Informationen: http://www.resistthewar.de
    http://www.attac.de/globkrieg/
    --
    ss:) zu:{ ls:< fo:) de:< va:} ch:° n4:} rl:° br:> js:| ie:{ fl:( mo:)
    1. Oh, cut&paste, was ganz was Neues!
      Jetzt das Ganze noch automatisiert, ohne Medienbruch und Tastatur dazwischen?
      Sowas in der Art

      $eMail = "test@gnarf.de";
      $encodedMail = encodeMail($eMail);
      echo $encodedMail;

      Ausgabe: &#116;&#101;&#115;&#116;&#064;&#103;&#110;&#097;&#114;&#102;&#046;&#100;&#101;

      Sorry, uebrigens hier nochmal der Link, zum Anklicken: http://www.wbwip.com/wbw/emailencoder.html

      Eddie

      1. Hallo Eddie,

        Sorry, uebrigens hier nochmal der Link, zum Anklicken: http://www.wbwip.com/wbw/emailencoder.html

        [ ] Du hast Julians Posting verstanden.

        Schau doch in den Quelltext auf der Seite, da ist das ganze als JavaScript-Funktion implementiert, das meinte Julian mit Copy&Paste.

        Viele Grüße,
        Christian

        --
        Ich bin ein Bandbreitenverschwender. Meine Signatur tut mir leid. Ehrlich!
        1. hi zusammen

          Schau doch in den Quelltext auf der Seite, da ist das ganze als JavaScript-Funktion implementiert, das meinte Julian mit Copy&Paste.

          mal ne frga e: geht das auch mit php?
          wenn ja was muss ich da ändern?
          thx
          gruß
                bjb

          1. Hallo bjb,

            mal ne frga e: geht das auch mit php?

            Sicherlich.

            wenn ja was muss ich da ändern?

            Also:

            function encodeEmail($regEmail) {

            $codeEmail = '';

            if ($regEmail == '') {
                    return false; // oder irgendwas anderes
            }
            else {
                    $regLength = strlen ($regEmail);
                    for ($i = 0; $i < $regLength; $i++) {
                            $charNum = '000';
                            $curChar = $regEmail{$i};
                            if ($curChar == "a") {
                                    $charNum = "097";
                            }
                            // [...]
                            // das hier kannst du selbst fortsetzen,
                            // ich bin zu faul für
                            if ($charNum == "000") {
                                    $codeEmail .= $curChar;
                            }
                            else {
                                    $codeEmail .= "&#$charNum;";
                            }
                    }
                    return $codeEmail;
            }

            }

            (Du solltest aber vielleicht noch den ursprünglichen Autor fragen, bevor Du das verwendest)

            Viele Grüße,
            Christian

            --
            Ich bin ein Bandbreitenverschwender. Meine Signatur tut mir leid. Ehrlich!
            1. hallo christian
              erstmal danke

              (Du solltest aber vielleicht noch den ursprünglichen Autor fragen, bevor Du das verwendest)

              ok
               danke nochmal
              gruß
                        bjb

              1. Hier meine PHP-Lösung, ohne jedes Mal die gesamte Vergleichs-Schleife durchlaufen zu muessen.
                Die Schleifenvariante aus dem Original waere uebrigens effektiver, wenn man die Vergleiche entsprechend der relativen Häufigkeit von Zeichen anordnen wuerde.
                Eddie

                /* encrypts an e-mail address to hide mailto-links from address crawlers
                 *
                 * $eMail - address to encrypt
                 *
                 * returns the encrypted address
                 */
                function getEncodedMailToLink($eMail)
                {
                 $eMail = strtolower($eMail);

                $codes = array('e' => '&#101;',
                      'n' => '&#110;',
                      'i' => '&#105;',
                      's' => '&#115;',
                      'r' => '&#114;',
                      'a' => '&#097;',
                      't' => '&#116;',
                      'd' => '&#100;',
                      'u' => '&#117;',
                      'h' => '&#104;',
                      'g' => '&#103;',
                      'l' => '&#108;',
                      'c' => '&#099;',
                      'm' => '&#109;',
                      'w' => '&#119;',
                      'o' => '&#111;',
                      'b' => '&#098;',
                      'f' => '&#102;',
                      'z' => '&#122;',
                      'k' => '&#107;',
                      'v' => '&#118;',
                      'p' => '&#112;',
                      'j' => '&#106;',
                      'q' => '&#113;',
                      'x' => '&#120;',
                      'y' => '&#121;',

                '0' => '&#048;',
                      '1' => '&#049;',
                      '2' => '&#050;',
                      '3' => '&#051;',
                      '4' => '&#052;',
                      '5' => '&#053;',
                      '6' => '&#054;',
                      '7' => '&#055;',
                      '8' => '&#056;',
                      '9' => '&#057;',

                '&' => '&#038;',
                      ' ' => '&#032;',
                      '_' => '&#095;',
                      '-' => '&#045;',
                      '@' => '&#064;',
                      '.' => '&#046;',
                    );

                $output = '';
                 for ($i = 0; $i < strlen($eMail); $i++)
                 {

                $sign = substr($eMail, $i, 1);
                  $code = $codes[$sign];
                  if ($code != '')
                  {
                   $output .= $code;
                  }
                  else
                  {
                   $output .= $sign;
                  }
                 }

                return $output;
                }

                1. Hallo Zusammen,

                  Hier meine PHP-Lösung, ohne jedes Mal die gesamte Vergleichs-Schleife durchlaufen zu muessen.
                  Die Schleifenvariante aus dem Original waere uebrigens effektiver, wenn man die Vergleiche entsprechend der relativen Häufigkeit von Zeichen anordnen wuerde.

                  Ein switch() wäre übrigens auch nicht verkehrt, funktioniert aber nicht bei sehr alten PHP Versionen.

                  Aber mal ganz nebenbei:
                  Warum eigentlich immer so kompliziert?
                  Hexcode funktioniert doch auch!
                  Hier also mal ein paar Variationen über das Thema (imagepng() braucht mindestens PHP mit GD-Lib >= 1.6, sollte aber bei den aktuellen Anbietern zutreffen) komplett zum C&P und anpassen.
                  Lizenz: für so einen Driss gibt's "Public Domain" ;-)

                  <?php
                  if (!$mailadress){
                  echo
                  "<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>
                  <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
                       "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
                  <html lang="de" xmlns="http://www.w3.org/1999/xhtml" xml:lang="de">
                  <head>
                  <title>Mailcode</title>
                  </head>
                  <body>
                  <div>
                  <form name="form1" enctype="multipart/form-data" method="post"
                  action="mailcode.php">
                  <h4>Mailadresse</h4>
                  <input type="text" name="mailadress" size="50" maxlength="1024" />
                  <form>
                  </div>
                  </body>
                  </html>";
                  }
                  else {
                  $maLength=strlen($mailadress);
                  if($maLength < 1 || $maLength > 1024) {
                   return false; //so natürlich nicht, aber ist ja nur ein Beispiel ;-)
                  }
                  for($i=0;$i<$maLength;$i++){
                    $hexDump = bin2hex($mailadress{$i});
                    $codedAdress .= "&#x$hexDump;";
                    if($i==10)$codedAdress .="<br />";
                    $encodedAdress .= "&#x$hexDump;";
                  }
                  $adressImage=imagecreate(($i*10),20);
                  $colorBack=imagecolorallocate($adressImage,200,255,200);
                  $colorFont=imagecolorallocate($adressImage,255,0,0);
                  imagestring($adressImage,5,5,0,$mailadress,$colorFont);
                  imagepng($adressImage,"image.png");
                  //oder wo auch immer PHP Schreibrechte hat.
                  //Wenn's nicht funktioniert, könnten evt die Leserechte für den Browser fehlen.
                  //Dieser Fehler hat zumindest mich gerade geärgert ;-)

                  echo
                  "<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>
                  <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
                       "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
                  <html lang="de" xmlns="http://www.w3.org/1999/xhtml" xml:lang="de">
                  <head>
                  <title>Mailcode</title>
                  </head>
                  <body>
                  <div style="border:2px solid #f40000;margin:1ex 0 0 1ex;padding:1ex 1em 1em 1ex;" >
                  <h4>Originale Mailadresse:</h4>
                  $mailadress
                  </div>
                  <div style="border:2px solid #00f400;margin:1ex 0 0 1ex;padding:1ex 1em 1em 1ex;" >
                  <h4>Encodierte Mailadresse:</h4>
                  $codedAdress
                  </div>
                  <div style="border:2px solid #0000f4;margin:1ex 0 0 1ex;padding:1ex 1em 1em 1ex;" >
                  <h4>Darstellungstest:</h4>
                  $encodedAdress
                  </div>
                  <div style="border:2px solid black;margin:1ex 0 0 1ex;padding:1ex 1em 1em 1ex;" >
                  <h4>Als Bildchen:</h4>
                  <img src="image.png" />
                  </div>
                  </body>
                  </html>";
                  }?>

                  so short

                  Christoph Zurnieden

                  1. Hi Christoph,
                    danke fuer Deine Loesung, hab was draus gelernt!

                    Nur eine kleine Anpassung fuer spaetere Leser:
                    wenn man die folgenden Zeilen

                    $hexDump = bin2hex($mailadress{$i});
                      $codedAdress .= "&#x$hexDump;";

                    in Anlehnung an das andere Posting durch

                    $dump = ord($mailadress{$i});
                    $codedAdress .= '&#'.$dump.';';

                    ersetzt, dann zeigt auch der Browser die Adresse im MailTo-Link korrekt an.

                    Eddie

                    1. Hi Eddie

                      danke fuer Deine Loesung, hab was draus gelernt!

                      Mach das lieber nicht, da sind andere kompetenter.

                      Mich hatte das nur aufgeregt, das sowas mit ifs "gelöst" wurde, da kräuseln sich mir die Fußnägel.
                      Aber da war ich ja nicht der einzige ;-)

                      Nur eine kleine Anpassung fuer spaetere Leser:
                      wenn man die folgenden Zeilen

                      $hexDump = bin2hex($mailadress{$i});
                        $codedAdress .= "&#x$hexDump;";

                      in Anlehnung an das andere Posting durch

                      $dump = ord($mailadress{$i});

                      Ja, den hatte ich übersehen. Bin ja auch kein PHP-Hacker, die API habe ich nicht im Kopf, die muß ich nachschlagen und bin2hex kam mir als erstes unter die Finger da die Liste alphabetisch geordnet ist. (Bin kein Freund von sprintf(), egal wo, ist immer ziemlich teuer)

                      $codedAdress .= '&#'.$dump.';';

                      ersetzt, dann zeigt auch der Browser die Adresse im MailTo-Link korrekt an.

                      Das wundert mich aber arg!
                      Welcher Browser macht denn sowas?

                      Aaahh! Nein, das war doch nur zur Darstellung, zwecks einfachem Debugging! ;-)

                      BTW: mailto: ist nicht mehr so ganz gebräuchlich und da PHP zur Verfügung steht eh obsolet. Würde eher ein Kontaktformular zur Verfügung stellen. Dabei aber auch die Mailadresse stellen, nur halt ohne Verlinkung, da manche Firewalleinstellung POST nicht durchläßt (Auch wenn dafür eigentlich ein ausgewachsener Proxy besser geeignet wäre) und das Formular dann nicht funktioniert (GET ist ein wenig zu ... äh ... geizig für ein Formular ;-).

                      so short

                      Christoph Zurnieden

            2. Moin,

              if ($curChar == "a") {
                                      $charNum = "097";
                              }
                              // [...]
                              // das hier kannst du selbst fortsetzen,
                              // ich bin zu faul für

              Wahh, heilige Höllen der Ineffizienz! Ich beschwöre dich, Satan, weiche!

              $codeEmail = preg_replace("![a-z0-9& _@.-]!e", 'sprintf("&#%03d;",ord("\0"))', $regEmail);

              bzw. wenn es allgemeiner und nicht genau deckungsgleich mit dem 'Original' sein darf:

              $codeEmail = preg_replace("!.!e", '"&#".ord("\0").";"', $regEmail);

              --
              Henryk Plötz
              Grüße aus Berlin
              ~~~~~~~~ Un-CDs, nein danke! http://www.heise.de/ct/cd-register/ ~~~~~~~~
              ~~ Help Microsoft fight software piracy: Give Linux to a friend today! ~~
              1. Hallo Henryk,

                Wahh, heilige Höllen der Ineffizienz! Ich beschwöre dich, Satan, weiche!

                <rechtfertigung>
                Er hat mich nur gefragt, wie man die JS-Funktion direkt umschreiben kann...
                </rechtfertigung>

                Viele Grüße,
                Christian

                --
                Ich bin ein Bandbreitenverschwender. Meine Signatur tut mir leid. Ehrlich!