Klicka här för att prova exemplet nedan
Den här guiden visar hur du använder funktionen MAIL och skickar formulärdata till en epostadress. Dessutom visas hur du kontrollerar ditt formulär med enkel validering av att formulärfälten är ifyllda och validering av epostadresser med PREG_MATCH och REGEXP. Med HTTP_REFERER och SESSIONS kontrollerar du att Formmail skickas från just ditt formulär för att undvika att formuläret spammas. Dessutom används GET_MAGIC_QUOTES_GPC tillsammans med STRIPSLASHES för att kunna använda citationstecken och backslash som tecken i formulärfälten.
För att du ska kunna följa denna guide förutsätter vi att du har grundkunskaper i PHP motsvarande guiden PHP grunder » och PHP fortsättning »
OBS! Om du inte konfigurerat och använder din egen dator som webbserver med mailfunktionerna aktiverade kan du INTE testa dina PHP-sidor lokalt. Du måste då publicera och testa filerna online på din webbserver med PHP-stöd när du använder exemplen i denna guide.
För att mailfunktionerna i PHP ska fungera måste din webbserver ha tillgång till ett mailprogram som tex Sendmail, Qmail eller Postfix.
Kolla din PHP-info (se guiden phpinfo » ) om din webbserver online (inte den lokala webbservern) har sökvägen (Path) angiven till Sendmail:

Att skicka mail med PHP är relativt enkelt när du använder funktionen MAIL där du anger mottagarens epostadress, ämnesrubrik (subject) och själva meddelandetexten som parametrar:
Testa gärna din mailfunktion med koden ovan!
Ange din egen e-postadress och spara dokumentet med namnet "mail.php". Kör filen på din webbserver online och kolla om du får mailet i ditt vanliga epost-program så ser du om mailfunktionerna är korrekt installerade.
Läs mer om funktionen MAIL hos PHP.net
Du kan använda ett vanligt formulär för att skicka informationen direkt till en e-postmottagare. I exemplet nedan används två PHP-dokument, ett för formuläret och ett för koden som bearbetar innehållet i formuläret. Den sida som bearbetar formulärdatan fungerar också som en bekräftelsesida där den skickade informationen visas.
Läs mer om formulär i guiden PHP fortsättning »




Validering av innehållet i formuläret är viktigt! Det finns en viss risk att ditt formulär och ditt formmail-script blir spammat av någon spambot (spam robot). Anledningar till att spamma formulär är desamma som att spamma e-postadresser, målet är att sprida annonser och andra "erbjudanden". Dessutom vill spammarna lägga ut sina länkar (URL) i forum, gästböcker och bloggar för att hamna högre i rankingen hos sökmotorer som tex Google.
Du kan inte stoppa spam till 100% men du kan utföra åtgärder som minskar attackerna. En vanlig metod idag är att använda en verifieringsbild istället för vanlig text, en sk Captcha (robotfälla) vid inloggning till olika tjänster. Captchas används nu tyvärr även av spammare för att förhindra att ditt antispamprogram använder OCR för att hitta textinformation som är vanlig i spam. Läs mer om Spambots
och Captcha
hos Wikipedia.
Läs mer i guiden Formmail med CAPTCHA » om hur du kan använda dina egna captcha i ditt formulär.
Du kan validera ditt formulär med de två metoderna clientside och serverside. När du validerar clientside används vanligen Javascript som direkt i webbläsaren kontrollerar innehållet i formuläret. Den här metoden är ibland snabbare än att använda serverside validering med PHP eftersom ingen information skickas mellan användaren och webbservern när valideringen genomförs. Nackdelen med Javascript är att vissa användare stängt av användning av Javascript i sin webbläsare och att olika webbläsare kan behandla koden olika. Validering serverside med PHP är en säkrare metod och du kan använda båda metoderna för att säkerställa att någon av valideringarna genomförs.
Vi har valt att använda validering serverside med PHP. I det här avsnittet visas hur du kan använda en enkel validering för att kontrollera att innehåll har angivits i de formulärfält du vill att användaren ska fylla i innan formuläret skickas. Här kontrolleras inte om innehållet är korrekt och att giltiga e-postadresser och URL:er angivits och detta visas istället i nästa avsnitt.



