Creare un Form Mail in Php

Vedremo come implementare su un sito internet un form mail, quindi creeremo un modulo di contatto che permetterà al visitatore di un sito di contattare il gestore di un sito internet.

Contents

Form Html

Il form sarà composto da una parte HTML e di uno script PHP che processerà le informazioni scritte nel modulo e le invierà tramite email al gestore del sito.

Creiamo la parte html del form, per prima cosa creiamo un file, che chiamerò index.php, voi chiaramente potrete chiamarlo come meglio desiderate.  Per ora non faremo molta attenzione all’aspetto grafico, ci interessa il funzionamento, ci faremo aiutare da boostrap per renderlo un minimo gradevole:

<!DOCTYPE html>
<html lang="it">
  <head>
      <meta charset="it">
      <title>Form Mail</title>
      <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
  </head>
  <body>
    <div class="container mt-5">
        <h1>Contattaci</h1>
        <form action="send.php" method="POST">
            <div class="row">
                <div class="form-group col-6">
                    <input type="text" class="form-control" name="name" placeholder="Nome">
                </div>
                <div class="form-group col-6">
                    <input type="text" class="form-control" name="surname" placeholder="Cognome">
                </div>
                <div class="form-group col-6">
                    <input type="email" class="form-control" name="email" placeholder="Inserisci la tua mail">
                </div>
                <div class="form-group col-6">
                    <input type="text" class="form-control" name="object" placeholder="Oggetto">
                </div>
                <div class="form-group col-12">
                    <textarea name="message" cols="30" class="form-control" rows="10" placeholder="Testo del messaggio"></textarea>
                </div>
                <div class="form-group col-12">
                    <button class="btn btn-primary float-right">Invia Mail</button>
                </div>

            </div>
        </form>
    </div>
  </body>
</html>

Benissimo ora abbiamo il nostro form HTML.

Controlli php sul form

È giunta l’ora di  creare il file verifica.php che si occuperà di inviare l’email e fare i dovuti controlli lato server. Dobbiamo verificare che i dati arrivino e che non siano vuoti:

<?php
// controlli
$error = false;
if(!isset($_POST['name']) || empty($_POST['name'])){
    $error = true;
}
if(!isset($_POST['surname']) || empty($_POST['surname'])){
    $error = true;
}
if(!isset($_POST['email']) || empty($_POST['email'])){
    $error = true;
}
if(!isset($_POST['object']) || empty($_POST['object'])){
    $error = true;
}
if(!isset($_POST['message']) || empty($_POST['message'])){
    $error = true;
}

if($error){
    echo "alcuni campi obbligatori non sono stati compilati";
    exit();
}

Quel che abbiamo fatto è chiaramente molto semplice, siamo andati ad impostare una variabile $error, che va a segnalarci se c’è qualche campo non compilato, questa diverrà true solo se qualche campo non è stato compilato nel form html. Andiamo a verificare che sia stato mandato il dato tramite post e che non sia vuoto.

A quel punto se qualche dato è mancante andiamo a stampare che manca un dato fondamentale e con exit() facciamo in modo di bloccare l’esecuzione del codice php. Quindi a questo punto ci siamo assicurati di avere tutti i dati che ci servono. Chiaramente per completezza andrebbero fatti i controlli anche lato client tramite javascript o anche semplicemente con il nuovo HTML5, ma per ora non ci interessa. Ricordiamo sempre che i controlli lato front-end non ci consentono di evitare quelli lato back-end che sono fondamentali.

Inviamo l’email

Ora andiamo ad usare il metodo mail di Php, il primo argomento specifica il destinatario del messaggio, il secondo l’oggetto dell’email, il terzo il messaggio vero e proprio, il quarto e il quinto servono ad aggiunte intestazioni o parametri addizionali. Questo metodo ci restituisce un valore booleano che ci comunica l’esito dell’invio della mail.

$result = mail ("maildestinatario@example.com", $_POST['object'], $_POST['message'],  "FROM: $_POST[email]");

if($result)
    echo "Email inviata con successo";
else
    echo "Problemi nell'invio dell'email";

Ora andiamo a creare una variabile $result che ci restituirà un valore booleano, vero o falso,  a seconda dell’esito dell’invio dell’email. Come primo parametro andiamo a mettere il destinatario dell’email, poi oggetto e messaggio, e infine il mittente come quarto parametro. Poi andiamo a verificare l’esito, se è true allora l’email è stata inviata con successo, altrimenti qualcosa è andato storto. Chiaramente ricordati di inserire la tua email al posto dell’email di esempio nel primo parametro di mail.

Avete già provato l’invio dell’email vero? Ed è fallito vero?  Tutto normale per testare il funzionamento di questo codice è necessario che sia installato un server mail, quando acquistiamo uno spazio web questo normalmente è installato di default, su Aruba ad esempio lo trovate già installato, ma in locale non lo abbiamo. Possiamo scaricarne qualcuno, ma la cosa più semplice è provare direttamente online i nostri file. Se volete fare delle prove senza comprare uno spazio web, potete testare il tutto con Altervista, che è completamente gratuito.

Refactoring del nostro codice

Ok, il nostro codice è base lo so, di certo questa non è una guida avanzata ma dobbiamo sistemare un minimo il nostro codice base. Nonostante i controlli non siano assolutamente sufficienti e questo sia un esempio base, il nostro codice si ripete in troppe righe quindi dobbiamo cercare di renderlo più efficace. Possiamo modificarlo così:

function requiredControl($name){
    return !isset($_POST[$name]) || empty($_POST[$name]) ? true : false;
}
$error = false;



$error = requiredControl('name')? true : $error;
$error = requiredControl('surname') ? true : $error;
$error = requiredControl('email')? true : $error;
$error = requiredControl('object')? true : $error;
$error = requiredControl('message')? true : $error;

Abbiamo creato una funziona in modo da non ripetere lo stesso identico codice, e all’interno usato un if ternario, in modo che ci torni true o false.

Cerchiamo di migliorarlo ancora insieme? La condizione in realtà riporta già un true o false, è inutile fare un ternario giusto? In realtà potremmo anche passare $error alla funzione in modo da fare il controllo all’interno e non ripeterlo fuori.

function requiredControl($name, $error){
    return !isset($_POST[$name]) || empty($_POST[$name]) ? true : $error;
}
$error = false;

$error = requiredControl('name', $error);
$error = requiredControl('surname', $error);
$error = requiredControl('email', $error);
$error = requiredControl('object', $error);
$error = requiredControl('message', $error);

Bene molto meglio, ora però c’è ancora del codice moltiplicato che possiamo evitare, ci proviamo?

function requiredControl($name, $error){
    return !isset($_POST[$name]) || empty($_POST[$name]) ? true : $error;
}
$error = false;
$validations = ['name', 'surname', 'email', 'object', 'message'];

foreach ($validations as $validation){
    $error = requiredControl($validation, $error);
}

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *