Så här implementerar du e-postbekräftelse för nya medlemmar

Har du någonsin skapat ett konto med en webbplats och var skyldig att kolla din e-post och klicka genom en verifieringslänk som företaget skickade för att aktivera det? Om du gör så minskar antalet spamkonton mycket. I den här lektionen lär vi oss hur vi gör det här!

Letar du efter en genväg?

Denna handledning lär dig att bygga ett e-postbekräftelseskript från början, men om du vill ha något som du kan använda direkt på din webbplats, kolla in Email Verify på Envato Market. 

Email Verify är ett PHP-skript som låter dig verifiera e-postadresser utan att lagra någonting i några databaser. Det kommer att skicka användare ett e-postmeddelande som kräver att de klickar på en länk för att verifiera deras e-post innan deras e-postmeddelande läggs till vad som helst du vill lägga till det till.

Email Verifiera på Envato Market

Vad ska vi bygga?

Vi ska bygga ett fint PHP-registreringsskript där en användare kan skapa ett konto för att få tillgång till en "medlemssektion" på en webbplats.
När användaren har skapat sitt konto låses kontot tills användaren klickar på en verifieringslänk som han kommer att få i sin e-postlåda.


Steg 1 - Registreringssida

Vi behöver först en enkel sida där våra besökare kan registrera sina konton. så det är det första vi ska bygga.
Jag vill påminna dig om att detta är en PHP-handledning, och enligt min mening tror jag att du behöver veta grunderna i HTML innan du går vidare med PHP. Jag lägger till kommentarer till HTML & CSS för att beskriva varje rad kod.

index.php - Detta är vår anmälningssida med en grundläggande blankett.

   NETTUTS> Registrera dig     

NETTUTS> Registrera dig

Registreringsformulär

Vänligen ange ditt namn och e-postadress för att skapa ditt konto

css / style.css - Detta är stylesheet för index.php och ytterligare sidor.

/ * Globala format * / * vaddering: 0; / * Återställ all padding till 0 * / margin: 0; / * Återställ all marginal till 0 * / kropp bakgrund: # F9F9F9; / * Ange HTML-bakgrundsfärg * / font: 14px "Lucida Grande"; / * Ange global typsnittstyp och familj * / färg: # 464646; / * Ange global textfärg * / p marginal: 10px 0px 10px 0px; / * Lägg till lite vaddering på toppen och botten av 

taggar * / / * rubrik * / #header height: 45px; / * Ange huvudhöjd * / bakgrund: # 464646; / * Ange bakgrundsfärg * / #header h3 color: # FFFFF3; / * Ange rubrikrubrik (topp vänster titel) färg * / vaddering: 10px; / * Ange vaddering, för att centrera den inom rubriken * / font-weight: normal; / * Ställ in fontvikt till normalt, standard var det inställt på fetstil * / / * Wrap * / #wrap background: #FFFFFF; / * Ange innehållsbakgrund till vitt * / bredd: 615px; / * Ange bredden på vårt innehållsområde * / marginal: 0 auto; / * Center vårt innehåll i vår webbläsare * / margin-top: 50px; / * Marginal toppen för att göra lite mellan rubriken och innehållet * / vaddering: 10px; / * Padding för att göra lite mer utrymme för vår text * / border: 1px solid #DFDFDF; / * Liten gräns för slutbehandling * / text-align: center; / * Centrera vår innehållstext * / #wrap h3 font: italic 22px Georgia; / * Ange teckensnitt för vårt rubrik 2 som kommer att visas i vår wrap * / / * Form & Input-fältstilar * / form margin-top: 10px; / * Gör lite mer avstånd från beskrivningstexten * / formuläret .submit_button background: # F9F9F9; / * Set-knappen bakgrund * / border: 1px solid #DFDFDF; / * Liten kant runt vår inlämningsknapp * / vaddering: 8px; / * Lägg till lite mer utrymme runt vår knapptext * / inmatning font: normal 16px Georgia; / * Ange teckensnitt för våra inmatningsfält * / border: 1px solid #DFDFDF; / * Liten kant runt vårt inmatningsfält * / vaddering: 8px; / * Lägg till lite mer utrymme runt vår text * /