Den enkla valideringen i avsnittet ovan kan vara tillräcklig om du bara vill säkerställa att vissa fält verkligen är ifyllda. Om du däremot har behov av att den angivna informationen verkligen är korrekt kan du använda regular expressions (reguljära uttryck).
I detta avsnitt visas hur du använder reguljära uttryck för att kontrollera att e-postadresser är giltiga. Ett reguljärt uttryck (regular expression) eller ibland förkortat till regexp eller regex är en metod för att matcha komplexa strängars mönster som tex en e-postadress. Det finns flera funktioner i PHP som använder reguljära uttryck och vi kommer att använda PREG_MATCH (perform a regular expression match) för att ange ett mönster som epostadresser måste följa för att vara giltiga.
Läs mer om PREG_MATCH hos PHP.net
Att validera en epostadress kan göras genom att först kontrollera om tecknet @ finns angivet. Nästa steg är att kontrollera uppbyggnaden av e-postadressen som ofta är name@domain.suffix vilket i vårt exempel är lisa@dromvavaren.se men i verkligheten skulle kunna vara andra varianter:
Idag kan ju även åäö och vissa andra sk "specialtecken" användas och även toppdomänerna som förut var två eller tre tecken som tex: .SE .COM .NET kan idag vara upp till sex tecken då nya toppdomäner tillkommit som tex .MUSEUM .INFO .TRAVEL .JOBS .MOBI mfl.
Dessutom finns förslag på att domännamn som förut bara använde ASCII-tecken ska kunna innehålla Internationalized Domain Names (IDNs) som använder lokala teckenuppsättningar specifikt för olika länder och språk som tex arabiska och kinesiska.
Som du förstår är det omöjligt att ange ett reguljärt urtryck som innefattar alla kombinationer av domännamn med de olika specialtecken som finns. Om du anger ett mönster som är FÖR specifikt kan du utestänga många e-postadresser och om du istället anger ett för allmänt mönster kommer ogiltiga e-postadresser att kunna användas medvetet eller omedvetet av avsändaren. Det viktiga är ju att en kontroll sker av att e-postadressen kan vara giltig än att verifiera att den verkligen finns. Du undviker då förhoppningsvis att användaren av misstag anger en felaktig adress men hindrar inte spambots från att spamma ditt formulär.
Exemplet nedan visar verifiering av e-postadress där adressen hämtats från formuläret i vårt tidigare exempel och sparats i variabeln $emailcheck för att sedan matchas mot det reguljära uttrycket som angivits i funktionen PREG_MATCH:
Om vi tittar närmare på vad uttrycket innebär (och tar bort åäö i mönstret) så är exemplet:
Tecknen A-Z och siffrorna 0-9 är enkla att förstå men de övriga tecknen förklaras här:
| / | början och slut på mönstret |
| ^ | matcha från start av strängen |
| $ | matcha från slutet av strängen |
| [] | matcha någon av tecknen inom hakparentesen |
| + | antal tecken som matchas. Plustecken betyder "1 eller fler". |
| * | antal tecken som matchas. Asterisk betyder "0 eller fler". |
| {2} | antal tecken som matchas (exakt 2) |
| {2,6} | antal tecken som matchas (minst 2 och högst 6) |
| i | anger att de angivna tecknen matchas både versalt och gement (OBS! viktigt i vårt exempel). Om inte "i" anges så måste både versaler och gemener av de angivna tecknen anges. Exemplet a-z0-9\å\ä\ö ändras till a-zA-Z0-9\å\Å\ä\Ä\ö\Ö |
Om vi delar upp koden i tre delar så blir det tydligare vad varje uttryck egentligen gör.
Del 1:
... innebär att den del av epostadressen som anges före @ måste innehålla minst ETT tecken (+) som då kan vara bokstäver mellan a-z och siffror mellan 0-9 samt punkt (.) underscore (_) och bindestreck (-).
Inledningen av e-postadressen kan då vara:
Del 2:
...innebär att den del av e-postadressen som anges efter @ måste innehålla minst ETT tecken (+) enligt ovan men måste avslutas med en punkt (här anges en backslash som escape-tecken för att ange att punkten inte är en del av koden utan är just tecknet "punkt").
Fortsättningen på e-postadressen kan då vara:
Del 3:
... innehåller den sista delen av e-postadressen efter det obligatoriska punkt-tecknet. Måste innehålla minst 2 och högst 6 tecken som bara får vara bokstäverna a-z . Notera även bokstaven "i" som ju anger att både VERSALER och gemener omfattas.
Den sista delen av e-postadressen kan då vara:
Lägg till validering serverside med funktionen PREG_MATCH i vårt formmail-exempel enligt nedan.



