Dieter Raber: E-Mail an Adresse senden bei abschicken des Formulars?

Beitrag lesen

Hallo Hauke,

Wenn ich Dich recht verstehe, soll Dein System so funktionieren:
1. Ich trage auf Deiner Webseite meine Emailadresse und unterschreibe so fuer den Newsletter
2. Du checkst, ob die Emailadresse schon existiert, wenn nicht, wird sie eingetragen, aber auf inaktiv gesetzt
3. Gleichzeitig schickst du eine Mail an mich mit der Bitte um Bestaetigung
4. Ich klicke in dieser Mail auf einen Link, der meinen Eintrag in deiner DB auf aktiv setzt

Du hast zwar einen Gutteil davon schon in Deinem Script umgesetzt, aber mit dem Hin- und Hermailen klappt's noch nicht so. Deshalb hier mal die Geschichte in Pseudocode:

Erst mal die MySQL-Tabelle im Groben

  • ein Feld Id, das kann ein Integer mit Autoincrement sein
  • die Mailadresse, ein Varchar, nicht zu klein waehlen
  • aktiv, zB. ein Enum mit 1,0, default 0
  • das Datum des Eintrags, ich wuerde Integer nehmen und den Unix-Timestamp eintragen

Dann das Anmeldescript
if(($_POST['email']) != ('newsletter.email') AND ($_POST['r1']) == ('eintragen'))
{
     schau in die DB, ob's die Adresse schon gibt (hast Du ja soweit)
     wenn die Adresse existiert -> Fehlermeldung 'Adresse existiert'

ansonsten               a. -> eintragen, aber inaktiv
                             b. -> Mail an die neue neue Adresse schicken, schau Dir die Funktion mail() im PHP-Manual an. Wie die Mail ausehen kann steht weiter unten
}
else loeschen, aber das hast Du ja schon

Wie soll die Mail aussehen?
Frag nach dem Eintrag die ID des Neueintrags von der Tabelle ab. Dann schickst Du mit mail() eine Email an die angegebene Emailadresse. Der Minimalinhalt ist ein Link auf deine Bestaetigungsseite und enthaelt die ID als GET-Parameter.
Beispiel <a href="link_zu_deiner_seite/bestaetigung.php?id=25">Eintrag bitte bestaetigen</a>

Die Bestaetigungsseite
Hier kommt man hin, wenn man auf den Link in der Mail klickt, demnach steht $_GET['id'] zur Verfuegung.
if(!empty($_GET['id']))
{
  schau in der Tabelle, ob diese id existiert
  wenn ja, stell aktiv auf 1
  wenn nein, gib eine Fehlermeldung aus
}

Das ist das Prinzip, sonderlich ausgefuchst ist das noch nicht, moegliche Verbesserungen waeren zB.

  • An der Stelle, wo Du vor dem Abschicken der Mail die ID aus der DB abfragst, frag gleich die Emailadresse mit ab, mach ein md5() drueber und haeng das Ergebnis an den Bestaetigungslink
    ...bestaetigung.php?id=25"> wird zu bestaetigung.php?id=25&e=md5-wert der Adresse">
    Dann hast du im Bestatigungsscript $_GET['e'] und aenderst die Abfrage auf
    select * from tabelle where id=id and md5(email)="der wert aus $_GET[e]"
    Das gibst dir einen gewissen Schutz vor Missbrauch
  • garbage collection
    Um Eintraege loszuwerden, die nie bestaetigt wurden, machst Du bei jedem Aufruf des Eintragsscripts eine kleine Muellsammlung. Sagen wir, wir geben den Kandidaten 24 Stunden Zeit (= 86400 Sekunden)
    Delete from tabelle where aktiv = 0 and (eintragszeit + 864000) < now()

Gruß,

Dieter