Som du kan se har jag lagt till en kommentar till varje rad som beskriver vad de gör. Du kanske också har märkt följande kommentar i index.php-filen:

 

Vi ska skriva vårt PHP mellan dessa 2 linjer!


Steg 2 - Input Validation

Det första vi ska bygga är ett stycke kod som ska validera informationen. Här är en kort lista som beskriver vad som behöver göras.

  • Om namnfältet inte är tomt.
  • Om namnet inte är kort.
  • Om e-postfältet inte är tomt.
  • Om e-postadressen är giltig [email protected]

Så vårt första steg är att kontrollera om formuläret skickas in och att fälten inte är tomma.

  

Tid för en uppdelning! Vi börjar med ett IF-uttalande och vi validerar först namnfältet:

 if () // Om uppgift är sant körkod mellan parentes isset ($ _ POST ['name']) // Är namnsfältet publicerat; det spelar ingen roll om det är tomt eller fyllt. && // Detta är detsamma som OCH i vårt uttalande; det låter dig kontrollera flera uttalanden. ! tom ($ _ POST ['namn']) // Verifiera om fältnamnet inte är tomt isset ($ _ POST ['email']) // Är e-postfältet publicerat; det spelar ingen roll om det är tomt eller fyllt. && // Detta är detsamma som OCH i vårt uttalande; det låter dig kontrollera flera uttalanden. ! tom ($ _ POST ['email']) // Verifiera om fältet e-post inte är tomt

Så om du skulle skicka in formuläret nu med tomma fält, händer ingenting. Om du fyller i båda fälten kommer vårt skript att köra koden mellan parenteserna.
Nu ska vi skapa en kod som kontrollerar om en e-postadress är giltig. Om det inte är det kommer vi att returnera ett fel. Låt oss också ändra våra postvariabler i lokala variabler:

om isset ($ _ POST ['name']) &&! tomt ($ _ POST ['name']) och isset ($ _ POST ['email']) &&! tomt ($ _ POST ['email']) namn = mysql_escape_string ($ _ POST ['name']); // Vrid vår post till en lokal variabel $ email = mysql_escape_string ($ _ POST ['email']); // Vrid vår post till en lokal variabel

Vi kan nu nå våra data via våra lokala variabler. Som du kan se har jag också lagt till en MySQL-flyktsträng för att förhindra MySQL-injektion när du sätter in data i MySQL-databasen.

"Funktionen mysql_real_escape_string () undviker specialtecken i en sträng för användning i ett SQL-uttalande."

Vanliga uttryck

Nästa upp är ett litet stycke som kontrollerar om e-postadressen är giltig.

 $ name = mysql_escape_string ($ _ POST ['name']); $ email = mysql_escape_string ($ _ POST ['email']); if (eregi ( "^ [_ a-z0-9 -]! + (\ [_ a-z0-9 -]. ^) * @ [a-z0-9 -]. + (\ [a-z0-9- ] +) * (\. [az] 2,3) $ ", $ email)) // Returfel - Ogiltig Email Annan // Returrätt - Giltigt Email

Observera att jag inte personligen skrev det här reguljära uttrycket, det är ett litet fragment från php.net.
I grund och botten verifierar den om e-postmeddelandet är skrivet i följande format:

 [email protected]

Nu i eregi kan du se att det kontrollerar om e-postmeddelandet innehåller tecken från alfabetet, om det har några siffror eller en fantomdash (_), och naturligtvis de grundläggande kraven för ett e-postmeddelande (email) '@' och en punkt)'.' Om ingen av dessa tecken hittas returnerar uttrycket "false". Okej, så nu måste vi lägga till några grundläggande felmeddelanden.

 if (eregi ( "^ [_ a-z0-9 -]! + (\ [_ a-z0-9 -]. ^) * @ [a-z0-9 -]. + (\ [a-z0-9- ] +) * (\. [az] 2,3) $ ", $ email)) // Returfel - Ogiltig e-post $ msg = 'E-postadressen du har angett är ogiltig, försök igen.';  else // Returrätt - Giltig e-post $ msg = 'Ditt konto har gjorts, 
