Formmail med PHP

Tags:    php
Skrevet af Bruger #5426 @ 23.05.2005
Jeg efterhånden stødt på mange, som finder det svært at lave en formmail med PHP. Den formmail jeg vil gennemgå her er meget simpel, og kan sagtens udbygges med flere funktioner. Eksemplet i artiklen kan bruges som en slags "Kontakt os" funktion, da vi ikke lader klienten bestemme hvor e-mailen skal sendes hen. Det er dog nemt at bygge på, hvis det er det man vil have.

Vi skal bruge 2 filer til dette script. En HTML fil, med en formular, som så sendes videre til en PHP fil, der sørger for at dataene bliver sendt. Hvis det ønskes kan det hele sagtens laves i en fil. Jeg vil sidst i artiklen gennemgå hvordan det kan gøres, dog kun teoretisk, for jeg mener at man lærer meget ved også at prøve sig frem en gang imellem.

Let's get it started



Den første fil vi laver, kalder vi kontakt.htm. Det eneste der er i den, er faktisk den formular, som brugeren skal udfylde for at sende en mail.

De informationer vi gerne vil have fra brugeren er:
*Navn
*E-mail
*Emne
*Besked

Kontakt.htm kommer derfor til at se således ud:
Fold kodeboks ind/udKode 


For nybegyndere kan jeg lige forklare hvad formularen gør, kort:

Fold kodeboks ind/udKode 

<form> er starten på formularen. Action attributten bestemmer hvor dataene fra formularen skal sendes hen, når der bliver trykket send. Method bestemmer hvordan dataene skal sendes. Der er to valgmuligheder ved method, GET og POST. Ved GET sendes dataene i url'en, f.eks. www.udvikleren.dk/vis_ui.php?id=5426. POST sender dataene i headeren, hvilket gør dem "usynlige".
Fold kodeboks ind/udKode 

Derefter kommer der nogle <input> felter, som vi giver en type, der i dette tilfælde er text. Det gær dem til et standard text felt. Af andre muligheder kan nævnes password, som skjuler alle indtastede tegn. Derefter har vi en attribut der hedder name, som vi skal bruges når vi skal hente dataene med PHP.
Fold kodeboks ind/udKode 

Vi kan ikke bruge almindelige tekstfelter til at skrive vores besked i, så derfor bruger vi et <textarea>. Der kan du selv justere hvor mange kolonner og rækker der skal være, ved at ændre på rows og cols. Den har også et name, som vi skal bruge når vi skal få fat i beskeden med PHP.
Fold kodeboks ind/udKode 

Til sidst har vi en <input> af typen submit. Den bruger vi, når vi skal sende dataene fra formularen. Dens value angiver hvad der skal stå på knappen.


PHP koden


Nu er vi faktisk færdige med formularen, så nu kommer det sjove. PHP koden.

Det første vi gør, er at checke om brugeren kom fra kontakt.htm. Det gør vi ved at se om en variabel fra formularen er sat. Derefter henter vi alle dataene fra formularen over i nogle almindelige variabler. Dette er ikke et krav, men gøres for læsbarhedens skyld.

Fold kodeboks ind/udKode 

Når det så er gjort, vil vi gerne være sikre på at brugeren har udfyldt alle felterne i vores formular. Derfor tjekker vi om nogle af varibalerne er tomme, ved at bruge funktionen empty().
Fold kodeboks ind/udKode 


Det næste (og sidste) tjek handler om brugerens e-mail. Vi vil gerne være sikre på at vi kan svare på, henvendelser fra brugerne, så derfor skal vi være sikre på at e-mail adressen er rigtig. Derfor bruger vi noget regex til at checke om den indeholder et @. Hvis mailen er gyldig, sender vi mailen.

Fold kodeboks ind/udKode 


Så er vi faktisk færdige. Samlet og lidt pænere stillet op, ser PHP scriptet således ud:
Fold kodeboks ind/udKode 


Tips til ændringer og forbedringer



Dette script er holdt på et rimeligt simpelt niveau. Hvis jeg selv skulle lave det på min egen hjemmeside, ville jeg nok foretrække at det var i 1 fil.

Det kan gøres med nogle få ændringer.

