[ Utskriftsversion av denna uppgift ]
Att sända mail är mycket enkelt med PHP. Vi behöver bara en form + lite kod ;-)
Problemet är (som vanligt) att vi även måste fundera på felhantering och validering - och då blir det mer kod. Det är inget omöjligt problem, vi måste bara vara lite metodiska och bygga ut programmet steg för steg.
Nedan är ett antal steg som till slut leder fram till en mailform. Jag har inte kommenterat allför mycket om koden, utan du antas studera på egen hand så att du lär dig förstå koden. Alla funktioner mm. finns beskrivna på denna sajt... Om du bara söker fram det sista exemplet, tar Copy/Paste och sedan går på kaffe så har du sumpat chansen att lära dig någonting (Och det var väl därför denna kurs kom till? Eller?)
.. och se till att den spara filen som mail.php
Observera namnen på de olika delarna i formen: from, subject, text och send. PHP klarar av åäö, men sänd i alla fall aldrig dessa tecken via adressraden. Du får senare snygga till den i din favoriteditor, men låt den för tillfället vara rätt "rå".
<html>
<head>
<title>Sänd elpost</title>
<style>
body { font-family: verdana, arial, sans-serif; }
</style>
</head>
<body bgcolor="#FFFFEE">
<form>
Elpost:<br>
<input
type="text"
size="40"
name="from" >
<br>
Ärende:<br>
<input
type="text"
size="50"
name="subject" >
<br>
Text:<br>
<textarea
name="text"
cols="40"
rows="8" ></textarea>
<br>
<input
type="submit"
name="send"
value="Sänd elpost">
<br>
</form>
</body>
</html>
Prova koden - skriv in A, B och C i de olika textboxarna - och lägg märke till att det sätts mail.php?from=A&subject=B&text=C&send=S%E4nd+elpost i browserns adressrad när vi klickar på knappen.
(OBS! Mina filer kommer att ha avvikande namn, men ni skall arbeta vidare med er mail.php hela tiden)
Studera:
Formars konstruktion, html
Prova:
Det finns mer attribut man kan sätta på formars textboxar
- testa dessa (men låt layouten vara som den är för
tillfället.)
För att komma vidare måste vi "fånga upp" de parametrar som sänds via adressraden när vi klickar på knappen. Se nedanstående kod (fetstil är nytt från föregående kod)
<?php
# skapa en variabel för eventuella meddelanden
$meddelande = "";
# kontrollera om det fanns 'send=' i adressraden
# om det fanns kommer isset ( $_REQUEST[ "send" ] )
# att bli sann
# $_REQUEST[ "form_komponents_namn" ] används för att få de
# värden som kommer via adressraden eller via en s.k. POST
if ( isset ( $_REQUEST[ "send" ] ) )
{
# visa att vi kommit hit genom att ändra meddelandet
$meddelande = "DU TRYCKTE NU PÅ KNAPPEN";
}
?>
<html>
<head>
<title>Sänd elpost</title>
<style>
body { font-family: verdana, arial, sans-serif; }
</style>
</head>
<body bgcolor="#FFFFEE">
<?php
# skriv ut meddelandet - det gör inget om det råkar vara tomt
echo $meddelande;
?>
<form>
Elpost:<br>
<input
type="text"
size="40"
name="from" >
<br>
Ärende:<br>
<input
type="text"
size="50"
name="subject" >
<br>
Text:<br>
<textarea
name="text"
cols="40"
rows="8" ></textarea>
<br>
<input
type="submit"
name="send"
value="Sänd elpost">
<br>
</form>
</body>
</html>
Studera:
$_GET, $_POST, $_REQUEST
samt isset
läs om styrsatserna if mm.
När vi testar märker vi att vi även kan klicka på knappen utan att skriva in någonting i de olika textboxarna. Detta måste ju fixas, det är ingen vits att sända tomma mail, men först funderar vi lite på hur man kan meddela felen. Detta kan göras genom att vi skapar ett antal variabler som, för tillfället, är tomma och skriver ut dem på lämpliga ställen i formen. Se nedanstående exempel (fetstil är nytt från föregående kod)
<?php
# skapa en antal variabler för eventuella fel
$fel_from = "";
$fel_subject = "";
$fel_text = "";
# skapa en variabel för eventuella meddelanden
$meddelande = "";
# kontrollera om det fanns 'send=' i adressraden
# om det fanns kommer isset ( $_REQUEST[ "send" ] )
# att bli sann
# $_REQUEST[ "form_komponents_namn" ] används för att få de
# värden som kommer via adressraden eller via en s.k. POST
if ( isset ( $_REQUEST[ "send" ] ) )
{
# visa att vi kommit hit genom att ändra meddelandet
$meddelande = "DU TRYCKTE NU PÅ KNAPPEN";
}
?>
<html>
<head>
<title>Sänd elpost</title>
<style>
body { font-family: verdana, arial, sans-serif; }
</style>
</head>
<body bgcolor="#FFFFEE">
<?php
# skriv ut meddelandet - det gör inget om det råkar vara tomt
echo $meddelande;
?>
<form>
Elpost:<?php echo $fel_from; ?><br>
<input
type="text"
size="40"
name="from" >
<br>
Ärende:<?php echo $fel_subject; ?><br>
<input
type="text"
size="50"
name="subject" >
<br>
Text:<?php echo $fel_text; ?><br>
<textarea
name="text"
cols="40"
rows="8" ></textarea>
<br>
<input
type="submit"
name="send"
value="Sänd elpost">
<br>
</form>
</body>
</html>
Eftersom vi har "färdigt preparerade" meddelanden kan vi sätta dessa variabler vid behov. Kontollera hur de olika felmeddelandena kommer om vi lämnar tomt i en eller flera textboxar.
<?php
# skapa en antal variabler för eventuella fel
$fel_from = "";
$fel_subject = "";
$fel_text = "";
# skapa en variabel för eventuella meddelanden
$meddelande = "";
# kontrollera om det fanns 'send=' i adressraden
# om det fanns kommer isset ( $_REQUEST[ "send" ] )
# att bli sann
# $_REQUEST[ "form_komponents_namn" ] används för att få de
# värden som kommer via adressraden eller via en s.k. POST
if ( isset ( $_REQUEST[ "send" ] ) )
{
# visa att vi kommit hit genom att ändra meddelandet
$meddelande = "DU TRYCKTE NU PÅ KNAPPEN";
# vi kontrollerar att det faktiskt finns någonting skrivet
# i de olika textboxarna och sätter de olika felmeddelandena
# om det är tomt
# vi hade ju prepareat utskriften av felmeddelandena
# i föregående steg
if ( $_REQUEST[ "from" ] == "" )
{
$fel_from = "<b> Du måste ange din elpost</b>";
}
if ( $_REQUEST[ "subject" ] == "" )
{
$fel_subject = "<b> Du måste ange ärende</b>";
}
if ( $_REQUEST[ "text" ] == "" )
{
$fel_text = "<b> Du måste nog skriva någonting</b>";
}
}
?>
<html>
<head>
<title>Sänd elpost</title>
<style>
body { font-family: verdana, arial, sans-serif; }
</style>
</head>
<body bgcolor="#FFFFEE">
<?php echo $meddelande; ?>
<form>
Elpost:<?php echo $fel_from; ?><br>
<input
type="text"
size="40"
name="from" >
<br>
Ärende:<?php echo $fel_subject; ?><br>
<input
type="text"
size="50"
name="subject" >
<br>
Text:<?php echo $fel_text; ?><br>
<textarea
name="text"
cols="40"
rows="8" ></textarea>
<br>
<input
type="submit"
name="send"
value="Sänd elpost">
<br>
</form>
</body>
</html>
Lade ni märke till att om vi skrev något i textboxarna så blev dessa tömda när vi klickade på knappen? (Lade du inte märke till detta testade du nog lite väl slarvigt - shame on you) Detta är ju inte så kul - det vi skrivit borde ju hållas kvar. Vi behöver återigen modifiera koden lite. Prova följande kod genom att skriva in i vissa textboxar och klicka sedan på knappen.
<?php
# skapa en antal variabler för eventuella fel
$fel_from = "";
$fel_subject = "";
$fel_text = "";
# skapa en variabel för eventuella meddelanden
$meddelande = "";
# kontrollera om det fanns 'send=' i adressraden
# om det fanns kommer isset ( $_REQUEST[ "send" ] )
# att bli sann
# $_REQUEST[ "form_komponents_namn" ] används för att få de
# värden som kommer via adressraden eller via en s.k. POST
if ( isset ( $_REQUEST[ "send" ] ) )
{
# visa att vi kommit hit genom att ändra meddelandet
$meddelande = "DU TRYCKTE NU PÅ KNAPPEN";
# vi kontrollerar att det faktiskt finns någonting skrivet
# i de olika textboxarna och sätter de olika felmeddelandena
# om det är tomt
# vi hade ju prepareat utskriften av felmeddelandena
# i föregående steg
if ( $_REQUEST[ "from" ] == "" )
{
$fel_from = "<b> Du måste ange din elpost</b>";
}
if ( $_REQUEST[ "subject" ] == "" )
{
$fel_subject = "<b> Du måste ange ärende</b>";
}
if ( $_REQUEST[ "text" ] == "" )
{
$fel_text = "<b> Du måste nog skriva någonting</b>";
}
}
?>
<html>
<head>
<title>Sänd elpost</title>
<style>
body { font-family: verdana, arial, sans-serif; }
</style>
</head>
<body bgcolor="#FFFFEE">
<?php echo $meddelande; ?>
<form>
Elpost:<?php echo $fel_from; ?><br>
<input
type="text"
size="40"
name="from"
value="<?php echo @$_REQUEST[ "from" ] ?>" >
<br>
Ärende:<?php echo $fel_subject; ?><br>
<input
type="text"
size="50"
name="subject"
value="<?php echo @$_REQUEST[ "subject" ] ?>" >
<br>
Text:<?php echo $fel_text; ?><br>
<textarea
name="text"
cols="40"
rows="8" ><?php echo @$_REQUEST[ "text" ] ?></textarea>
<br>
<input
type="submit"
name="send"
value="Sänd elpost">
<br>
</form>
</body>
</html>
Studera:
@ - tecknets användning
Prova:
Vad händer om du tar bort ett av @ - tecknen i ovanstående
kod
Vi har felhanteringen något så när under kontroll och kan snart börja fundera på att sända posten. Vi behöver bara hitta den rätta platsen för detta i koden. Vi testar nedanstående för att se att meddelandet "ALLT VERKAR OK" kommer när alla textboxar är ifyllda.
<?php
# skapa en antal variabler för eventuella fel
$fel_from = "";
$fel_subject = "";
$fel_text = "";
# skapa en variabel för eventuella meddelanden
$meddelande = "";
# kontrollera om det fanns 'send=' i adressraden
# om det fanns kommer isset ( $_REQUEST[ "send" ] )
# att bli sann
# $_REQUEST[ "form_komponents_namn" ] används för att få de
# värden som kommer via adressraden eller via en s.k. POST
if ( isset ( $_REQUEST[ "send" ] ) )
{
# visa att vi kommit hit genom att ändra meddelandet
$meddelande = "DU TRYCKTE NU PÅ KNAPPEN";
# vi kontrollerar att det faktiskt finns någonting skrivet
# i de olika textboxarna och sätter de olika felmeddelandena
# om det är tomt
# vi hade ju prepareat utskriften av felmeddelandena
# i föregående steg
if ( $_REQUEST[ "from" ] == "" )
{
$fel_from = "<b> Du måste ange din elpost</b>";
}
if ( $_REQUEST[ "subject" ] == "" )
{
$fel_subject = "<b> Du måste ange ärende</b>";
}
if ( $_REQUEST[ "text" ] == "" )
{
$fel_text = "<b> Du måste nog skriva någonting</b>";
}
# en enkel koll kan ske genom att konrtollera om något
# av felmeddelande blivit satta ovan
# är alla variabler tomma så sattes inga felmeddelanden
if ( $fel_from == "" and
$fel_subject == "" and
$fel_text == "" )
{
# för tillfället visar vi bara ett meddelande
$meddelande = "ALLT VERKAR OK";
}
}
?>
<html>
<head>
<title>Sänd elpost</title>
<style>
body { font-family: verdana, arial, sans-serif; }
</style>
</head>
<body bgcolor="#FFFFEE">
<?php echo $meddelande; ?>
<form>
Elpost:<?php echo $fel_from; ?><br>
<input
type="text"
size="40"
name="from"
value="<?php echo @$_REQUEST[ "from" ] ?>" >
<br>
Ärende:<?php echo $fel_subject; ?><br>
<input
type="text"
size="50"
name="subject"
value="<?php echo @$_REQUEST[ "subject" ] ?>" >
<br>
Text:<?php echo $fel_text; ?><br>
<textarea
name="text"
cols="40"
rows="8" ><?php echo @$_REQUEST[ "text" ] ?></textarea>
<br>
<input
type="submit"
name="send"
value="Sänd elpost">
<br>
</form>
</body>
</html>
...är det väl bara att kasta iväg elposten. Se nedanstående kod.
<?php
# skapa en antal variabler för eventuella fel
$fel_from = "";
$fel_subject = "";
$fel_text = "";
# skapa en variabel för eventuella meddelanden
$meddelande = "";
# kontrollera om det fanns 'send=' i adressraden
# om det fanns kommer isset ( $_REQUEST[ "send" ] )
# att bli sann
# $_REQUEST[ "form_komponents_namn" ] används för att få de
# värden som kommer via adressraden eller via en s.k. POST
if ( isset ( $_REQUEST[ "send" ] ) )
{
# visa att vi kommit hit genom att ändra meddelandet
$meddelande = "DU TRYCKTE NU PÅ KNAPPEN";
# vi kontrollerar att det faktiskt finns någonting skrivet
# i de olika textboxarna och sätter de olika felmeddelandena
# om det är tomt
# vi hade ju prepareat utskriften av felmeddelandena
# i föregående steg
if ( $_REQUEST[ "from" ] == "" )
{
$fel_from = "<b> Du måste ange din elpost</b>";
}
if ( $_REQUEST[ "subject" ] == "" )
{
$fel_subject = "<b> Du måste ange ärende</b>";
}
if ( $_REQUEST[ "text" ] == "" )
{
$fel_text = "<b> Du måste nog skriva någonting</b>";
}
# en enkel koll kan ske genom att kontollera om något
# av felmeddelande blivit satta ovan
if ( $fel_from == "" and
$fel_subject == "" and
$fel_text == "" )
{
# för tillfället visar vi bara ett meddelande
$meddelande = "ALLT VERKAR OK";
# har ni problem med att sända tar ni bort # tecknet
# som kommer före ini_alter och ser till att det är en
# korrekt mailserver som anges
# ini_alter("SMTP", "mail.puv.fi");
# OBS! ändra följande rad till din elpostadress
$to = "den_elpost_adress@som_det_skall_sändas.till";
# från måste sättas in lite indirekt
$header = "From: " . $_REQUEST[ "from" ] . "\r\n";
# jag vill inte ha mailboxen full av testmail
# så jag avbryter programmet med nedanstående return
# ni får bara lita på att det fungerar
# tag bort ordet return i ER kod
return;
# sänder mailet
if ( mail ( $to,
$_REQUEST[ "subject" ],
$_REQUEST[ "text" ],
$header ) )
{
$meddelande = "Mail sändes";
}
else
{
$meddelande = "Mail sändes <b>INTE</b>";
}
}
}
?>
<html>
<head>
<title>Sänd elpost</title>
<style>
body { font-family: verdana, arial, sans-serif; }
</style>
</head>
<body bgcolor="#FFFFEE">
<?php echo $meddelande; ?>
<form>
Elpost:<?php echo $fel_from; ?><br>
<input
type="text"
size="40"
name="from"
value="<?php echo @$_REQUEST[ "from" ] ?>" >
<br>
Ärende:<?php echo $fel_subject; ?><br>
<input
type="text"
size="50"
name="subject"
value="<?php echo @$_REQUEST[ "subject" ] ?>" >
<br>
Text:<?php echo $fel_text; ?><br>
<textarea
name="text"
cols="40"
rows="8" ><?php echo @$_REQUEST[ "text" ] ?></textarea>
<br>
<input
type="submit"
name="send"
value="Sänd elpost">
<br>
</form>
</body>
</html>
Studera:
sök efter mail på www.php.net (går att göra
med sökboxen på början av sidan)
Tja... Vet vi nu att det är en giltig elpostadress som angetts? Det finns tre olika sätt att kontrollera elpostadressen (kom ihåg att $_REQUEST[ "from" ] antas en elpostadress):
Vilken av dessa är bäst? Enklast? Bryr vi oss?
Dessutom vill jag påpeka att koden vi skrivit är skriven så att det finns så lite php inne i html koden som möjligt, och att det mesta sker i ett större php-block i börkan av programmet.
Jag har dock lämnat kvar några små buggar/problem i koden. Kommer du på dem?
© anders enges, 2003