[PHP] mail inviata anche con campi obbligatori non compilati

eleumas

Utente Attivo
16 Ago 2015
67
2
8
Ciao a tutti, ho fatto uno script ma ho notato un comportamento anomalo.

Più nel dettaglio: ho una select con 3 opzioni
HTML:
<label>Tipologia*</label>
              <select class="uk-select" name="tipologia" id="tipologia">
                <option value="default" disabled selected>Seleziona</option>
                <option value="privato">Privato</option>
                <option value="azienda">Azienda</option>
              </select>
              <script>
              $('#tipologia').on('change',function(){
                if( $(this).val()==="azienda"){
                  $("#divAzienda").show()
                  $("#divNome").css("margin-top","40px")
                }
                else{
                  $("#divAzienda").hide()
                }
              });
              </script>

In base se viene scelto azienda o privato appare un campo.

Bene, se non tocco niente e clicco sul tasto "invia messaggio" il form viene inviato e a me chiaramente arriva una mail in bianco.

Al contrario se scelgo almeno la select tutto funziona regolarmente (o almeno mi sembra, inizio ad essere fuso oggi! :p)

Oltre a php uso anche jquery validation ma non credo che quello dia problemi.

Questo il codice php:
PHP:
<?php
if (isset($_GET["action"]))
{
  $url = 'https://www.google.com/recaptcha/api/siteverify';
  $data = array('secret' => "XXXXXXXXXXXXXXXX", 'response' => $_POST["g-recaptcha-response"]);
  $options = array(
    'http' => array(
      'header'  => "Content-type: application/x-www-form-urlencoded\r\n",
      'method'  => 'POST',
      'content' => http_build_query($data)
    )
  );
  $context  = stream_context_create($options);
  $result = file_get_contents($url, false, $context);
  if ($result === FALSE) {
    echo '<script>
    UIkit.notification({
      message : "Sei un robot? Errore reCAPTCHA.",
      status  : "warning",
      timeout : 0,
      pos     : "top-center"
    });
    </script>';
  }
  else
  {
    $decodedresult = json_decode($result, true);
    if($decodedresult['success'] == true) {

      switch($_POST['tipologia']){
        case 'azienda':

        require "GUMP/gump.class.php";

        $gump = new GUMP();

        $_POST = $gump->sanitize($_POST); // You don't have to sanitize, but it's safest to do so.

        $gump->validation_rules(array(
          'tipologia' => 'required',
          'azienda' => 'required|alpha_numeric',
          'nome' => 'required|alpha',
          'email' => 'required|valid_email',
          'telefono' => 'required|numeric',
          'dataArrivo' => 'required',
          'dataPartenza' => 'required',
          'persone' => 'required|numeric',
          'trattamento' => 'required',
        ));

        $gump->filter_rules(array(
          'azienda' => 'trim|sanitize_string',
          'nome' => 'trim|sanitize_string',
          'email' => 'trim|sanitize_email',
          'messaggio' => 'trim|sanitize_string'
        ));

        $validated_data = $gump->run($_POST);
        break; // fine condizione nel caso venga scelto azienda

        case 'privato':

        require "GUMP/gump.class.php";

        $gump = new GUMP();

        $_POST = $gump->sanitize($_POST); // You don't have to sanitize, but it's safest to do so.

        $gump->validation_rules(array(
          'tipologia' => 'required',
          'nome' => 'required|alpha',
          'email' => 'required|valid_email',
          'telefono' => 'required|numeric',
          'dataArrivo' => 'required',
          'dataPartenza' => 'required',
          'persone' => 'required|numeric|min_len,1',
          'trattamento' => 'required',
        ));

        $gump->filter_rules(array(
          'azienda' => 'trim|sanitize_string',
          'nome' => 'trim|sanitize_string',
          'email' => 'trim|sanitize_email',
          'messaggio' => 'trim|sanitize_string'
        ));

        $validated_data = $gump->run($_POST);
        break; // fine condizione nel caso venga scelto privato
      }

      if($validated_data === false) {
        echo '<script>
        UIkit.notification({
          message : "Compila il modulo correttamente.",
          status  : "warning",
          timeout : 0,
          pos     : "top-center"
        });
        </script>';

        echo '<div class="uk-alert-warning" uk-alert>
        <a class="uk-alert-close" uk-close></a>
        <p> '.$gump->get_readable_errors(true).' </p>
        </div>';

      }

      else {
        $tipologia = !empty($_POST['tipologia'])?$_POST['tipologia']:'';
        $azienda = !empty($_POST['azienda'])?$_POST['azienda']:'';
        $nome = !empty($_POST['nome'])?$_POST['nome']:'';
        $email = !empty($_POST['email'])?$_POST['email']:'';
        $telefono = !empty($_POST['telefono'])?$_POST['telefono']:'';
        $dataArrivo = !empty($_POST['dataArrivo'])?$_POST['dataArrivo']:'';
        $dataPartenza = !empty($_POST['dataPartenza'])?$_POST['dataPartenza']:'';
        $persone = !empty($_POST['persone'])?$_POST['persone']:'';
        $camera = !empty($_POST['camera'])?$_POST['camera']:'';
        $trattamento = !empty($_POST['trattamento'])?$_POST['trattamento']:'';
        $messaggio = !empty($_POST['messaggio'])?$_POST['messaggio']:'';
        $checkbox = !empty($_POST['checkbox'])?$_POST['checkbox']:'no';


        // corpo della mail
        $to = '[email protected]'; // <--- inserire e-mail destinatario
        $subject = "Ti ha scritto dal tuo sito:  $nome";
        $htmlContent = "
        <ul style='list-style: none; padding-left: 0;'>
        <li style='margin: 0 0 15px 0;'>Questi sono i dettagli del messaggio:</li>
        <li style='margin: 0 0 5px 0;'><b>Tipologia:</b> ".$tipologia."</li>
        <li style='margin: 0 0 5px 0;'><b>Azienda:</b> ".$azienda."</li>
        <li style='margin: 0 0 5px 0;'><b>Nome:</b> ".$nome."</li>
        <li style='margin: 0 0 5px 0;'><b>E-mail:</b> ".$email."</li>
        <li style='margin: 0 0 5px 0;'><b>Telefono:</b> ".$telefono."</li>
        <li style='margin: 0 0 5px 0;'><b>Data di arrivo:</b> ".$dataArrivo."</li>
        <li style='margin: 0 0 5px 0;'><b>Data di partenza:</b> ".$dataPartenza."</li>
        <li style='margin: 0 0 5px 0;'><b>Persone:</b> ".$persone."</li>
        <li style='margin: 0 0 5px 0;'><b>Camera:</b> ".$camera."</li>
        <li style='margin: 0 0 5px 0;'><b>Trattamento:</b> ".$trattamento."</li>
        <li style='margin: 0 0 5px 0;'><b>Messaggio:</b> ".$messaggio."</li>
        <li style='margin: 0 0 5px 0;'><b>Accettazione Privacy:</b> ".$checkbox."</li>
        </ul>
        ";

        // impostare sempre content-type quando si invia una mail in HTML
        $headers = "MIME-Version: 1.0" . "\r\n";
        $headers .= "Content-type:text/html;charset=UTF-8" . "\r\n";

        // headers
        $headers .= 'From:'.$nome.' <'.$email.'>' . "\r\n";

        // invio mail
        @mail($to,$subject,$htmlContent,$headers);

        echo '<script>
        UIkit.notification({
          message : "Messaggio inviato!",
          status  : "success",
          timeout : 0,
          pos     : "top-center"
        });
        </script>';
      }
    }
    else
    {
      echo '<script>
      UIkit.notification({
        message : "Messaggio non inviato!",
        status  : "danger",
        timeout : 0,
        pos     : "top-center"
      });
      </script>';
    }
  }
}
?>