I din formular skal du indsætte et skjult objekt.
Fold kodeboks ind/udKode 
Derefter skal du i din php fil lave et tjek i starten og undersøge om $_POST['do'] er lig med validate. Hvis den er det, skal du køre koden, som vi lavede tidligere, men hvis den ikke er det, skal du bare vise formularen. Så indsætter du din php kode i toppen af din php fil, og formularen nedenunder.



En anden forbedring jeg kunne komme i tanke om at lave, ville være at, hvis brugeren laver fejl i formularen, skal personen straks sendes tilbage til formularen, men dataene skal gemmes, så man er fri for at indtaste det hele igen. Dette kunne f.eks. gøre med nogle sessions, som så bliver udskrevet som values i input felterne og textareaet.


Det var alt for denne gang. Håber du lærte noget, og kunne bruge hvad du lærte.

Hvad synes du om denne artikel? Giv din mening til kende ved at stemme via pilene til venstre og/eller lægge en kommentar herunder.

Del også gerne artiklen med dine Facebook venner:  

Kommentarer (44)

User
Bruger #7657 @ 23.05.05 22:14
Umiddelbart en forklaring som forståes af selv dummies som mig
10 - 4 og en ...
User
Bruger #6194 @ 23.05.05 22:52
En god artikel til en newbee som mig. Har efterhånden set flere artikler men dette må siges at være den bedste guide jeg har set også fordi den er så simpel hvilket jo er rart for nogen.

Håber du på et tidspunkt kommer med en mere dybdegående udbygning af "Tips til ændringer og forbedringer"

Mvh Rasmus Christensen
User
Bruger #285 @ 24.05.05 00:43
Ok introduktion til formmail/mail-funktionen. Dog synes jeg, at det er lidt misvisende at sige, at if(!isset($_POST['navn'])) bruges til at tjekke, om man kommer fra kontakt.htm. Til det bruger man jo REFERER - if(!isset($_POST['navn'])) tjekker jo blot om $_POST['navn'] er defineret. Men ellers ganske ok :-)
User
Bruger #7617 @ 24.05.05 21:13
Det du skriver med at, hvis man vil havde det i en fil, skal man insætte
<input type="hidden" name="do" value="validate">
og så det det if($_POST['do'])

Jeg plager bare at give submit knappen et navn, name="submit"

og så skriver jeg ellers bare if($submit) Og det virker helt fint!

Ellers god artikel, nem at forstå og fortæller godt om emnet.
User
Bruger #4479 @ 27.05.05 22:00
Så skal man have trykket på knappen! Det vil sige at man ikke bare kan trykke enter eller noget! Istedet kan man tjekke om der er sendt post informationer med if(strtoupper($_SERVER["REQUEST_METHOD"]) =="POST")
User
Bruger #4315 @ 30.05.05 16:37
i har mange teorier om hvordan man checker hvor man kommer fra, drop alle jeres data gennem POST, de kan fakes, det samme en referer, hvad er værre er at norton internet security fjerne referer, den eneste måde er at få din formular til at sætte en session variabel med REQUEST_URI, og så checke den når du poster.... og så skriver man aldrig if($var) men altid isset, og så få ige styr på det der email check... du kunne lige så godt skrive strstr('@', $str)....
User
Bruger #5800 @ 29.07.05 00:13
tsk tsk, refferer kan jo fakes :P
User
Bruger #7500 @ 03.11.05 16:28
Super artikel.
User
Bruger #8592 @ 01.12.05 22:51
En udmærket artikel der simpelt og effktivt gør rede for emnet.
User
Bruger #7326 @ 20.12.05 21:52
Jeg synes det er en god artiktle, den er nem og læse og giver god info
User
Bruger #8782 @ 02.01.06 15:44
Nem af forstå, god artikel, kan altid bruges :D
User
Bruger #8985 @ 23.03.06 17:41
Steffen Sørensen > Man kan da godt skrive if ($var), og jeg synes regulære udtryk er smartere end strstr, så jeg synes ikke der er nogen der skal få styr på noget, når det ser ud som om der allerede er nogenlunde godt styr på det ...
User
Bruger #6862 @ 17.06.06 16:33
God artikel. Super med den slags, når man er ny til dette her.
User
Bruger #10062 @ 24.06.06 21:29
Man kunne også bare skrvie:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html>
<head>
<title>Joen's blomster mailscript..</title>
<meta name="generator" content="TSW WebCoder" />
</head>

