Jak wykonać rozbudowany system zapisujący usuwający użytkowników prenumeraty newslettera lub innej listy wysyłkowej


[PHP][MySQL] Jak wykonać rozbudowany system zapisujący/usuwający użytkowników prenumeraty newslettera lub innej listy wysyłkowej?

0x01 graphic

Chcesz stworzyć rozbudowany i antyspamowy system prenumeraty umożliwiający użytkownikom automatyczne zapisywanie/wypisywanie się.

0x01 graphic

Dobry system prenumeraty powinien spełniać szereg wytycznych i założeń. Nie tylko musi być zgodny z ustawą o świadczeniu usług drogą elektroniczną, a więc nie może narażać postronnych osób na otrzymywanie spamu, ale także powinien umożliwiać potwierdzenie zapisywania się na listę (model opt-in).

System prenumeraty musi też zapewniać bezproblemowe wypisanie się z listy i nie powinien umożliwiać wysyłanie wielokrotnych potwierdzeń (gdy ktoś będzie zapisywał/wypisywał adres 100 razy w ciągu dnia) bo też stanie się źródłem spamu. Ważne jest aby nikt poza zainteresowanym nie mógł go dopisać lub wypisać z prenumeraty.

Wreszcie system musi być czytelny i inteligentny, aby pomagał użytkownikowi podejmować decyzję i bez zbędnego klikania spełniał wszystkie jego polecenia. Oczywiście powinien jeszcze automatycznie kasować po kilku dniach niepotwierdzone zamówienia prenumeraty lub adresy, które nie istnieją, a ktoś dodał w ramach"zabawy".

Napiszmy taki system. Nie jest on skomplikowany gdy patrzy się na kod, ale wymaga bardzo starannego planowania na etapie konstruowania skryptu. Na szczęście planować nie musisz, wystarczy, że skopiujesz skrypt i zmienisz jego parametry stosownie do własnych potrzeb.

Stwórzmy najpierw tabelę, gdzie będą przechowywane adresy e-mail. Będzie się składała z pięciu pól.

CREATE TABLE prenumerata (

adres CHAR(200) NOT NULL PRIMARY KEY,

kod CHAR(32) NOT NULL,

status CHAR(1) NOT NULL,

data DATE NOT NULL,

ip CHAR(16)

);

Zakładam, że adres e-mail (pole adres) nie będzie dłuższy niż 200 znaków. Nie spotkałem się z tak długimi adresami, więc 200 znaków wydaje się i tak być wielkością ze sporym zapasem. Adres nie może być pusty i będzie unikatowy w bazie.

Pole kod będzie przechowywało 32-znakowy kod pozwalający zapisać lub wypisać użytkownika - to swego rodzaju unikatowe hasło. Pole z datą pozwoli sprawdzać ile czasu minęło od ostatniego wysłania listu z potwierdzeniem, a pole ip przechowa adres IP, z którego użytkownik dokonał zapisania/wypisania.

Pozostało jeszcze jedno pole do omówienia - status. Określa ono co aktualnie dzieje się z adresem wpisanym do bazy danych. Może przyjmować jedną z czterech wartości:
-
z - użytkownik jest zapisany - tylko on dostaje wysyłkę
-
o - użytkownik oczekuje na zapisanie (zgłosił zapisanie, ale jeszcze nie potwierdził tego)
-
w - użytkownik oczekuje na wypisanie (zgłosił wypisanie, ale jeszcze nie potwierdził tego)
-
b - adres zablokowany - nie można go ani dodać ani skasować, co ma celu całkowite zablokowanie operacji na tym koncie, aby jego właściciel nie otrzymywał informacji o zapisaniu/wypisaniu, które ktoś mógłby co jakiś czas wysyłać wpisując adres i klikając "wypisz" lub "zapisz".

Za pomocą oznaczeń statusu i daty możemy wyeliminować wielokrotne wysyłki potwierdzeń, co pokażę dalej na przykładach. Oto kod całej strony z prenumeratą - możesz jej nadać nazwę index.php:

<!doctype html public "-//w3c//dtd html 4.0 transitional//en">

<html><head><meta http-equiv="content-type"

content="text/html; charset=iso-8859-2">

<title>Prenumerata</title></head><body>

<center><form action="index.php" method="get">

<input name="adres" type="text" style="width:120px;"><br>

<input type="radio" name="o" value="z" checked> zapisz

<input type="radio" name="o" value="w"> wypisz

<br><input type="submit" value="gotowe!"></form></center>

<?

$skrypt="http://serwer.pl/lista/index.php";

$serwer="localhost";

$baza="baza1";

$tabela="prenumerata";

$login="user";

$haslo="password";

$adres=trim(strtolower($_GET["adres"]));

$o=trim(strtolower($_GET["o"]));

$id=trim(strtolower($_GET["id"]));

$ip=$_SERVER["REMOTE_ADDR"];

$data=date("Y")."-".date("m")."-".date("d");

$r=gmmktime()-60*60*24*2; // dodatkowe 2 dni

$data2=gmdate("Y",$r)."-".gmdate("m",$r)."-".gmdate("d",$r);

srand((double)microtime()*1000000);

// dodawanie nowego uzytkownika

if ((eregi(".@.",$adres)) and ($o=="z")) {

$p=mysql_connect($serwer, $login, $haslo);

mysql_select_db($baza,$p);

$wynik=mysql_query("DELETE FROM $tabela

WHERE data<='$data2' and status='o'",$p);

$wynik=mysql_query("UPDATE $tabela SET status='z', data='$data'

WHERE data<='$data2' and status='w'",$p);

$wynik=mysql_query("SELECT * FROM $tabela

WHERE adres='$adres'",$p);

if (mysql_num_rows($wynik)==0) { // gdy nie istnieje w bazie

$kod=md5(uniqid(rand()));

$wynik = mysql_query("INSERT INTO prenumerata

VALUES('$adres','$kod','o','$data','$ip')",$p);

mysql_close($p);

if ($wynik) {

echo "Aby dokończyć proces zapisywania odbierz list z konta

<b>$adres</b> i postępuj zgodnie z przesłaną instrukcją.";

$listzapisz="

Aby potwierdzic chec otrzymywania newslettera kliknij w ciagu dwoch dni:

$skrypt?o=z&id=$kod

Aby nie otrzymywac newslettera zignoruj list. Jezeli zaprenumerujesz

newsletter, mozesz w przyszlosci zrezygnowac klikajac na link:

$skrypt?o=w&id=$kod

Adres IP osoby zapisujacej na prenumerate: $ip

";

mail($adres, "Prenumerata", $listzapisz);

}

} else { // gdy istnieje w bazie

mysql_close($p);

$dane=mysql_fetch_array($wynik);

if ($adres==$dane["adres"] and $dane["status"]=="z")

echo "Adres znajduje się w bazie prenumeratorów";

if ($adres==$dane["adres"] and $dane["status"]=="w")

echo "Adres oczekuje na wypisanie. Nie potwierdzaj maila...";

if ($adres==$dane["adres"] and $dane["status"]=="b")

echo "Adres zablokowany. Nie można dodać ani skasować...";

if ($adres==$dane["adres"] and $dane["status"]=="o")

echo "Adres oczekuje na dodanie...";

}

}

// wypisywanie uzytkownika

if ((eregi(".@.",$adres)) and $o=="w") {

$p=mysql_connect($serwer, $login, $haslo);

mysql_select_db($baza,$p);

$wynik=mysql_query("SELECT * FROM $tabela WHERE adres='$adres'",$p);

if (mysql_num_rows($wynik)==0) {

mysql_close($p);

echo "Adresu nie ma na liście prenumeratorów";

} else {

$wynik=mysql_query("SELECT * FROM $tabela WHERE adres='$adres'",$p);

$dane=mysql_fetch_array($wynik);

if ($adres==$dane["adres"] and $dane["status"]=="o")

echo "Adres oczekuje na dodanie. Nie potwierdzaj maila...";

if ($adres==$dane["adres"] and $dane["status"]=="b")

echo "Adres zablokowany. Nie można dodać ani skasować...";

if ($adres==$dane["adres"] and $dane["status"]=="w")

echo "Adres oczekuje na wypisanie, szczegóły znajdziesz w mailu...";

if ($adres==$dane["adres"] and $dane["status"]=="z") {

$wynik=mysql_query("UPDATE $tabela SET status='w'

WHERE adres='$adres' and status='z'",$p);

}

mysql_close($p);

if ($adres==$dane["adres"] and $dane["status"]=="z") {

echo "Aby dokończyć proces wypisywania odbierz list z konta

<b>$adres</b> i postępuj zgodnie z przesłaną instrukcją.";

$listwypisz="

Aby potwierdzic chec wypisania z newslettera kliknij na link:

$skrypt?o=w&id=".$dane["kod"]."

Jezeli nie chcesz sie wypisywac, zignoruj list.

Adres IP osoby wypisujacej z prenumeraty: $ip

";

mail($adres, "Prenumerata", $listwypisz);

}

}

}

// potwierdzanie dodania użytkownika

if ($id<>"" and $o=="z") {

if (strlen($id)==32) {

$p=mysql_connect($serwer, $login, $haslo);

mysql_select_db($baza,$p);

$wynik=mysql_query("UPDATE $tabela SET status='z'

WHERE kod='$id' and (status='o' or status='w')",$p);

$wynik=mysql_query("SELECT * FROM $tabela

WHERE kod='$id' and status='z'",$p);

$wynik=mysql_num_rows($wynik);

mysql_close($p);

}

if ($wynik==1) {

echo "Dziękujemy, Twój adres został dodany do bazy prenumeratorów!";

} else {

echo "Adres nie został dopisany - sprawdź czy link jest poprawny!";

}

}

// potwierdzanie skasowania użytkownika

if ($id<>"" and $o=="w") {

if (strlen($id)==32) {

$p=mysql_connect($serwer, $login, $haslo);

mysql_select_db($baza,$p);

$wynik=mysql_query("DELETE FROM $tabela WHERE kod='$id'",$p);

$wynik=mysql_affected_rows();

mysql_close($p);

}

if ($wynik==1) {

echo "Dziękujemy, Twój adres został wypisany z prenumeraty.";

} else { echo "Osoba o podanym identyfikatorze nie istnieje."; }

}

?>

</body></html>

Na początku strony znajduje się formularz. Zawiera pole na wpisanie adresu e-mail oraz opcję zapisania go lub wypisania. Dane wysyłane są metodą GET, więc w takim sam sposób odbierane są przez ten skrypt.

Zmienne

Na początku musimy zadeklarować nieco zmiennych, pomocnych w dalszej części skryptu. Zmienna $skrypt przechowuje ścieżkę do skryptu z prenumeratą (czyli tego skryptu). Zmienna $serwer określa serwer, gdzie znajduje się baza danych, $baza to nazwa tej bazy, $tabela określa nazwę tabeli, u nas jest to prenumerata. Pozostało jeszcze określić nazwę użytkownika bazy i jego hasło.

Trzy kolejne zmienne odbierają dane pochodzące z formularza. Przy okazji dane są trimowane (spacje i inne białe znaki na końcach wyrazów są kasowane) i przekształcane do małych liter aby utrzymać jeden standard porównywania łańcuchów.

Dalej określam od razu numer IP osoby wypełniającej formularz, ustalam datę aktualną i datę pomniejszoną o 2 dni. Te dwa dni będzie naszym okresem, w którym musi nastąpić potwierdzenie prenumeraty. Również tylko raz w ciągu tych dwóch dni użytkownik dostanie maila z potwierdzeniem, co zapobiegnie umyślnemu spamowaniu adresów potwierdzeniami.

Funkcja srand() uruchomi generator liczb losowych, które będą nam potrzebne dalej do generowania kodu.

Poniżej mamy cztery logiczne części skryptu, które zaczynają się komentarzem opisującym ich rolę i warunkami if.

Dodawanie

Pierwszy i największy fragment odpowiedzialny jest za dodawanie nowego użytkownika. Sprawdza on czy wpisany został e-mail (a raczej czy został podany znak małpki i co najmniej po jednym znaku z każdej jego strony) i zmienna $o (opcja) ma wartość "z" (zapisanie).

Łączymy się z bazą danych i już na samym początku polecenie DELETE kasuje z listy użytkowników oczekujących na potwierdzenie, a nie potwierdzonych przez ostatnie dwa dni.

Polecenie UPDATE zmienia status osób oczekujących na skasowanie na zwykły (zaprenumerowane), jeżeli przez dwa dni nie zostało potwierdzone skasowanie adresu.

Wreszcie trzecie polecenie SELECT sprawdza czy wpisany w formularzu adres e-mail występuje w tabeli. Jeżeli adres nie występuje wtedy funkcja mysql_num_rows(), zwracająca ilość rekordów objętych ostatnim poleceniem, będzie równa zero i zacznie się proces tworzenia nowego użytkownika.

Przede wszystkim trzeba wygenerować unikatowy kod użytkownika za pomocą funkcji md5(uniqid(rand())) - tworzy ona 32 znakowe hasło. Potem należy dane o użytkowniku umieścić w bazie (adres, kod, status o, datę, ip użytkownika). Jeżeli dodawanie do bazy się powiedzie, to pozostało już tylko wysłać list a odnośnikiem, który pozwoli użytkownikowi potwierdzić zapisanie się na prenumeratę.

Gdy adres użytkownika istnieje w bazie, trzeba wypisać na ekranie jego status. Jeżeli ktoś chciał się po chwili wypisać, wtedy trzeba zasugerować, że ma nie potwierdzać maila (bez potwierdzenia się nie zapisze), ktoś może być zablokowany, więc potwierdzenia nigdy nie dostanie, albo adres może czekać już na dodanie i nie ma wtedy sensu wysyłać kolejnego potwierdzenia.

Wypisanie

Fragment jest podobny do powyższego, ale ma nieco znaczących różnic. W momencie wypisania, również sprawdzamy, czy użytkownik jest w bazie. Jeżeli nie, to nie ma kogo wypisywać i na tym koniec.

Jeżeli użytkownik jest w bazie, należy pobrać jego kod i status. Gdy status określa użytkownika czekającego na dodanie, nie ma co go kasować - wystarczy nie potwierdzać dodania. Gdy już oczekuje na wypisanie, użytkownik ma wysłany list i nie ma sensu wysyłać kolejnych.

Gdy jednak status użytkownika jest normalny (z - zapisany), wtedy trzeba zmienić status na w - oczekujący na wypisanie, a do adresata wysłać mail z prośbą o potwierdzenie wypisania. Potwierdzenie ważne jest w nieskończoność, bo tutaj limitu dwóch dni nie ma sensu dawać - użytkownik ma prawo wypisać się w każdym momencie.

Potwierdzenie zapisania

Na początku sprawdzane są zmienne - jeżeli zostało użyte id zawierające unikatowy kod i opcja zapisu $o=="z" wtedy przystępujemy do potwierdzania. Hasło musi mieć 32 znaki zgodnie z naszymi wymogami.

Łączymy się z bazą i uaktualniamy status z wartości "o" - oczekujący na potwierdzenie na "z" - zapisany, wtedy gdy zgadza się podany kod (przesłany mailem). Jeżeli wcześniej adres miał status "w" - oczekujący na wypisanie, teraz także uzyska status "z".

Pozostało jeszcze sprawdzić czy faktycznie użytkownik jest już poprawnie zapisany. Jeżeli tak, to dziękujemy za pełny proces rejestracji, jeżeli nie, to trzeba poinformować, że adres nie został dodany - być może ktoś kliknął w złego linka lub go zmodyfikował w mailu.

Potwierdzenie wypisania

Łączymy się z bazą i w naszej tabeli z prenumeratą kasujemy użytkownika o wskazanym 32-znakowym kodzie. Jeżeli operacja się powiodła wystarczy podziękować i poinformować, że adres jest skasowany. Gdy link nie został poprawnie użyty lub nie ma takiej osoby, wtedy pojawi się komunikat o błędzie.

Co jeszcze trzeba wiedzieć?

Cały mechanizm działa i od razu można go podpiąć, ale oczywiście jest uproszczony, aby na potrzeby przykładu nie zaciemniać go i nie dodawać ozdobników. Przede wszystkim trzeba uzupełnić komunikaty i treści listów - niech wyjaśnią użytkownikowi, że dbasz o jego prywatność i dokładasz wszelkich starań aby zabezpieczyć go przed spamem i nieautoryzowanym dopisywaniem.

Kolejną sprawą jest pobieranie adresów - w zależności od sposobu wysyłki, możesz korzystać z adresów wprost z bazy lub pobierać je do zewnętrznego programu. W każdym wypadku poleceniem wyciągającym adresy będzie:

SELECT adres FROM prenumerata WHERE status='z';

Wysyłkę można przesyłać tylko do adresatów, którzy potwierdzili swoje adresy - do oczekujących na zapisanie i wypisanie na wszelki wypadek lepiej nic nie słać, bo nie wiesz czy sobie tego życzą.

Nie od parady byłoby napisanie prostego systemu do zarządzania adresami dla administratora, aby mógł wybrane adresy ręcznie blokować, kasować lub dodawać. Ale to już zależy od ostatecznej konstrukcji skryptu i tabeli z subskrybentami.

Oczywiście tabelę możesz rozbudować np. o nazwiska i imiona osób, aby wysyłać do nich personalizowane listy. Możesz też całą procedurę weryfikacyjną uprościć i nie stosować np. blokowania wielokrotnych potwierdzeń. Również kod może być krótszy niż 32 znaki. Szablon skryptu pozostaje jednak cały czas ten sam.



Wyszukiwarka

Podobne podstrony:
Jak wykonać montaż izolacji ścian zewnętrznych metodą lekką mokrą w Systemie?OROCK L WYKONAWSTWO KR
Jak wykonać montaż izolacji ścian zewnętrznych metodą lekką mokrą w Systemie?OROCK L WYKONAWSTWO KR
Jak wykonać montaż izolacji ścian zewnętrznych metodą lekką mokrą w Systemie ECOROCK L WYKONAWSTWO K
MAMO i babciu, Księga życzeń--zrób sam, instrukcja-jak wykonać
Jak wykonać szyk komponentów po lini śrubowej
jak wykonać raport po sprawdzianie
Jak wykonać decoupage, cooooooooooooos
Jak wykonać masaż antycellulitowy
Jak wykonać kable połączeniowe
Jak wykonać tęczowy makijaż Gucci, Makijaż i pielęgnacja
Jak wykonać wstążkową bombkę
Jak wyłączyć aktywację systemu Windows XP, TAKIE TAM (nieciekawe)
Jak stworzyć skuteczny system zarządzania zasobami ludzkimi
Jak wykonać izolację ścian budowanego domu
Mini poradnik Jak wykonac udane zdjecia wakacyjne
05 Systemy zapisu liczb
jak wykonac sortowanie przez zamiane wymiane wybor algorytm selection sort, PHP Skrypty
Sprawozdania grafy, Jak wykonac sprawozdanie
145 Jak wykonac prace w dwa razy krotszym czasie, Linux, płyty dvd, inne dvd, 1, Doradca Menedzera

więcej podobnych podstron