U bevindt zich hier: Forum » Tutorials » [php] Mailform
   Actief Topic: [php] Mailform

Vorige ( 1 ) Volgende

vlerknozem
Admin
avatar
# Gepost op 06-09-2009 21:14
Bewerkt door vlerknozem op 07-09-2009 19:05


Veel mensen willen graag een mailform op hen site. Maar dit kan niet met alleen html. Vandaar deze tutorial over hoe het in php kan. Om te beginnen, de uitleg van deze tutorial staat vooral als comments in de php.

1) De pagina met het formulier
Ik heb dit allen nu in een pagina gedaan omdat dit voor mij makkelijker is. Zorg wel dat alle php (boven de html) dus ook boven de html blijft.

Plain | Plain new window | PHP code:
  1. <?php
  2. // Mail in html versturen? (true/false)
  3. define('MAILFORM_HTML', true);
  4.  
  5. // Email waar mail naartoe gaat
  6. define('MAILFORM_EMAIL', 'test@voorbeeld.nl');
  7.  
  8. // Onderwerp van mail
  9. define('MAILFORM_ONDERWERP', 'Mailform Onderwerp');
  10.  
  11. // Stuur een bedanktje? (true/false)
  12. define('MAILFORM_BEDANKT', true);
  13.  
  14. // Email adres van wie het bedanktje komt
  15. define('MAILFORM_BEDANKT_EMAIL', 'noreply@site.nl');
  16.  
  17. // Onderwerp van de bedank email
  18. define('MAILFORM_BEDANKT_ONDERWERP', 'Bedankt voor uw reactie!!!!!');
  19.  
  20.  
  21.  
  22. // Functie om de templates te parsen
  23. function parse_template($naam) {
  24.     $template  = file_get_contents($naam);
  25.     foreach($_POST as $key => $value) {
  26.         $template = str_ireplace('${'.$key.'}', $value, $template);
  27.     }
  28.     $template = str_ireplace('${IP}', $_SERVER['REMOTE_ADDR'], $template);
  29.     return $template;
  30. }
  31.  
  32. // Is er een post request?
  33. $fouten = "";
  34. $verzonden = false;
  35. if($_SERVER['REQUEST_METHOD'] == 'POST' && isset($_POST['actie']) && $_POST['actie'] == 'verzendmail') {
  36.     // HTML input filteren en escapes weghalen
  37.     foreach($_POST as $key=>$value) {
  38.         $_POST[$key] = htmlspecialchars(stripslashes($value));
  39.     }
  40.  
  41.     // Controle of de mail niet al is verzonden?
  42.     if(isset($_SESSION['bericht']) && $_SESSION['bericht'] == $_POST['bericht']) {
  43.         $fouten = 'De mail is al verzonden.';
  44.     } else {
  45.         // Controle email
  46.         if(!preg_match('/^[-+\\.0-9=a-z_]+@([-0-9a-z]+\\.)+([0-9a-z]){2,4}$/i', $_POST['email'])) {
  47.             $fouten .= "- Email adres is onjuist<br />";
  48.         }
  49.  
  50.         // Kijken of het bericht niet te lang of te kort is
  51.         if(strlen($_POST['bericht']) < 10 || strlen($_POST['bericht']) > 500) {
  52.             $fouten .= "- Het bericht is te lang of te kort<br />";
  53.         }
  54.  
  55.         // Kijken of er fouten zijn
  56.         if(!$fouten) {
  57.             // Headers opstellen
  58.             $headers_from  = "From: ".$_POST['email']."\r\n";
  59.             $headers = 'X-Mailer: PHP/' . phpversion() . "\r\n";
  60.             if(MAILFORM_HTML === True) {
  61.                     $headers .= "MIME-Version: 1.0\r\n";
  62.             }
  63.             $headers .= "Content-Type: text/html; charset=utf-8\r\n";
  64.             $headers .= "Content-Transfer-Encoding: 8bit\r\n\r\n";
  65.  
  66.             // Bericht opstellen
  67.             $bericht = parse_template('mail_template.html');
  68.  
  69.             $resultaat = mail(MAILFORM_EMAIL, MAILFORM_ONDERWERP, $bericht, $headers_from.$headers);
  70.             if(!$resultaat) {
  71.                 $fouten = "Er is een fout opgetreden.";
  72.             } else {
  73.                 if(MAILFORM_BEDANKT) {
  74.                     // Stuur bedankje
  75.                     $bericht = parse_template('mail_bedankt_template.html');
  76.                     $headers_from  = "From: ".MAILFORM_BEDANKT_EMAIL."\r\n";
  77.                     mail($_POST['email'], MAILFORM_BEDANKT_ONDERWERP, $bericht, $headers_from.$headers);
  78.                 }
  79.                 $_SESSION['bericht'] = $_POST['bericht'];
  80.                 $verzonden = true;
  81.             }      
  82.         }
  83.     }
  84. }
  85. ?>
  86. <html>
  87. <head>
  88.     <title>Mailform</title>
  89. </head>
  90. <body>
  91.     <?php
  92.     if($fouten) {
  93.         ?>
  94.         <p>
  95.             De volgende fouten zijn opgetreden: <br />
  96.             <?php echo $fouten; ?>
  97.         </p>
  98.         <?php
  99.     }
  100.     if($verzonden) {
  101.         ?>
  102.             <p>Bedankt voor uw reactie!</p>
  103.         <?php
  104.     } else {
  105.         ?>
  106.         <form action="<?php echo $_SERVER['REQUEST_URI'];?>" method="post">
  107.             <p>
  108.                 Email <input type="text" name="email" value="<?php echo (isset($_POST['email'])) ? $_POST['email'] : "" ;?>" />
  109.             </p>
  110.             <p>
  111.                 Bericht <br />
  112.                 <textarea name="bericht"><?php echo (isset($_POST['bericht'])) ? $_POST['bericht'] : "" ;?></textarea>
  113.             </p>
  114.             <p>
  115.                 <input type="hidden" name="actie" value="verzendmail" />
  116.                 <input type="submit" value="verzenden" />
  117.             </p>
  118.         </form>
  119.         <?php
  120.     }
  121.     ?>
  122. </body>
  123. </html>