bekräfta det genom att klicka på aktiveringslänken som har skickats till ditt mail. ';

Som du kan se har vi gjort en lokal variabel "$ msg", så tillåter vi oss att visa felet eller framgångsmeddelandet var som helst på sidan.
Och vi ska visa den mellan instruktionstexten och formuläret.

  

Registreringsformulär

Vänligen ange ditt namn och din e-postadress för att skapa ditt konto

'$ Msg'.
'; // Visa vårt meddelande och linda det med en div med klassen "statusmsg". ?>

Lägg till detta till style.css, att ställa in vårt statusmeddelande lite.

#wrap .statusmsg font-size: 12px; / * Ange meddelandets teckenstorlek * / vaddering: 3px; / * Några vadderingar för att göra lite mer utrymme för vår text * / bakgrund: #EDEDED; / * Lägg till en bakgrundsfärg till vårt statusmeddelande * / border: 1px solid #DFDFDF; / * Lägg till en ram runt vårt statusmeddelande * /

Steg 3 - Skapa databasen och upprätta en anslutning

Nu måste vi upprätta en databasanslutning och skapa ett bord för att infoga kontodata. Så låt oss gå till PHPMyAdmin och skapa en ny databas med namnet registreringar och skapa ett användarkonto som har tillgång till den databasen för att infoga och uppdatera data.

Låt oss skapa vår användare bord med 5 fält:

Så nu måste vi ange detaljer för dessa fält:

För dem som inte vill mata in dessa data manuellt kan du istället köra följande SQL-kod.

CREATE TABLE 'users' ('id' INT (10) INTE NULL AUTO_INCREMENT PRIMÄR KEY, 'användarnamn' VARCHAR (32) INTE NULL, 'lösenord' VARCHAR (32) INTE NULL, 'email' TEXT INTE NULL, 'hash' VARCHAR (32) INTE NULL, 'aktiv' INT (1) INTE NULLSTÄLLIGT '0') MOTOR = MYISAM;

Vår databas är skapad, nu måste vi upprätta en anslutning med PHP. Vi skriver följande kod i början av vårt skript strax nedanför följande rad:

  

Vi använder följande kod för att ansluta till databasservern och välja registreringar databas. (grundläggande MySQL-anslutning)

mysql_connect ("localhost", "användarnamn", "lösenord") eller dö (mysql_error ()); // Anslut till databasserver (localhost) med användarnamn och lösenord. mysql_select_db ("registreringar") eller dö (mysql_error ()); // Välj registreringsdatabasen.

Nu när vi har etablerat en anslutning till vår databas kan vi gå vidare till nästa steg och infoga kontodetaljerna.


Steg 4 - Lägg in konto

Nu är det dags att ange de inlämnade kontouppgifterna i vår databas och skapa en aktiveringshash. Skriv följande kod nedanför den här raden:

// Returrätt - Giltig e-post $ msg = 'Ditt konto har gjorts, 
bekräfta det genom att klicka på aktiveringslänken som har skickats till ditt mail. ';

Aktiveringshash

I vår databas har vi gjort ett fält som heter hash, denna hash är en 32 teckensträng text. Vi skickar även den här koden till användarens e-postadress. De kan sedan klicka på länken (som innehåller hasen) och vi kommer att verifiera om den matchar den som finns i databasen. Låt oss skapa en lokal variabel som heter $ hash och generera en slumpmässig md5 hash.

$ hash = md5 (rand (0,1000)); // Generera slumpmässig 32 tecken hash och tilldela den till en lokal variabel. // Exempel utmatning: f4552671f8909587cf485ea990207f3b