Link del sito dove ho il problema: http://locandadellastazione.com/locandadellastazione/prezzi.php

Se volete provare fate pure, mi arriverà una mail bianca, ma non c'è problema! :)

Grazie a chiunque tenterà di aiutarmi!
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.042
148
63
PR
www.borgo-italia.it
ciao
potresti, prima di generare il corpo dell'email verificare se i campi obbligatori sono stati compilati e se no riinviare al form
a titolo di esempio
PHP:
//....
if(empty($tipologia) || empty($azienda)){
    header('location:pagina_del_form.php');
    exit();
}
//...
oppure
PHP:
//....
$errori="";
if(empty($tipologia)){
    $errori.="campo tipologia obbligatorio";
}
$errori="";
if(empty($azienda)){
    $errori.="campo azienda obbligatorio";
}
//e tutti i campi obbligatori
if(!empty($errori)){
    header('location:pagina_del_form.php?errori=$errori');
    exit();
    //usando il get per dare il messaggio di errore
}
//....
 

eleumas

Utente Attivo
16 Ago 2015
67
2
8
Ma in realtà tramite GUMP faccio questa cosa, ossia dico quali campi devono essere obbligatori affinché l'email venga spedita. Fra l'altro ho tolto dalla select tipologia la scelta "vuota" e ho lasciato solo privato o azienda e in questo modo tutto funziona alla perfezione. Non è che lo switch nel php fa casino?

Ti ringrazio per la tua risposta!
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.042
148
63
PR
www.borgo-italia.it
ciao
non conosco GUMP, quindi non so dirti
comunque nello switch conviene mettere il case:default, schematicamente
PHP:
switch($pinco){
    case 'uno'://azioni di uno
    break;
    //gli altri casi
    case default://cosa fare in tutti gli altri casi non contemplati prima
    break;
}
 

eleumas