2) De templates
Om het overzichtelijk te houden heb ik de mails verdeeld in twee templates.

mail_template.html
Plain | Plain new window | HTML code:
  1. U heeft een bericht ontvangen van ${EMAIL}.
  2. <hr />
  3. <p>
  4.     ${BERICHT}
  5. </p>
  6. <hr />
  7. Einde bericht


mail_bedankt_template.html
Plain | Plain new window | HTML code:
  1. Bedankt voor uw reactie!

De variabele worden automatisch omgezet in de tekst die er moet komen te staan.


3) uitbreidingen
Natuurlijk kan je het ook uitbreiden. Wil je een ip adres weergeven in de mail? Dan voeg je de variabele '${IP}' toe aan de template op de plek waar het ip adres moet komen te staan. Wil je een nieuw formulier veld toevoegen? Dan kan dat gemakkelijk. Voeg gewoon het veld toe aan het formulier en voeg de variabele '${NAAM_FORM_VELD}' toe aan de template. Om dit veld te controleren voeg je toe:

Plain | Plain new window | PHP code:
  1. <?php
  2. // Valideren
  3. if(strlen($_POST['naam_form_veld']) < 10 || strlen($_POST['naam_form_veld']) > 500) {
  4.     $fouten .= "- Het form veld is te lang of te kort<br />";
  5. }
  6. ?>


De 10 staat voor de minimale - en de 500 voor de maximale stringlengte.

Lees de forum regels

superkluns
Tester
avatar
# Gepost op 06-09-2009 21:38
Bewerkt door superkluns op 06-09-2009 21:44


Mooi gedaan, al had ik ook niet anders van jou verwacht:P
Het 'template-systeem' is nieuw voor mij. Dat is voor mij een mooie les geweest. Was ik nooit op gekomen om zoiets te doen.

EDIT: ik vraag me eigenlijk opeens af waarom je define('var','waarde') zou gebruiken, en niet $var = 'waarde'?? Wat is het voordeel daarvan?

vlerknozem
Admin
avatar
# Gepost op 06-09-2009 21:50


Citaat van superkluns
EDIT: ik vraag me eigenlijk opeens af waarom je define('var','waarde') zou gebruiken, en niet $var = 'waarde'?? Wat is het voordeel daarvan?

Normaal gebruik ik dit omdat ik met OOP werk. Daar is het zeer handig omdat je de variabele buiten de klasses dan ook binnen klasses kan gebruiken zonder ze door te geven. Dus ik ben het gewend om dit voor configuratie doeleinde te gebruiken.

Bovendien is het iets overzichtelijker, je ziet namelijk een onderscheid tussen configuratie variabele en systeem variabelen.

Lees de forum regels

superkluns
Tester
avatar
# Gepost op 06-09-2009 21:56


aha, ik snap het. Als het waar is wat je zegt (en daar twijfel ik geen moment aan!) dan ben ik het volledig met je eens.

Vorige ( 1 ) Volgende

U moet aangemeld zijn om een reactie te kunnen plaatsen.

Indien u nog geen account heeft kunt u zich hier registreren.



© copyright 2009/2010 WebProjects 1.02 - Template van Sebastaan Franken