<body>
<?
if($_POST[send]){
if($_POST[navn] && $_POST[nick] && $_POST[alder] && $_POST[mail] && $_POST[skills]){
mail("Dinmail@dinhost.dk",
"Dit emne!",
"Hej.. $_POST[navn] Har en besked til dig!\\nNick: $_POST[nick]\\nMail: $_POST[mail]\\nBesked:\\n$_POST[besked]",
"From: $_POST[mail]\\nReply-to: $_POST[mail]");
?>Din besked er blevets sendt..<?
} else{
?>Du skal udfylde ALLE felter..! <br /><?
}
}
?>
<form action="" method="post">

Navn:<br />
<input type="text" name="navn" /><br />

Mail:<br />
<input type="text" name="mail" /><br />

Besked:<br />
<textarea cols="20" rows="5" name="besked"></textarea><br />
<input type="submit" name="send" value="Send så min mail..!" />
</form>
</body>
</html>

Enjoy
- Jns
User
Bruger #10266 @ 29.07.06 19:21
Meget godt tip, meeen....
Er den 5 UP værd?
Du kan se hvor mange hits der øverst, der hvor der står
forfatternavn!!
User
Bruger #10266 @ 29.07.06 19:21
HOV! Troede sq det var på eksperten :P
User
Bruger #10616 @ 01.10.06 13:19
Hej, jeg har lidt problemer med dette script.
Jeg ved ikke om det er pga. min webhost, eller om det er noget i scriptet.

Når jeg udfylder formularen første gang virker alt fint og der bliver sendt en mail til mig. Men hvis jeg så udfylder den endnu engang indenfor ca. 4 minutter efter den første gang, så går den over til fejlmeddelelsen "Der opstod en fejl. Prøv igen. Klik her for at komme tilbage til formularen".
Hvis jeg venter lidt mere end 5 minutter så virker det igen.

Nogen der ved hvad der er gået galt? Jeg kunne forestille mig at det er fordi værdierne i variablerne ikke er blevet slettet, men jeg ved ikke hvordan man i så fald gør det.
User
Bruger #10616 @ 01.10.06 17:00
Jeg har netop forsøgt at uploade det til den server det skal køre fra i sidste ende, og der fungerer det upåklageligt, så det er åbenbart min webhost der er problemet.
User
Bruger #6953 @ 11.11.06 16:05
Nu kunne man have brugt preg, siden den anden kode som skulle tjekke om det er en gyldig e-mail ikke virker optimalt.

Det er faktisk muligt at indsætte 2 "@" og diverse ugyldige tegn, det irretere mig at jeg ikke forstår hvad "^.+@.+\\..+$" betyder, ellers er rasten af koden lige til at forstå.

Nu er det også lidt ligegyldigt at tjekke mailen, siden ligemeget hvor mange tjek man laver vil man altid kunne indtaste en falsk mail, det er nu mere for at undgå tastefejl jeg ville bruge det.

Desvære er koden som tjekker mailen ikke dækkende nok, det er fx muligt at indtaste 2 "@" og nogle andre ugyldige tegn.








User
Bruger #6953 @ 12.11.06 18:02
Tilføjelse, koden her skulle forhindre de fleste tastefejl
Fold kodeboks ind/udKode 
User
Bruger #6953 @ 13.11.06 00:05
Ok glæm alt hvad jeg postede, kan desvære ikke slette det igen.

Skal e-post adresser tjekkes via script er det en god ide at overholde RFC standard, så man ikke kommer til at blokere for gyldige adresser som måske er i brug.

Men det bliver alt for besværligt, og af flere grunde ville jeg ikke selv gøre det. Så bare det at tjekke efter "@" og "." må være godt nok.









User
Bruger #10980 @ 09.12.06 23:59
Hej jeg er lidt ny inde for det med at kode php, og så ville jeg lige høre om der var nogen der kunne lave nogen lunde samme artikel bare hvor i giver nogen kode eksempler. jeg ville nemlig gerne lave sådan en måde at få e-mail på inde på min hjemmeside, men da der ikke er nogen ordenlige kode eks. kan jeg ikke finde ud af hva men skal gøre helt præcist. jeg har prøvet en del og har da også kommet frem til et eller andet, men jeg bliver simpelhent nød til at have lidt kode eksempler at arbejde med.