Vad gjorde vi? Tja, vi använder PHP-funktionen "Rand" för att generera ett slumptal mellan 0 och 1000. Därefter vänder vår MD5-funktion detta nummer till en 32-teckensträng text som vi kommer att använda i vår aktiverings-e-post. Mitt val är att använda MD5, eftersom det genererar en hash med 32 tecken, vilket är säkert och i det här fallet omöjligt att spricka.

Skapa ett slumpmässigt lösenord

Nästa sak vi behöver är att skapa ett slumpmässigt lösenord för vår medlem:

$ lösenord = rand (1000,5000); // Generera slumptal mellan 1000 och 5000 och tilldela det till en lokal variabel. // Exempel utmatning: 4568

Infoga följande information i vår databas med hjälp av en MySQL-fråga

mysql_query ("INSERT INTO users (användarnamn, lösenord, email, hash) VALUES ('". mysql_escape_string ($ name).' ',' ". mysql_escape_string (md5 ($ lösenord)). e-post). "", "" mysql_escape_string ($ hash). "')") eller dö (mysql_error ());

Som ni kan se lägger vi in ​​alla data med en MySQL flyktsträng runt den för att förhindra MySQL-injektion.
Du kan också märka att MD5-funktionen ändrar slumpmässigt lösenord till en säker hash för skydd. Exempel: Om en "ond" person får tillgång till databasen, kan han inte läsa lösenorden.

För att testa, fyll i formuläret och kontrollera om data läggs in i vår databas.


Steg 5 - Skicka verifieringsadressen

Strax efter att vi har lagt in informationen i vår databas, måste vi skicka ett mail till användaren med verifieringslänken. Så låt oss använda PHP-postfunktionen för att göra just det.

$ till = $ email; // Skicka e-post till vår användare $ subject = 'Signup | Verifiering'; // Ge e-postmeddelandet ett ämne $ message = 'Tack för att du anmält dig! Ditt konto har skapats, du kan logga in med följande uppgifter när du har aktiverat ditt konto genom att trycka på webbadressen nedan. ------------------------ Användarnamn: '. $ Namn.' Lösenord: '. $ Lösenord.' ------------------------ Vänligen klicka på den här länken för att aktivera ditt konto: http://www.yourwebsite.com/verify.php?email= ' . $ email. '& hash ='. $ hash. '; // Vårt meddelande ovan inklusive länken $ headers =' Från: [email protected] '. "\ r \ n"; // Ange från rubrikpost ($ till, $ ämne, $ meddelande, $ rubriker); // Skicka vår email

Låt oss nu bromsa meddelandet:

Tack för att du anmält dig! Ditt konto har skapats, du kan logga in med följande uppgifter när du har aktiverat ditt konto genom att trycka på webbadressen nedan. ------------------------ Användarnamn: '. $ Namn.' Lösenord: '. $ Lösenord.' ------------------------

I koden ovan skickar vi en kort beskrivning till vår användare som innehåller användarnamnet och lösenordet - med hjälp av de lokala variablerna vi skapade när data skickades.

Vänligen klicka på den här länken för att aktivera ditt konto: http://www.yourwebsite.com/verify.php?email='.$email.'&hash='.$hash. '

I det här avsnittet av koden skapade vi en dynamisk länk. Resultatet av detta kommer att se ut så här:

Som du kan se skapar den en solid url, vilket är omöjligt att gissa. Det här är ett mycket säkert sätt att verifiera e-postadressen till en användare.


Steg 6 - Kontotaktivering

Som du kan se länkar våra webbadresser till verify.php så låt oss skapa det, med samma grundläggande mall som vi använde för index.php.
Ta bort formuläret från mallen.

   NETTUTS> Registrera dig     

NETTUTS> Registrera dig

Det första vi behöver göra är att kontrollera om vi har våra $ _GET-variabler (email och hash)

