några sidor på nätet om PHP programmering

Sök efter  
Börja här Uppgifter Testa dig själv Tips Sidokarta mm. Länkar Sök

2.2 På allmän begäran - vi sänder elpost

[ 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?)

 

Skapa en html sida för formen

.. 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 "".

<html>
<
head>
  <
title>S&auml;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>
Listning 2.2.1 - samples/ep1.php
[Visa i separat fönster]

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.)

 

Lägg till lite PHP-kod

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&auml;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>
Listning 2.2.2 - samples/ep2.php
[Visa i separat fönster]

Studera:
$_GET, $_POST, $_REQUEST samt isset
läs om styrsatserna if mm.

 

Vi börjar fundera på felhantering

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&auml;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>
Listning 2.2.3 - samples/ep3.php
[Visa i separat fönster]

Vi lägger in felhanteringen

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&auml;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>
Listning 2.2.4 - samples/ep4.php
[Visa i separat fönster]

Fixa några små estetiska buggar

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&auml;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>
Listning 2.2.5 - samples/ep5.php
[Visa i separat fönster]

Studera:
@ - tecknets användning

Prova:
Vad händer om du tar bort ett av @ - tecknen i ovanstående kod

 

Snart kan vi sända elposten

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&auml;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>
Listning 2.2.6 - samples/ep6.php
[Visa i separat fönster]

Om allt verkar fungera så...

...ä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&auml;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>
Listning 2.2.7 - samples/ep7.php
[Visa i separat fönster]

Studera:
sök efter mail på www.php.net (går att göra med sökboxen på början av sidan)

 

Vad mera?

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):

  1. Kontrollera om det finns ett @ tecken samt minst en punkt (.) i adressen. Punkten måste komma efter @
    Se strings_van.php#strpos för beskrivning av strpos som kan söka efter enskilda tecken i en sträng

  2. Söka med regexp som är mer effektiv (men kanske inte lättare). Se strings_reg.php (eller sök på nätet efter php mail preg_match eller php mail ereg för ännu mera info)

  3. Gå ut på nätet och fråga av en mailserver om det finns en sådan användare. Om vi har angett anders@firma.com så skall vi således fråga firma.com vad deras mailserver heter för att sedan fråga av denna om det finns en användare med namnet anders. Detta går att göra med php! Se mail_check.php för mer information, och läs kommentarerna i koden - där finns instruktioner hur du kan göra.

Vilken av dessa är bäst? Enklast? Bryr vi oss?

Du borde nu kunna...

  1. Skapa formar i html
  2. Hantera adressradens parametrar (url parametrar)
  3. Allmän validering av formar med PHP
  4. if satser och and
  5. mail funktionen i php

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?

 

   UppgifterUppgift 1.5