Brugere lige nu: 1 Hjemmesideskolen - Formular til php-formmail

Formular til php-formmail

Siden er opdateret d. 30. 4. 2017

Herunder ser du en formular, der fungerer via et php-script: Når brugere klikker på Send mail, sender formularen det indtastede til et phpscript på serveren. Her sker den videre ekspedition (heri ligger modtagerens emailadresse - bekvemt uden for spamrobotternes rækkevidde).

Dette script er udformet således, at spambotters forsøg på injection bliver fanget og blokeret.

Husk at udfylde alle felter




       

Formularen er helt enkel, ikke noget hokuspokus her:

<form method="post" action="sender.php">

<fieldset>
<legend>Husk at udfylde alle felter</legend>

<label for="t1">Navn:</label>
<input id="t1" type="text" name="name" /><br />

<label for="t2">Email:</label>
<input id="t2" type="text" name="email" /><br />

<label for="t3">Emne:</label>
<input id="t3" type="text" name="emne" /><br />

<!-- næste input skjules med css for almindelige brugere, kun spambotter ser (og udfylder sandsynligvis) feltet -->

<span class="ikkese"><label for="t7">Subject:</label>
<input id="t7" type="text" name="subject" /></span>

<label for="t4">Besked:</label>
<textarea id="t4" name="besked" rows="10" cols="49"></textarea><br />

<label for="t5">Ønskes kopi?</label>
<input type="checkbox" id="t5" name="customer_copy" checked="checked" />

<label for="t6">&nbsp;</label><input id="t6" type="submit" name="submit" value=" Send mail " />
&nbsp; &nbsp; <input type="reset" value=" Slet alt " />
</fieldset>
</form>

Feltet med class-definitionen "ikkese" gør du i din css-fil usynlig for almindelige brugere sådan:

.ikkese {
display: none;
}

Resultatet af den definition er, at kun spambotter ser feltet - og de lokkes med feltets name til at udfylde feltet. Derved bliver de sorteret fra.


Øverst i sender.php - før der sendes noget til browseren, hvilket også betyder før din DocType - lægger du denne kode. Koden tjekker, om der er skrevet noget i det "forbudte" felt og dermed om det er en spambot, der har udfyldt formularen:

<?
if (!empty($_POST['subject'])) {
  header ("Location: blokeret.php");
 exit;
}
?>

Udtykket !empty($_POST['subject']) betyder "hvis feltet subject ikke er tomt". Er det tilfældet, at dette felt ikke er tomt, viderestilles til blokeret.php, ellers kører scriptet bare videre nede i sidens <body>.

Husk at få lavet en fejlside blokeret.php, som spambotten kan sendes til. Fejlsiden må ikke indeholde brugbar information om, hvorfor mailen ikke blev sendt - bedst vil det være at skrive den engelske tekst Message was successfully sent. - "Meddelelsen er blevet sendt uden problemer".

Det php-script, der behandler det indtastede i formularen og sender det til modtageren (dig), indsætter du i bodysender.php (siden, der øverst tjekker for spambotter):

<?php
if (isset($_POST['submit']))
{
 if (!empty($_POST['name']) && // tjek, at der er skrevet et navn
 !empty($_POST['email']) &&    // tjek, at der er skrevet en e-mail-adresse
 !empty($_POST['emne']) &&  // tjek, at der er skrevet et emne
 !empty($_POST['besked']) &&  // tjek, at der er skrevet en besked

// her følger sikringen mod spambotter
 !strpos($_POST['name'], "dit_domain.dk") &&  // tjek, at dit domæne ikke er skrevet i feltet "navn"
 !strpos($_POST['email'], "dit_domain.dk") && // tjek, at dit domæne ikke er skrevet i feltet "email"
 !strpos($_POST['name'], "@") &&  // tjek, at der ikke er et @ i "navn"
 !preg_match('/\r/',$_POST['name']) && // tjek, at der ikke er "vogn-retur" i "navn"
 !preg_match('/\n/',$_POST['name']) &&  // tjek, at der ikke er "linjeskift" i "navn"
 !preg_match('/\r/',$_POST['email']) &&  // tjek, at der ikke er "vogn-retur" i "email"
 !preg_match('/\n/',$_POST['email']))  // tjek, at der ikke er "linjeskift" i "email"

// er alt ok, fortsættes med afsendelse af mailen
 {
  $headers="From: ".$_POST['name']."<".$_POST['email'].">";
  if (@$_POST['customer_copy'])
  {
   $headers .= "\r\nBcc: ".$_POST['email'];
  }
  $body .= "Den " . date("d/m y") . " kl. " . date("G:i") . " skrev " . $_POST['name'] . ":\r\n\r\n" . $_POST['besked'];
  if (@mail("dit.navn@dit_domain.dk", strip_tags($_POST['emne']),
  stripslashes(strip_tags($body)), $headers))
  {
   echo "<p>Tak for din henvendelse. Jeg svarer så hurtigt som muligt.</p>";
  }
  else
  {
   echo "<p>E-mailen blev ikke sendt. Der skete en fejl. Prøv igen!</p>";
  }
 }
 else
 {
  echo "<p>Mailen kunne ikke sendes, alle felter skal udfyldes korrekt!</p>";
 }
}
?>

De kodelinjer, hvor der i kommentaret står "Tjek, at dit domæne ..." og "Tjek, at der ikke ..." har det formål at fange eventuelle forsøg på injection fa spammere.

Kodelinjen if (@$_POST['customer_copy']) tjekker, om afsenderen ønsker en kopi af den sendte mail og den efterfølgende kodelinje $headers .= "\r\nBcc: ".$_POST['email'] sender i så fald denne mail-kopi til den email-adresse, som afsenderen har indtastet.

I de to linjer, hvor kommentaren lyder "Tjek, at dit domæne ...", indsætter du dit domæne, hvor der i koden står dit_domain.dk.

I sekstende kodelinje udskifter du dit.navn@dit_domain.dk med din egen mail-adresse.


Jeg skrev før kodeboksen med php-koden, at scriptet skal lægges ind i <body></body>sender.php.

Hvis du vil gøre det lidt mere elegant, lægger du yderligere omkring scriptet en <div id="indhold"></div>. Du skal så med css gøre plads over eller ved siden af denne div, så du kan få plads til en menu. Menuen tilføjer du sidens kildekode mellem <body> og <div id="indhold>:

body i sender.php:

<body>
Indsæt din menukode her
<div id="indhold>
Her indsætter du dit php-script
</div>
</body>
Valid XHTML og CSS / Copyright © Hjemmesideskolen september 2004
Hjemmesideskolen
Du er her: Forsiden - scripts - Formular til php-formmail
Brugere lige nu: 1
Home Mail