om isset ($ _ GET ['email']) &&! tomt ($ _ GET ['email']) och isset ($ _ GET ['hash']) &&! tom ($ _ GET ['hash' / Verifiera data annat // Ogiltigt tillvägagångssätt

För att göra sakerna lite enklare, låt oss tilldela våra lokala variabler och lägga till MySQL-injektionsprevention genom att återigen använda MySQL-flyktsträngen.

om isset ($ _ GET ['email']) &&! tomt ($ _ GET ['email']) och isset ($ _ GET ['hash']) &&! tom ($ _ GET ['hash' / Verifiera data $ email = mysql_escape_string ($ _ GET ['email']); // Ange e-postvariabel $ hash = mysql_escape_string ($ _ GET ['hash']); // Ange hash-variabel

Nästa är att kontrollera data från webbadressen mot data i vår databas med hjälp av en MySQL-fråga.

$ search = mysql_query ("SELECT email, hash, active FROM användare där. $ email." "OCH. $ hash." "OCH aktiv =" 0 "") eller dö (mysql_error ()); $ match = mysql_num_rows ($ search);

I koden ovan använde vi ett MySQL-valda uttalande och kontrollerade om e-post och hash matchade. Men förutom det, vi kollade om status för kontot är "inaktivt". Slutligen använder vi mysql_num_rows för att bestämma hur många matchningar har hittats. Så låt oss prova detta. Använd bara ett enkelt eko för att returnera resultaten.

$ search = mysql_query ("SELECT email, hash, active FROM användare där. $ email." "OCH. $ hash." "OCH aktiv =" 0 "") eller dö (mysql_error ()); $ match = mysql_num_rows ($ search); echo $ match; // Visa hur många matchningar har hittats -> ta bort det här när du är klar med testet;)

Vi har en MATCH! För att ändra resultatet, ändra bara e-postmeddelandet och du ser att det återvände numret är 0.
Vi kan använda vår $ match variabel för att antingen aktivera kontot eller returnera ett fel när ingen matchning har hittats.

om ($ match> 0) // Vi har en matchning, aktivera kontot annars // Ingen match -> ogiltigt webbadress eller konto har redan aktiverats. 

För att aktivera kontot måste vi uppdatera aktiva fält till 1 med hjälp av en MySQL-fråga.

// Vi har en match, aktivera kontot mysql_query ("UPDATE-användare SET active =" 1 "WHERE. $ Email." "OCH. $ Hash." "OCH aktiv =" 0 "") eller dö (mysql_error ()) ; eko "
Ditt konto har aktiverats, du kan nu logga in
';

Så vi använder samma söktermer för uppdateringen som vi använde i vår MySQL-valda fråga. Vi byter aktiv till 1 där e-post, hash och fältet aktiv = 0 matchar upp. Vi returnerar också ett meddelande som berättar användaren att hans konto har aktiverats. Du kan lägga till ett meddelande som vi gjorde här till delen "ingen match". Så den slutliga koden ska likna följande:

mysql_connect ("localhost", "handledning", "lösenord") eller dö (mysql_error ()); // Anslut till databasserver (localhost) med användarnamn och lösenord. mysql_select_db ("registreringar") eller dö (mysql_error ()); // Välj registreringsdatabasen. om isset ($ _ GET ['email']) &&! tomt ($ _ GET ['email']) och isset ($ _ GET ['hash']) &&! tom ($ _ GET ['hash' / Verifiera data $ email = mysql_escape_string ($ _ GET ['email']); // Ange e-postvariabel $ hash = mysql_escape_string ($ _ GET ['hash']); // Ange hash-variabel $ search = mysql_query ("VÄLJ email, hash, aktiv FROM användare där. $ Email." "OCH. $ Hash." "OCH aktiv =" 0 "") eller dö (mysql_error ()); $ match = mysql_num_rows ($ search); om $ match> 0 // Vi har en matchning, aktivera kontot mysql_query ("UPDATE-användare SET active =" 1 "WHERE. $ email." "OCH. $ hash." "OCH aktiv =" 0 "" ) eller dö (mysql_error ()); eko "
Ditt konto har aktiverats, du kan nu logga in
'; else // No match -> Ogiltigt webbadress eller konto har redan aktiverats. eko "
Webbläsaren är antingen ogiltig eller du har redan aktiverat ditt konto.
'; else // Ogiltigt tillvägagångssätt echo '
Ogiltigt tillvägagångssätt, använd länken som har skickats till din e-postadress.
';

Om du besöker verify.php utan några strängar kommer följande fel att visas:


Steg 7 - Logga in

I det här sista steget kommer jag att visa dig hur du skapar ett grundläggande inloggningsformulär och kontrollera om kontot är aktiverat. Skapa först en ny fil som heter login.php med den grundläggande mallen som vi använde tidigare, men denna gång ändrade jag formuläret till en inloggningsblankett.

   NETTUTS> Registrera dig     

NETTUTS> Registrera dig

Inloggningsformulär

Vänligen ange ditt namn och lösenord för att logga in

'$ Msg'.
'; // Visa vårt meddelande och lägg till en div runt den med klass statusmsg?>

Formuläret är grundläggande HTML, och nästan detsamma som registreringsformuläret, ingen ytterligare förklaring behövs. Nu är det dags att skriva koden för inloggningsskriptet, som vi kommer skriva precis under MySQL-anslutningskoden. Vi börjar med något som vi också gjorde i registreringsformuläret.

om isset ($ _ POST ['name']) &&! tomt ($ _ POST ['name']) och isset ($ _ POST ['lösenord']) &&! tomt ($ _ POST ['lösenord']) / Båda fälten läggs ut och det är inte tomma

Så vi kontrollerar först för att se om uppgifterna läggs ut och vi ser till att det inte är tomt.
Nästa är att skapa några lokala variabler för postdata:

om isset ($ _ POST ['name']) &&! tomt ($ _ POST ['namn']) och isset ($ _ POST ['lösenord']) &&! tomt ($ _ POST ['lösenord'])) $ användarnamn = mysql_escape_string ($ _ POST ['name']); // Ange variabel för användarnamnet $ password = mysql_escape_string (md5 ($ _ POST ['lösenord'])); // Ange variabel för lösenordet och konvertera det till en MD5-hash. 

Vi skapade de lokala variablerna och ändrade lösenordet till en md5 hash för att matcha det med lösenords hash som vi har lagrat i databasen.
Nu är det dags att skapa anslutningen till vårt "användar" -bord och verifiera om den angivna data är korrekt.

om isset ($ _ POST ['name']) &&! tomt ($ _ POST ['namn']) och isset ($ _ POST ['lösenord']) &&! tomt ($ _ POST ['lösenord'])) $ användarnamn = mysql_escape_string ($ _ POST ['name']); $ password = mysql_escape_string (md5 ($ _ POST ['lösenord'])); $ search = mysql_query ("SELECT användarnamn, lösenord, aktiv FRÅN användare där. $ användarnamn." "OCH. $ lösenord." "OCH aktivt =" 1 "") eller dö (mysql_error ()); $ match = mysql_num_rows ($ search); 

Vi skrev en MySQL-fråga som väljer användarnamn, lösenord och aktiv information från vår databas, om användarnamnet och lösenordet matchar upp.
OCH aktiv = "1" är! VIKTIGT! Detta gör att du bara kan logga in om ditt konto är aktiverat. Vi använder MySQL num raderna igen för att se hur många matchningar som finns.

om ($ match> 0) $ msg = 'Logga in Komplett! Tack'; // Ange cookie / Start session / Start Download etc ... else $ msg = 'Logga in misslyckades! Se till att du anger rätt information och att du har aktiverat ditt konto. '; 

I koden ovan kontrollerar vi om inloggningen var en succé eller inte.


Slutet

Och det är slutet på denna handledning! Jag hoppas att du tyckte om det, och om du gjorde det var vänlig lämna en kommentar nedan!