Les 9
In deze les gaat u leren hoe u kunt mailen door middel van PHP en een
simpel formulier.
Weg met mailto, leve PHP
Met PHP is het perfect mogelijk om de inhoud van een formulier
te versturen via email. Het bericht wordt verstuurd in samenhang met
sendmail of een variant ervan op een unix server. We zullen in de
eerste plaats leren hoe het versturen van email in elkaar steekt.
Daarna zullen we zoals op professionele sites, formulieren gaan
exploiteren. We gaan een mini-mailer in elkaar knutselen alsook
een maxi-mailer met alle toeters en bellen.
Wil je nu een email versturen vanuit een script in PHP ? Niets is
eenvoudiger. We gebruiken daarvoor de functie mail()! De basissyntax
ziet er als volgt uit :
mail("begunstigde", "onderwerp",
"bericht", "From: verzender")
Je kunt die waarden rechtstreeks in het script aanbrengen. Het nadeel
hiervan is, dat je telkens het script moet aanpassen als de begunstigde
iemand anders is. Dus zullen we, wat had je gedacht, variabelen
gebruiken.
Als de verzending correct verloopt, geeft de functie mail() de waarde
true terug, indien niet, de waarde false.
We gaan nu dadelijk deze kennis toetsen aan een voorbeeld. In het geval
dat de mail correct werd verzonden krijgt de bezoeker de melding,
Bedankt ! Je mail werd verstuurd. In het geval het versturen niet
lukte, krijg je de bijpassende foutmelding.
BELANGRIJK !
Ofwel heb je lokaal een goed geconfigureerde mailserver draaien,
of je wenst gebruik te maken van de mailserver van je provider. Zelf
een mailserver draaien en configureren is niet van de poes voor de
gewone computer gebruiker. Daarom dat we gaan gebruik maken van onze
smtp server van onze provider om mails te versturen.
Klik op het wampserver icoontje en in Config files kies je voor
php.ini. Kladbok gaat zich nu openen en je zoekt naar :
[mail function]
; For Win32 only.
SMTP = localhost
Plaats nu een ; voor de regel SMTP = localhost. We gaan nu de
variabele SMTP de waarde geven van onze smtp server van onze provider.
Dat zijn gegevens die jouw verstrekt zijn door je provider. Voor mijn
provider is dat smtp.scarlet.be. Onder de regel ;SMTP = localhost
plaatsen we nu een nieuwe met de smtp server van onze provider :
SMTP = smtp.scarlet.be
Als je dit dan aangepast hebt, sla de file op en klik terug op het
wampserver icoontje en kies voor Restart all Services.
Waarom gaan we niet eenvoudig de SMTP variabele dadelijk zo aanpassen
in onze php.ini file ?
Wel om de eenvoudige redenen dat we steeds de originele file inhoud
willen behouden. Door een ; voor SMTP = localhost te plaatsen, hebben
we deze regel in commentaar geplaatst ( het nut van commentaar ).
Eronder brengen we dan onze wijziging aan. Mocht er iets verkeerds
gaan, heb je steeds de originele file en kan je hetgeen jij veranderd
hebt gewoon terug verwijderen, en de file in zijn originele staat
terugbrengen.
In onze editor gaan we nu volgende code opnemen :
<?php
$mail=$_POST["mail"];
$message=$_POST["message"];
$submit=$_POST["submit"];
if (isset($submit) && $mail !=
"" && $message != "") {
if(mail("$mail", "You've got mail !", "$message", "From:
webmaster@essetee.be")) {
echo "<p>Er werd een e-mail bericht verstuurd naar Essetee</p>";
}
else {
echo "<p>Sorry, uw bericht kon niet worden verzonden !</p>";
}
}
else {
?>
<div
align="center"><h1>Mini-Mailer</h1></div><hr>
Stuur een mailtje naar Essetee
!<br><br>
<form action="<?php echo
$_SERVER['PHP_SELF'];?>" method="POST">
Uw email adres ? <input type="text"
name="mail"><br><br>
Tik hier de tekst die je wilt
ontvangen.<br><br>
<textarea name="message" cols="50"
rows="5" wrap="soft">
</textarea><br>
<input type="submit" name="submit"
value="Bericht Versturen"><br>
</form>
<?php
}
?>
Sla deze vervolgens op als minimailer.php.
Je kan nu het script runnen om een mailtje naar Essetee te sturen.
En aktie !
De mailtjes die jullie versturen komen in mijn mailbox terecht ! Als je niets zinvols te zeggen hebt, stuur dan ook geen email ! Aan mailtjes met een inhoud als test, dfdfdg, fsdts enz ... daar ben ik niets mee !
Uitleg van het script. In regel 2 tot en met 4 recupereren wij de
variabelen mail, message en submit van ons formulier. In regel 5 kijken
we met isset($submit) of er iemand op de submit knop heeft geklikt.
Indien dit het geval is, en de variabele $mail en de variabele $message
is niet ledig, dan gaan we over tot het versturen van de mail. Indien
aan één van die voorwaarden niet voldaan wordt ( als je
het script opstart bijvoorbeeld ) dan wordt de code uitgevoerd in de
else statement op vanaf regel 13.
In regel 6 dan versturen we de eigenlijke mail. Als je nu een slecht
geconfigureerde mailserver hebt, of je hebt geen goede smtp server
ingesteld in je php.ini, gaat je mail niet verzonden kunnen worden.
Indien dit het geval is, gaat de functie if(mail()) de waarde
false terug geven en zal de else statement op regel 9 worden uitgevoerd.
De maxi-mailer
Je bent het waarschijnlijk ook al eens tegengekomen. Je
verstuurde een mail en je had daar iets verkeerds ingezet. Wat
zou je ervan denken om vooraleer de mail te versturen, je de gebruiker
nog eens de kans geeft om alles na te lezen voordat de mail
daadwerkelijk wordt verstuurd ? Als de gebruiker een veld vergeet in te
vullen moeten we hem daar attent op maken. Wat als er nu twee
gebruikers terzelfdertijd een mail willen verzenden ? Onze maxi-mailer
zal hier uitweg bieden.
In onze editor brengen we volgende code in :
<?php
if (isset($_POST["mail"]) &&
$_POST["mail"] != "") {
$message = $_POST['message'];
$mail = $_POST['mail'];
if(mail("serge@essetee.be", "You've got mail !", "$message", "From:
$mail")) {
echo "<p>Bedankt voor jouw mail, jouw bericht werd
verstuurd</p>";
}
else {
echo
"<p>Sorry, uw bericht kon niet worden verzonden !</p>";
}
}
?>
Die we opslaan als mail.php. Deze code gaat er dan voor zorgen dat onze
mail daadwerkelijk wordt verstuurd.
Vervolgens maken we een nieuw document aan met volgende inhoud :
<?php
$submit=$_POST["submit"];
$voornaam=$_POST["voornaam"];
$familienaam=$_POST["familienaam"];
$mail=$_POST["mail"];
$opinie=$_POST["opinie"];
echo "<h1> Een opinie formulier
opmaken </h1><hr>";
if (empty($submit))
{
// is de submit
button gelijk aan 0 of niet gedefinieerd ?
echo "<h3>1. Gelieve Uw gegevens
in te vullen</h3>";
echo "<form
action=\"$_SERVER[PHP_SELF]\" method=\"post\">";
echo "Uw Voornaam : <input
type=\"text\" name=\"voornaam\"><br><br>";
echo "Uw Familienaam : <input
type=\"text\" name=\"familienaam\"><br><br>";
echo "Email adres : <input
type=\"text\" name=\"mail\"><br><br>";
echo "<h3>Wat vindt jij van deze
cursus PHP ?</h3><br><br>";
echo "<textarea name=\"opinie\"
cols=\"50\" rows=\"5\" wrap=\"soft\">";
echo
"</textarea><br><br>";
echo "<input type=\"reset\"
name=\"reset\" value=\"Alles wissen\">";
echo "<!-- belangrijk, noem de
verzendknop submit ! -->";
echo "<input type=\"submit\"
name=\"submit\" value=\"OK - Verzenden !\">";
echo "</form>";
}
else {
//als submit is gedefinieerd
echo "<h3> 2. Gelieve de
gegevens na te zien</h3><br>";
foreach($_POST as $key => $value) {
// hier lopen we alle velden van het
formulier na
if (empty($value)) {
// is er een veld ledig, nul of niet
gedefinieerd ?
echo "<p> Gelieve alle velden in
te vullen a.u.b. !</p><br>";
echo "<form>";
echo "<input type=\"button\"
value=\"Terug naar vorige pagina\"
onclick=\"javascript:history.back()\">";
echo "</form>";
echo "<!-- Voor hen die geen
javascript hebben : -->";
echo "<noscript>Klik op de
vorige knop in je browser om terug te keren naar de vorige
pagina.</noscript>";
exit; // verlaat de lus alsook het
programma !
}
}
echo "<p>Dag
<strong>$voornaam $familienaam !</strong><br>\n";
echo "<p>Uw email adres is
<strong>$mail</strong>!</p>\n";
echo "<p> Jij schreef
:</p>\n";
echo "<i>" .
stripslashes(nl2br($opinie)) . "</i><br><br>\n";
echo "<p>Zijn de gegevens
correct ?</p><br>\n";
$message="$voornaam $familienaam,$mail
heeft geschreven\n$opinie";
$message=htmlspecialchars($message);
echo "<form action=\"mail.php\"
method=\"post\">\n";
echo "<input type=\"hidden\"
name=\"mail\" value=\"$mail\">\n";
echo "<input type=\"hidden\"
name=\"message\" value=\"$message\">\n";
echo "<input type=\"button\"
value=\"Neen\"";
echo
"onclick=\"javascript:history.back()\">\n";
echo "<noscript>Gebruik de terug
toets in je browser om naar de vorige pagina terug te keren
!</noscript>\n";
echo "<input type=\"submit\"
name=\"mail versturen\" ";
echo "value=\"Alles is
correct\"></form>\n";
}
?>
Die we opslaan als maximailer.php.
Een ganse boterham niet ? Zoals je kunt zien gebruiken we hier een
beetje van alles wat we tot nu toe al hebben geleerd. Alsook een paar
nieuwigheden.
De functie empty()
Variabelen testen met de functie empty(). Empty() is het
tegenovergestelde van isset(). Isset controleert of een variabele is
gedefinieerd, en het is enkel dan dat isset de waarde true terug geeft.
Met empty() daarentegen, kun je nagaan of een variabele niet
gedefinieerd is, de variabele leeg is of overeenkomt met 0 (nul). In
deze gevallen geeft empty() de waarde true door.
Verzoek if en $submit
Het eerste if verzoek in ons script test of er een variabele $submit
niet gedefinëerd is. Dit is inderdaad zo, aangezien $submit pas
aktief wordt na het versturen van het bericht. Je moet er wel voor
zorgen dat de naam van de verzendknop submit is, anders zal dit niet
werken.
Het formulier wordt getoond, de gebruiker kan alles invullen en als de
gebruiker dan op de knop verzenden klikt, dan pas wordt $submit
gedefinïeerd. Na het verzenden wordt de else lus afgewerkt.
Verder zie je ook dat ik regelmatig gebruik maak van javascript. Dit om
ervoor te zorgen dat de gegevens niet verloren gaan als je terug moet
om iets te corrigeren. Voor het geval javascript niet aanstaat bij de
gebruiker, wordt dan vermeld dat hij op de back button van zijn browser
moet klikken om terug te gaan naar de vorige pagina.
Met exit verlaat je de lus alsook het programma. Als er een veld niet
werd ingevuld, moeten we verhinderen dat de lus opnieuw wordt
uitgevoerd alsook moeten we verhinderen dat de javabutton opnieuw wordt
getoond. Daarom gebruiken we exit.
Als alle velden correct werden ingevuld, komt het script terecht op de
plaats waar alle informatie die de gebruiker intikte worden getoond met
het commando echo.De gebruiker kan de gegevens nog veranderen of
aanpassen indien nodig.
We maken dan de variabele $message aan, die alle info van de gebruiker
bevat en als we op de knop alles is correct klikken, worden de gegevens
doorgegeven naar ons mail.php script die dan zorgt voor de verzending
ervan.
Je ziet ook dat ik hier gebruik maak van stripslashes en nl2br zoals in
vorige lessen al werd uiteen gedaan.
De gegevens van het formulier worden door middel van input type=hidden
doorgegeven aan mail.php.
Nu we een mailer hebben op ons systeem, kunnen we verder gaan met de
volgende les. Ik had jullie verwittigd, PHP is niet moeilijk, maar je
moet wel bij de pinken blijven. Voor iemand die niets van programmeren
afwist, kan ik best begrijpen dat het nu wat moeilijker wordt. Als je
echter de vorige lessen goed onder de knie hebt, moet je dit script
goed kunnen volgen.
Nu hebben we een opinieformulier aangemaakt, maar je kunt om het even
welk formulier aanmaken. Je hoeft enkel de gegevens samen te brengen in
de variabele $message en klaar is kees. Je kunt dan de inhoud van om
het even welk formulier waarbij je gegevens vraagt van een gebruiker,
naar je laten mailen.
En aktie !
De mailtjes die jullie versturen komen in mijn mailbox terecht ! Als je niets zinvols te zeggen hebt, stuur dan ook geen email ! Aan mailtjes met een inhoud als test, dfdfdg, fsdts enz ... daar ben ik niets mee !