Marco: Header("Location: ") mit eMail !

Hallo,

habe mir einen Downloadzähler gebastelt, der nach Eintrag in die Datenbank die $url mit Header("Location: " . $url); übergibt.
Jetzt möchte ich aber auch zählen wie oft auf eine eMail-Adresse geklickt wurde und übergebe in $url eine eMailadresse mit mailto:email@adresse.de.

Leider klappt das dann nicht so gut, da ein neues Fenster geöffnet wird und dann der eMail-Client. Das Fenster bleibt dann offen mit er dem Wert von $url in der Adresszeile. Das Fenster sollte sich natürlich wieder automatisch schließen bzw. garnicht öffnen.

Kann mann da irgendwas in Header("Location: " . $url); übergeben, damit das Fenster nicht geöffnet wird?

Danke an alle,
Marco

  1. Moin!

    Jetzt möchte ich aber auch zählen wie oft auf eine eMail-Adresse geklickt wurde und übergebe in $url eine eMailadresse mit mailto:email@adresse.de.

    Das ist für HTTP nicht definiert. Du machst da Müll. Nett, dass sich bei dir überhaupt was tut, aber das ist wohl eher Glückssache.

    Leider klappt das dann nicht so gut, da ein neues Fenster geöffnet wird und dann der eMail-Client. Das Fenster bleibt dann offen mit er dem Wert von $url in der Adresszeile. Das Fenster sollte sich natürlich wieder automatisch schließen bzw. garnicht öffnen.

    Es ist das typische Verhalten eines normalen Mailto-Links, dass der (wenn vorhanden) Mailclient geöffnet wird, wenn man den Link klickt. Der Browser fängt das Laden einer neuen Seite ab, indem er den Mailclient startet. Die angezeigte Seite verändert sich nicht.

    Jetzt hast du etwas gebastelt, was diesen Mechanismus außer Kraft setzt. Es wird ein Weblink geklickt. Dieser lädt vom Server eine Ressource. Das bedeutet: Fenster leeren, Platz für die neue, kommende Seite machen.

    Als "Seite" kommt jetzt aber eine Weiterleitung auf "mailto:". Dein Browser startet daraufhin den Mailclient, und kriegt (weil es technisch nicht geht - es gibt keine Weiterleitung mit _zwei_ Zieladresseb) ansonsten keine Information, was denn als HTML-Seite anzuzeigen ist.

    Also bleibt das Browserfenster leer.

    Kann mann da irgendwas in Header("Location: " . $url); übergeben, damit das Fenster nicht geöffnet wird?

    Nein. HTTP hat keinerlei Einfluß auf Fenster. Es weiß noch nicht einmal, dass soetwas wie Fenster überhaupt existieren.

    - Sven Rautenberg

    --
    "Beim Stuff für's Web gibts kein Material, was sonst das Zeugs ist, aus dem die Sachen sind."
    (fastix®, 13. Oktober 2003, 02:26 Uhr -> </archiv/2003/10/60137/#m338340>)
    1. Hallo Sven,

      Nein. HTTP hat keinerlei Einfluß auf Fenster. Es weiß noch nicht einmal, dass soetwas wie Fenster überhaupt existieren.

      Gibt es denn irgend eine andere Möglichkeit das zu machen?

      Gruss, MArco

      1. Hallo erstmal!

        Öffne doch mit header im selben Fenster deine Page mit folgendem Inhalt:

        Falls das Mailprogramm nicht automatisch stratet klicken sie hier
        mailto:....

        und in den Metatags gibst Du eine Refresh-Meta an, der die mailto:Emailadresse öffnen soll.

        Das sollte bei fast allen browsern funzen, der USer hat anschließend wieder deine Page zu Gesicht und kein leeres neues Fenster!!

        Greets Fabe

        P.S. Ich habs noch nicht ausprobiert, aber mit zip-download-geschichten funzt das sehr gut!!

        1. Hello,

          dann könnte man den Link ja einfach in einem neuen Fenster öffne  lassen. Aber das wolltest Du nicht, oder?

          Grüße

          Tom

          1. Hi,
            ursprünglich war der Antrieb für diese Script ein Kontrolle uber die Klickanzahl auf diesen Link. Daher muss man ein Fenster öffnen, muss aber kein neues sein!!

            z.B.

            <a href="redirect.php?email=test@domain.de">test@domain.de</a>

            <!--Wird im selben Fenster geöffnet mit gleichem Design usw...!!-->

            Dann redirect.php:

            Schreibe log-Datei.....
            header("LOCATION: email.php?email=".$email)

            Dann die email.php:

            <meta name="refresh" content="mailto:<? print $email; ?>, 5">
            <!--Bitte nicht festnageln... meta weiß ich nicht auswendig!!-->

            ...
            ...
            Weiter im HTML-Code:

            Falls die Automatik nicht klappt klicken Sie bitte
            <a href="mailto:<? print $email; ?>">hier</a>

            Greets

    2. Hi Sven,

      hab mir ne Javascript-Lösung gebaut:

      // Auf übergebene URL weiterleiten
      if(!ereg('@',$url))
      {
      Header("Location: " . $url);
      }

      // Wenn Weiterleitung auf eMail-Adresse
      if(ereg('@',$url))
      {
      ?>
      <html><head><title>Weiterleitung</title></head><body>
      <script language="JavaScript">
      location.href="<?echo $url;?>";
      self.close();
      </script>
      </body></html>
      <?
      }

      Was hälst Du davon?

      1. Hello,

        was hältst Du denn von einer Frame-Lösung?

        Der Mailto-Link wird einfach in einem "blinden" Frame übertragen...

        Grüße

        Tom

    3. Hi Sven!

      Jetzt möchte ich aber auch zählen wie oft auf eine eMail-Adresse geklickt wurde und übergebe in $url eine eMailadresse mit mailto:email@adresse.de.

      Das ist für HTTP nicht definiert. Du machst da Müll. Nett, dass sich bei dir überhaupt was tut, aber das ist wohl eher Glückssache.

      Ich habe das auch schonmal gesehen und mich gewundert dass das überhaupt funktioniert. Wobei ja im RFC 2616 steht das im Location-Header eine absolute URI stehen muss, aber nach RFC 2396 ist mailto:... ebenfalls eine URI.
      Wo steht dass URIs im RFC 2616 sich nur auf http:... beziehen?

      Grüße
      Andreas

      1. hi,

        Wo steht dass URIs im RFC 2616 sich nur auf http:... beziehen?

        RFC 2616 _ist_ die beschreibung des "Hypertext Transfer Protocol -- HTTP/1.1" - welche aussagekraft sollten also die darin gemachten angaben _ohne_ den bezug auf http:// haben?

        gruss,
        wahsaga

  2. Hallo Marco!

    Schon mal schön zu sehen, daß jemand, der php nutzt, JS nicht abgeneigt ist ;)

    <script language="JavaScript">
    location.href="<?echo $url;?>";
    self.close();
    </script>

    Das sollte für gewöhnlich mit einer unerwünscht zusätzlichen Abfrage des Users durch den Browser quittiert werden.

    Ich hätte da eine nicht 100%ige Lösung:

    Setze ein Frameset ein:

    <html>
    <frameset cols="*,0">
       <frame src="meine_e-mailadresse.htm">
       <frame src="leere_seite.htm" name="count">
    </frameset>
    </html>

    meine_e-mailadresse.htm:

    <html>
    <head>
    <script>
    function zaehler()
       {
       parent.count.location.href="counter.php"
       }
    </script>
    </head>

    <body>
    <a href="mailto:hallo@duda.de" onClick="zaehler()">hallo@duda.de</a>
    </body>
    </html>

    counter.php:

    <?php
    $d="0.inc";
    if(file_exists($d))
       {
       $i=include($d);
       $i+=1;
    else
       {
       touch($d);         //induziert sich seinen Speicher selbst
       $i=1;
       }

    $s=fopen($d,w);
    fputs($s,"<?php $i=$i; return($i); ?>");
    fclose($s);
    ?>

    Das ganze ist zwar nur kurz zusammengeschustern und ich habe es nicht mehr laufenlassen (bitte mal sebst debuggen).

    Anmerkung:
    Leider schützt Dich dies nicht vor deaktivierten JS noch vor mehrfachen Clicks auf den Link durch einen User. Dazu müstest Du dann die einzelnen IPs abspeichen und die letzte (oder besser die letzten 2-5) per Auslesen dieser und Vergleich mit einem neuen Request if-else-bedingt auswerten.

    Gruß aus Berlin!
    eddi