Problemet med spambots (som vi informerade om i avsnittet Enkel validering av formuläret » ovan) kan du minska genom att använda funktionen HTTP_REFERER som kontrollerar att "formmail.php" hämtar uppgifterna från just ditt formulär. HTTP_REFERER hämtar URL:en för den sida som skickar information eller länkar vidare till den aktuella sidan och det är webbläsaren som lagrar informationen (clientside istället för serverside).
OBS! Vissa webbläsare använder inte HTTP_REFERER och brandväggar kan vara inställda på att inte acceptera referers. Användaren kan dessutom själv stänga av funktionen (detsamma gäller ju Javascript) och detta är alltså inte en helt tillförlitlig metod men kan vara ett bra alternativ till att få formuläret spammat. Om du får problem med spam i dina formulär kan du ju använda HTTP_REFERER tillfälligt under en period och sedan ta bort funktionen.

En annan metod för att minska spam är att använda sessioner som kontrollerar att "formmail.php" hämtar uppgifterna från ditt formulär. Läs mer om sessioner i guiden PHP fortsättning »
Den här metoden startar en session i "contactform.php" som lagrar innehållet i den globala variabeln $_SESSION och i "formmail.php" kontrolleras om variabeln finns eller ej.




PHP använder tecknet backslash \ som escape-tecken framför citationstecken (dubbla citationstecken " och enkla citationstecken ' ) i data som skickas från ett formulär. Citationstecken (quotes) i en sträng kan göra så att strängen delas upp.
Exemplet nedan resulterar i en felaktigt uppbyggd sträng som inte visas och dessutom påverkar övrig kod:
Om backslash används som escape-tecken framför citationstecknet så visas strängen med citationstecknet som en del av textsträngen istället för kod:
Nu visas strängen med citationstecknet:

Du kan även använda enkla enkla citationstecken ' istället för dubbla citationstecken " när du omsluter strängen:
...och tvärtom om du vill visa en enkel fnutt:
PHP har en inställning i konfigurationen som kallas MAGIC_QUOTES_GPC där "gpc" betyder GET, POST och COOKIE och gäller framförallt för information som bearbetas via formulär.
Du kan använda din PHP-info för att kontrollera om din PHP-servers inställning för MAGIC_QUOTES_GPC(läs mer i guiden phpinfo - info om PHP-installation »)
Här visas att magic_guotes_gpc är inaktiverat:

Du kan också använda funktionen GET_MAGIC_QUOTES_GPC för att se dina inställningar. Notera att i exemplet nedan används backslash som escape-tecken för att visa citationstecknen i textsträngen vilket behövs då GET_MAGIC_QUOTES_GPCär inaktiverat:
Resultatet i webbläsaren:

Läs mer om GET_MAGIC_QUOTES_GPC hos PHP.net
PHP använder tecknet backslash \ som escape-tecken även framför själva tecknet backslash \.
Om du skriver en sökväg i vårt formulärexempel som tex:så kan resultatet bli dubbla backslash i sökvägen (om GET_MAGIC_QUOTES_GPCär aktiverat):
Om GET_MAGIC_QUOTES_GPC däremot INTE är aktiverat så lägger inte PHP till extra backslashes och sökvägen ändras inte.
Funktionen STRIPSLASHES kan användas för att ta bort de extra backslashes som PHP eventuellt lägger till.
Läs mer om STRIPSLASHES hos PHP.net



TIPS! Du kan skydda ditt formulär mot spamrobotar genom att använda en "captcha" - läs mer i guiden Formmail med CAPTCHA »
Om du får problem med användning av PHP Mail kan du läsa mer i guiden Felsökning i PHP och MySQL »
Hämta mallarna i guiden Formmail - färdiga mallar »
Mallar som använder funktionen MAIL för att skicka formulärdata till en epostadress. Formulären kontrolleras med validering av att formulärfälten är ifyllda och validering av epostadresser sker med PREG_MATCH och REGEXP. Exemplen innehåller även HTTP_REFERER som en kontroll av att Formmail skickas från just ditt formulär och för att kunna använda citationstecken och backslash som tecken i formulärfälten används GET_MAGIC_QUOTES_GPC tillsammans med STRIPSLASHES.