• User Attivo

    [Script] Form per invio mail con controllo

    Invio web form da modulo in php con controllo campi by pikadilly

    [LEFT]Dopo gestione di un form per l'invio mail un altro script/tutorial per la gestione di un form per l'invio di mail con un controllo

    Anche questo come il precedente è a cure di Pikadilly.

    "Abbiamo visto come creare una piccola form per i contatti in xhtml e php che restituisce un errore se i campi
    "body", ovvero corpo del messaggio, e "mail", ovvero l'e-mail, non sono compilati. Ma questo metodo prevede l'impiego di due pagine distinte:quella della form, che chiamai "modulo.html", e quella in php che processa i dati inseritinella form, chiamata "invio.php".
    Se volessimo utilizzare invece un unica pagina che fa tutto, modulo, controllo e invio?
    Ebbene si dovrà prima di tutto creare una pagina con estensione php, quindi la pagina "modulo.html" per questi fini è inutilizzabile, in seguito si dovranno apportare delle modifiche alla pagina in cui
    abbiamo creato la form.[/LEFT]
    [LEFT]1.Questo è il codice che va inserito prima della form e serve a definire le frasi di errore e ad inviare la mail.[/LEFT]

    [php]<?php
    define("_destinatario","[email protected]");
    define("errore_oggetto_predefinito","Non ha inserito un oggetto!");
    define("errore_email_predefinito","L'indirizzo email che ha inserito non è corretto!");
    define("errore_messaggio_predefinito","Il messaggio è vuoto!");
    define("segnaposto_oggetto","Inserisca un oggetto");
    define("segnaposto_email","Inserisca la Sua email");
    define("segnaposto_messaggio","Inserisca il Suo messaggio");
    function generaModulo($oggetto=segnaposto_oggetto,$email=segnaposto_email,$messaggio=segnaposto_messaggio,$errore_oggetto="",$errore_email="",$errore_messaggio=""){
    ?>
    [left]2. Di seguito invece c'è la form con i vari controlli in php, come si vede ho integrato benissimo
    il codice xhtml della struttura della form con i vari codici php.[/left]
    <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post" id="form1">
    <p>Per ricevere informazioni e preventivi potete compliare la form sottostante. Invieremo al più presto una risposta.</p>
    <table>
    <tr>
    <td>Il Suo indirizzo e-mail*</td>
    <td><label>
    <?php if (!$errore_email=="") { echo"<span><strong>$errore_email</strong></span>";} else { echo"";}?><br />
    <input name="email" type="text" id="mail" value="<?php echo $email;?>" />
    </label></td>
    </tr>
    <tr>
    <td>Oggetto*</td>
    <td><label>
    <?php if (!$errore_oggetto=="") { echo"<span><strong>$errore_oggetto</strong></span>";} else { echo"";}?><br />
    <input name="oggetto" type="text" id="oggetto" value="<?php echo $oggetto;?>" />
    </label></td>
    </tr>
    <tr>
    <td>Messaggio*</td>
    <td>
    <?php if (!$errore_messaggio=="") { echo"<span><strong>$errore_messaggio</strong></span>";} else { echo"";}?><br />
    <textarea name="messaggio" cols="30" rows="5" id="messaggio" ><?php echo $messaggio;?></textarea>
    </td>
    </tr>
    <tr>
    <td><label>*I campi sono obbligatori

    </label></td>
    <td><label>
    <input type="submit" value="Invia il modulo" name="bottone_invio" /> <input type="reset" name="cancella" id="cancella" value="Ripristina" />
    </label></td>
    </tr>
    </table>

    </form>

    [/php][LEFT]3.Questo controlla che la mail inserita non sia fasulla o scritta in malo modo.[/LEFT]
    [php]<?php
    }
    function isValidEmail($email){
    $pattern = "^[_a-z0-9-]+(.[_a-z0-9-]+)@[a-z0-9-]+(.[a-z0-9-]+)(.[a-z]{2,3})$";

    if (eregi($pattern, $email)){
    return true;
    }
    else {
    return false;
    }
    }
    function controlla($stringa,$lunghezza){
    if (strlen($stringa)<$lunghezza){
    return true;
    }
    else {
    return false;
    }
    }
    ?>

    [/php][LEFT] 4.Questo è ciò che andremo a ricevere e nel caso ci sia un errore la mail non parte.

    [/LEFT]
    [php]
    <?php if (!isset($_POST['bottone_invio'])) {
    generaModulo();
    } else {
    $oggetto = isset($_POST['oggetto']) ? stripslashes ($_POST['oggetto']) : "";
    $email = isset($_POST['email']) ? stripslashes ($_POST['email']) : "";
    $messaggio = isset($_POST['messaggio']) ? stripslashes ($_POST['messaggio']) : "";

    $error = false;
    $errore_oggetto = '';
    $errore_email = '';
    $errore_messaggio = '';
    if (controlla($oggetto,1) or ($oggetto==segnaposto_oggetto)) {
    $error = true;
    $errore_oggetto = errore_oggetto_predefinito;
    }

    if (!isValidEmail($email)){
    $error = true;
    $errore_email = errore_email_predefinito;
    }
    if ((controlla($messaggio,1)) or ($messaggio==segnaposto_messaggio)) {
    $error = true;
    $errore_messaggio = errore_messaggio_predefinito;
    }
    if ($error){
    generaModulo($oggetto,$email,$messaggio,$errore_oggetto,$errore_email,$errore_messaggio);
    }
    else {
    ?>
    [/php] [LEFT]5. Se va a buon fine avremo stampato a video il riepilogo dopo l'invio[/LEFT]

    [php]<p>
    Ha inserito i seguenti dati:<br />
    <br />
    <b>Oggetto:</b> <?php echo $oggetto ?>
    <br />
    <b>Email:</b> <?php echo $email ?>
    <br />
    <b>Messaggio:</b> <?php echo $messaggio ?>
    <br />
    </p>
    [/php]
    6. Questo è quello che ci arriverà e il ringraziamento per averci contattato.[/left]
    [php]<?php
    if ($telefono == segnaposto_telefono) $telefono="-";
    mail(_destinatario,"contatto dal tuo sito","Oggetto: $oggetto\nEmail: $email\nMessaggio:$messaggio","From:$email");
    echo"<p>Grazie per aver inviato il messaggio</p>";?>
    <?php } }

    ?>

    [/php]Grazie a Pikadilly


  • Super User

    🙂

    Questo tipo di applicazione è molto utile perchè non solo impiega una sola pagina ma evita che si inseriscano indirizzi mail con caratteri non proprio da indirizzo, inoltre gli errori che restituisce nel caso di mali inserimenti appaiono sopra i campi. Può essere usato benissimo anche per i commenti da far pervenire attraverso mail.
    Ovviamente non ha un errore nemmeno nella sintassi xhtml 😄


  • User

    Ciao, bellissima form complimenti!

    Mi rendo conto che sto x fare una domanda imbarazzantemente sciocca, ma non lo so 😞

    Io ho bisogno di fare una form quasi come questa. A errore deve inserire una label senza cambiare pagina, e a conferma deve restare nella stessa pagina (cancellareil modulo, ok, ma tenere tutto il resto di quel layout).. inoltre devo inserirla su estensione .html

    Ditemi, dimmi, che c'è una soluzione...


  • Super User

    Ma questa ad errore non cambia pagina, ti segna rosso i campi che non hai riempito bene. Anche dopo l'invio non cambia pagina, è sempre la stessa...Per l'estensione in html credo che non so aiutarti, questa form richiede php, ma se conosci qualche tecnica di url rewrite puoi provare a renderla html. 😉


  • User

    Grazie Pikadilly,
    si puo fare con htacces l'interpretazione del php su html, solo che su Register non funziona mannaggia (altrove si, appena provato). Ho aperto un topic piu specifico.
    Grazie della risposta!


  • User

    AutoEdit. sorry!!! Cancellate pure!


  • User

    Riprendo questo topic perchè avrei bisogno di un piccolo aiuto, nell'implementazione di un captcha. Nella mia precedente form utilizzavo il codice di seguito nella pagina "invia.php", per confrontare le due stringhe:

    session_start();
    $utente = $_POST['captcha'];
    $validato = $_SESSION['veri'];
    
    --------------------------
    if($utente == $validato){
    }else{
    ecc...
    

    ho provato a riadattarlo ma non effettua alcun confronto del codice. Come posso fare? Vi ringrazio in anticipo 🙂


  • User Attivo

    image


  • User

    Ciao,
    innanzitutto complimenti per lo script.
    Se volessi aggiungere dei campi al form e renderli obbligatori, cosa dovrei modificare?
    Ho provato ad aggiungere il campo nome ed il campo cognome così:
    [PHP]
    define("errore_nome_predefinito","Non ha inserito il nome!");
    define("errore_cognome_predefinito","Non ha inserito il cognome!");
    define("segnaposto_nome","Inserisca il Suo nome");
    define("segnaposto_cognome","Inserisca il Suo cognome");
    function generaModulo($oggetto=segnaposto_oggetto,$email=segnaposto_email,$messaggio=segnaposto_messaggio,$nome=segnaposto_nome,$cognome=segnaposto_cognome,$errore_oggetto="",$errore_email="",$errore_messaggio="",$errore_nome="",$errore_cognome=""){
    [/PHP]
    e poi:
    [PHP]
    <tr>
    <td>Nome*</td>
    <td><label>
    <?php if (!$errore_nome=="") { echo"<span><strong>$errore_nome</strong></span>";} else { echo"";}?><br />
    <input name="nome" type="text" id="nome" value="<?php echo $nome;?>" />
    </label></td>
    </tr>
    <tr>
    <td>Cognome*</td>
    <td><label>
    <?php if (!$errore_cognome=="") { echo"<span><strong>$errore_cognome</strong></span>";} else { echo"";}?><br />
    <input name="nome" type="text" id="cognome" value="<?php echo $cognome;?>" />
    </label></td>
    </tr>
    [/PHP]

    E ancora:
    [PHP]
    <?php if (!isset($_POST['bottone_invio'])) {
    generaModulo();
    } else {
    $nome = isset($_POST['nome']) ? stripslashes ($_POST['nome']) : "";
    $cognome = isset($_POST['cognome']) ? stripslashes ($_POST['cognome']) : "";
    $oggetto = isset($_POST['oggetto']) ? stripslashes ($_POST['oggetto']) : "";
    $email = isset($_POST['email']) ? stripslashes ($_POST['email']) : "";
    $messaggio = isset($_POST['messaggio']) ? stripslashes ($_POST['messaggio']) : "";

      $error  = false;
      $errore_nome = '';
      $errore_cognome = '';
      $errore_oggetto = '';
      $errore_email = '';
    

    $errore_messaggio = '';
    if (controlla($oggetto,1) or ($oggetto==segnaposto_oggetto)) {
    $error = true;
    $errore_oggetto = errore_oggetto_predefinito;
    }

      if ((controlla($nome,1)) or ($nome==segnaposto_messaggio)) { 
          $error = true;
          $errore_nome = errore_nome_predefinito;
      }
      
      if ((controlla($cognome,1)) or ($cognome==segnaposto_messaggio)) { 
          $error = true;
          $errore_cognome = errore_cognome_predefinito;
      }
      if (!isValidEmail($email)){
          $error = true;
          $errore_email = errore_email_predefinito;
      }
      if ((controlla($messaggio,1)) or ($messaggio==segnaposto_messaggio)) { 
          $error = true;
          $errore_messaggio = errore_messaggio_predefinito;
      }
      if ($error){
         generaModulo($nome,$cognome,$oggetto,$email,$messaggio,$errore_nome,$errore_cognome,$errore_oggetto,$errore_email,$errore_messaggio);
      }
      else {
    

    ?>
    <p>
    Ha inserito i seguenti dati:<br />
    <br />
    <b>Nome:</b> <?php echo $nome ?>
    <br />
    <b>Cognome:</b> <?php echo $cognome ?>
    <br />
    <b>Oggetto:</b> <?php echo $oggetto ?>
    <br />
    <b>Email:</b> <?php echo $email ?>
    <br />
    <b>Messaggio:</b> <?php echo $messaggio ?>
    <br />
    </p>
    <?php
    [/PHP]

    ma se provo a far generare l'errore mi compare la frase di errore dell'email nel campo nome, la frase dell'oggetto nel campo cognome...
    Cosa sbaglio?
    Grazie


  • User

    image


  • User Newbie

    Salve ho provato a inserire il form e spedirmi una e-mail ma perchè mi dice di impostare smtp?
    Premetto che provo tutto in locale dopo aver impostato il server remoto e questo è quello che appare dopo che provo a inviare l'email

    **Notice: **Use of undefined constant segnaposto_telefono - assumed 'segnaposto_telefono' in C:..... alla linea 122

    Notice: Undefined variable: telefono in 😄 percorso...alla linea 122

    Warning: mail() [function.mail]: Failed to connect to mailserver at "localhost:9000" port 25, verify your "SMTP" and "smtp_port" setting in php.ini or use ini_set oppure mi dice di settarlo in 😄 sul server remoto

    errore alla linea 122 e 123...io ho cambiato l'indirizzo di posta solo nella prima parte devo fare altro? Ringrazio chiunque in anticipo


  • User Newbie

    Grazie a tutti ma ho risolto era solo la configurazione smtp nel file php.ini che non avevo impostato. Ciao e complimenti davvero utile


  • User Newbie

    Purtroppo non ne capisco molto di php, ho solo un dubbio in locale tutto funziona...se io mettessi in linea il sito avrei bisogno anche del database o mi basta aver messo il modulo in una pagina con estensione php? Grazie per la risposta


  • ModSenior

    Ciao rezaur,

    Lo script non utilizza database, pertanto non è necessario.


  • User Attivo

    Scusate, riapro questo bel topic per due o tre domande:

    Se volessi che dopo il click su "Invia", ci fosse prima un ulteriore messaggio di conferma del tipo: Confermi l'invio della mail? ad esempio con un bottone che confermi e invii definitivamente la mail.. ad esempio dopo aver cliccato su Invio sotto appaia un bottone con scritto "Confermi?"

    secondo: per inserire un captcha come potrei fare?

    e per inserire altri campi come checkbox o menu a tendina, potreste farmi un esempio pratico?

    e ultima cosa semplice semplice.. per inserire nella pagina di ringraziamento un redirect, quindi nella pagina che appare dopo l'invio effettuato, conviene usare un metatag per questo?

    Grazie


  • User

    Una domanda che spero non valga un milione di euro....

    lo script non funziona se il server mail non è sullo stesso server dove risiede il sito vero?

    Ho provato sia lo script con doppia pagina che questo in entrambe i casi non invia messaggi alla mailbox, mentre provandoci da un sito dove il server mail è residente funzionano tranquillamente....


  • User

    :omi sto rendendo condo che molti venditori di medicinali on line si accaniscono a inviare dai moduli la loro pubblicità, hanno finalmente capito che le email non rendono più di tanto in quanto finiscono dirette nello spam...
    Fare un "controllo testo inserito" non sarebbe un'idea stupida, secondo voi è possibile?


  • User

    due domande:

    1. come si può formattare il testo (e lo sfondo, etc), contenuto nel php, di risposta a chi ha inviato la e-mail?

    2. come si può rimandare automaticamente chi ha compilato la form alla pagina html?

    grazie

    Stefano


  • User

    mi sa che questo 3d è stato un po' abbandonato SIC!
    cmq i miei problemi di spam li ho risolti inserendo un deterrente
    tutti i campi obbligatori più visualizzazione dell'indirizzo IP del visitatore... lo spam non arriva più


  • User Attivo

    Scusate se riprendo questo topic:

    se volessi mettere un controllo nel mio script devo solo aggiungerci questo?

    [php]
    <?php
    }
    function isValidEmail($email){
    $pattern = "^[_a-z0-9-]+(.[_a-z0-9-]+)@[a-z0-9-]+(.[a-z0-9-]+)(.[a-z]{2,3})$";

    if (eregi($pattern, $email)){
    return true;
    }
    else {
    return false;
    }
    }
    function controlla($stringa,$lunghezza){
    if (strlen($stringa)<$lunghezza){
    return true;
    }
    else {
    return false;
    }
    }
    ?>

    [/php]

    Grazie!