Utente Attivo
16 Ago 2015
67
2
8
GUMP non fa altro che validatare i campi e ripulire ciò che viene scritto nei campi del form. Proverò a seguire il tuo consiglio perlo switch. Grazie!
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.042
148
63
PR
www.borgo-italia.it
ciao
valida e ripulisce ok, ma devi avere qualcosa che impedisca l'invio e rimandi al form se i campi obbligatori non sono stati compilti
se lo fa gump va bene altrimenti devi mettere quello che ti avevo suggerito prima
 

eleumas

Utente Attivo
16 Ago 2015
67
2
8
Ciao e grazie per avermi risposto. Ho scoperto che se inserisco il "case default" la pagina va in loop: carica all'infinito. Togliendo dalla select la selezione vuota, quella con l'attributo disabled il form si comporta alla perfezione. Qualche consiglio?
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.042
148
63
PR
www.borgo-italia.it
ciao
posta la parte dello switch
poi che nella <select> tu metta
<option value="" disabled selected>Seleziona</option>
o che tu lo tolga completamente se non selzionato e premuto il submit il valore di $_POST['tipologia'] ti risulta vuoto
comunque un altro consiglio cerca di non usare la funzione nativa php mail, soprattutto in quanto invii in formato html, e usa la classe phpmailer vedi
https://www.mrw.it/php/inviare-email-classe-phpmailer_7047.html
 

eleumas

Utente Attivo
16 Ago 2015
67
2
8
Mi sono guardato phpmailer. Domani provo a usarlo sul mio caso e vediamo cosa ci cavo fuori. Molto probabilmente chiederò il tuo aiuto! :p
 
Discussioni simili
Autore Titolo Forum Risposte Data
U PHP bottone per invio mail o ritorno al form PHP 15
G Invio mail con php da dati prelevati da un database PHP 9
AC1 [PHP] Invio Mail PHP 18
L Problema funzione mail() PHP PHP 3
I [PHP] inviare form con allegato tramite una mail PHP 1
B [PHP] Invio mail automatico dopo compilazione form - db PHP 25
L PopUp tramite PHP se la mail inserita è già registrata nel database PHP 3
G [PHP] Creare mail con allegato nascosto e bottone di richiamo PHP 0
P [PHP] PEAR Mail e Query PHP 3
Cosina Andare a capo nel testo della mail ricevuta dal form php PHP 1
D [PHP] script che invii una mail automatica dopo risposta ad una discussione di un forum PHP 0
M [PHP] mandare mail usando i cantatti di una lista su mailchimp PHP 7
G [PHP] Creare appuntamento ed inviarlo tramite mail (Outlook e Gmail) PHP 0
A [PHP] Problema invio mail con funzione mail() PHP 3
A Php mail non invia due mail di seguito PHP 3
A [PHP] Inviare mail con piu immagini allegate PHP 6
A [PHP] Modulo mail PHP 3
A [PHP] Formattazione Mail HTML HTML e CSS 5
A [PHP] RISOLTO Invio Mail con Tabella PHP 2
paloppa [PHP] Invio mail da form dubbio PHP 17
B [PHP] Mail di Avvenuta registrazione PHP 4
M [PHP] Componi i file di Excel in e-mail PHP 1
F Form mail php errore invio PHP 5
Punix [PHP] problema script invio e-mail PHP 2
cobra_72 [PHP] problema invio multiplo allegati mail PHP 21
Z Limite invio newsletter con PHP - mail() PHP 4
F [PHP] Comando mail() e lettere accentate PHP 10
N PHP, mail e outlook PHP 4
Tony Recchia [PHP] Modulo mail HTML PHP 4
allegria [PHP] Ricevo una doppia mail dal form PHP 6
C Sendmail PHP invia mail vuote PHP 14
E Rimuovere "dati in memoria" dopo invio mail [PHP] PHP 18
A [PHP] Blocco mail spam con regex PHP 2
A Non riesco ad inviare una mail attraverso PHP su Xampp PHP 2
V mail php PHP 10
ecosito [PHP] Attivare il form mail di un template PHP 2
utente Form mail php - indirizzo ip PHP 9
F Invio automatico mail php PHP 0
Francesco Polese Errore form invio mail+php PHP 22
R Errore invio mail in php PHP 1
V Spedire mail con PHP: come conosco i dati? PHP 8
felino Joomla 3.x - Configurazione PHP Mail Joomla 0
M Errore invio mail da php Posta Elettronica 5
P invio mail da form con dati php PHP 7
webmachine Come programmare l'invio di una mail in PHP? PHP 1
M Inviare mail con PHP tramite Mozilla PHP 3
M configurazione invio mail php PHP 25
G Piccolo aiuto per php mail PHP 2
S Form invio mail html, con invio tramite file denominato invio.php PHP 8
M postare un risultato di un div js in un apagina php e mail PHP 1

Discussioni simili