vis der er nogen der kan gøre det, så skriv en mail herinde på udviklern.dk og så ville jeg blive glad.
User
Bruger #10980 @ 10.12.06 00:02
Hej jeg er lidt ny inde for det med at kode php, og så ville jeg lige høre om der var nogen der kunne lave nogen lunde samme artikel, bare hvor i giver nogen kode eksempler. jeg ville nemlig gerne lave sådan en måde at få e-mail på inde på min hjemmeside, men da der ikke er nogen ordenlige kode eks. kan jeg ikke finde ud af hva men skal gøre helt præcist. jeg har prøvet en del og har da også kommet frem til et eller andet, men jeg bliver simpelhent nød til at have lidt kode eksempler at arbejde med.

Vis der er nogen der kan gøre det, så skriv en mail herinde på udviklern.dk og så ville jeg blive glad.

Mvh.
Jacob
User
Bruger #10980 @ 22.12.06 23:37
Undskyld jeg skrev det jeg skrev.

Da jeg er ny herinde på udvikleren.dk vidste jeg ikke at man bare skulle trykke der hvor der ståt kode for at få koden frem.

Mvh.
Jacob
User
Bruger #11056 @ 28.12.06 01:18
:S
jeg kan ikke få det til at virke. Har puttet det hele ind på serveren (min webhost er frac.dk, som efter sigende understøtter php)... kan nogen fortælle mig hvad jeg har gjort galt? har skrevet min emailadresse i "send.php" :S
på forhånd tak
User
Bruger #11195 @ 20.01.07 13:13
Artiklen var vildt god. Jeg er først lige selv begyndt at lære PHP, og denne artikel var dejlig nem at forstå, og koden var også meget simpel. Men jeg prøvede den, og alt så ud til at virke. Men problemet er bare at jeg ikke modtager en email? http://dodk.hotserv.dk/fight.php > der er den. Kan ikke se hvad jeg har gjort galt? Det eneste jeg har ændret i er CSS og det med location, har jeg ændret til index.php. Kan I hjælpe mig?

- Killera.
User
Bruger #11195 @ 24.01.07 20:49
Hov.. lige meget nu. Har fået det til at virke. Det var fordi de havde slået mailafsendelse fra hos Hotserv. Har fået købt et rigtigt domæne nu, og har udbygget din kode rigtigt meget. Det er en SÅ fed kode, den var nem at starte ud med, og jeg lærte en HEL masse. Hold kæft, det er fedt med sådan en artikel - du forklarer den også super. Thumbs up for en RIGTIG fed start du gav mig som PHP koder. (:

- Killera
User
Bruger #10834 @ 25.01.07 18:04
Vildt nice artikel :) har lige lavet den og tilføjet noget nyt til den osv...

her er et eks. http://dipiniti.dk/kontakt.htm
User
Bruger #8985 @ 31.01.07 23:26
Jeg må indrømme jeg ikke synes koden i artiklen er så hensigtsmæssig, så her har I mit bud:

Fold kodeboks ind/udKode 


Med meget få forklaringer, men det er jo heller ikke en artikel ;) Den burde virke, selvom PHP tit har problemer i forbindelse med hotmail. I værste fald ryger mailen i junk.
User
Bruger #8985 @ 31.01.07 23:37
^.+@.+\\..+$

Betyder den skal starte med et eller flere tegn, så kommer der et @, så kommer der mindst ét tilfældigt tegn, derefter et punktum, så mindst ét tilfældigt tegn til slut.

^ = Skal starte med
.+ = Et eller flere tilfældige tegn
@ = Så et snabel-A
.+ = Et eller flere tilfældige tegn
\\. = Punktum
.+ = Et eller flere tilfældige tegn
$ = Slut

For at undgå det med flere snabel-a'er, kunne man skrive

^.+@{1}.+\\..+$
User
Bruger #4479 @ 24.02.07 13:10
Inden man beynder for meget på regex skal man være opmærksom på at o'brien@irland.ie er gyldig:)
User
Bruger #11544 @ 19.03.07 10:43
Nogen der lige kan hjælpe.

Når mailen er sendt kommer der en næsten tom side med beskeden "Mailen blev sendt uden problemer"

kan man ændre det , så den går hen på en side - f.eks tak.html

mvh stef

User
Bruger #11544 @ 19.03.07 10:47
Nogen der lige kan hjælpe.

Når mailen er sendt kommer der en næsten tom side med beskeden "Mailen blev sendt uden problemer"

kan man ændre det , så den går hen på en side - f.eks tak.html

mvh stef

User
Bruger #8985 @ 15.06.07 22:19
Fold kodeboks ind/udKode 

Sæt den før al andet output.
User
Bruger #11195 @ 03.08.07 14:24
Jeg takker Thomas mange gange for "guiden" om hvad "^.+@.+\\..+$" m.m betyder. :) Meget nyttig.. tak, tak!
User
Bruger #11301 @ 13.12.07 19:45
Rigtig flot artikel. Den virker bare uden problemer, og skulle gerne kunne forstås af nybegyndere.
User
Bruger #2233 @ 30.12.07 12:22
Hej
God velskrevet artikel men:
Jeg har lavet alt efter vejledningen. Formularsiden vises pænt men når jeg har udfyldt felterne og prøver at sende så får jeg bare standdard-fejl svaret "Der opstod en fejl. Prøv igen." og kan så klikke tilbage til formularsiden. Mailen bliver altså ikke sendt. Hvad kan det skyldes? PHP virker ellers tilsyneladende ok på serveren som har kørt fint i lang tid. (apache 1.3.27)
Siden er på http://www.nimmersoft.dk/formmailtest.htm

Mange hilsener Joergen
User
Bruger #2233 @ 30.12.07 12:24
Hej
God velskrevet artikel men:
Jeg har lavet alt efter vejledningen. Formularsiden vises pænt men når jeg har udfyldt felterne og prøver at sende så får jeg bare standard-fejl svaret "Der opstod en fejl. Prøv igen." og kan så klikke tilbage til formularsiden. Mailen bliver altså ikke sendt. Hvad kan det skyldes? PHP virker ellers tilsyneladende ok på serveren som har kørt fint i lang tid. (apache 1.3.27)
Siden er på http://www.nimmersoft.dk/formmailtest.htm

Mange hilsener Joergen
User
Bruger #2233 @ 30.12.07 13:23
Hej igen og Undskyld jeg roder
Jeg fandt ud af hvad jeg manglede - SMTP angivelsen i PHP.INI !!

Godt Nytår til alle
NimmerSoft
User
Bruger #12242 @ 02.06.08 21:59
()()
(--)
(")(")

Ordbog:
Kanin betyder Thubs up!

hmm
Den var da til at forstå.
MEN
Du har ikke været så god til at forklare HVORDAN den sender mailen (Vilken del af koden, hvordan fungerer det osv.).
User
Bruger #13920 @ 24.06.08 17:03
Øhh.. Jeg ved ikke om hvor mange der begynder at grine af mig når jeg spørger sådan her: Hvor skal PHP koden sættes ind hende? Er det i et dokument for sig selv eller i samme som input felterne står i?

Dette er det første gang jeg forsøger at bruge PHP.. Og som i kan høre går det ikke helt optimalt. Håber i vil hjælpe mig :)
User
Bruger #13920 @ 24.06.08 18:17
Glem sidste indlæg har fundet ud af det :)

Nu er der blot opstået et nyt problem. Når jeg gemmer min PHP fil med navnet: send.php Så når jeg udfylder formen og trykker Send så giver åbner den en "Filoverførsel" med send.php (Det skal nok også lige siges at jeg gør det offline altså hvor jeg bare åbner dokumentet i en browser.)

Kan det have noget at gøre med at jeg er ikke gør det online?
User
Bruger #4487 @ 08.05.10 18:03
Hej med hensyn til at få vist fejlmeddelelser på kontakt siden, kan man erstatte de sidste fejlmeddelelser med denne kode i sin "formulartjekker".

Fold kodeboks ind/udPHP kode 

Du skal så på den side hvor din kontakt formular er indsætte denne kode (bemærk din kontaktformular side skal være med endelsen .php)
Fold kodeboks ind/udPHP kode 


Koden skal indsættes der hvor du vil have vist din fejlbeskeder
User
Bruger #4487 @ 08.05.10 18:06
Glemte at tilføje at du selvfølgelig skal slette der hvor der står http://www.dev-world.dk/kontakt/, da dette er den jeg brugte på min hjemmeside.

index.php kan være noget andet, f.eks. kontakt.php - Det vigtige er at
?kontaktbesked=".$kontaktfejl
og
?kontaktbesked=".$kontaktdone
står der, da det er det som laver beskeden.

God Fornøjelse
Du skal være logget ind for at skrive en kommentar.
t