[PHP] Invio mail automatico dopo compilazione form - db

  • Creatore Discussione Creatore Discussione Borghese
  • Data di inizio Data di inizio

Borghese

Nuovo Utente
3 Feb 2019
14
0
1
Ciao a tutti ragazzi,

credetemi, penso di aver letto qualsiasi topic con la richiesta simile alla mia, ma non ho trovato la risposta, e non ne vengo a capo , vi spiego :

Ho un sito in Php, che prevede la compilazione di un form con alcuni dati.
Questi dati vengono poi scritti in un db mysql

Ora io vorrei che, dopo che uno degli utenti che ho creato sul db,si è loggato sul portale, e ha compilato il form, partisse in automatico una mail a un indirizzo/dl da me scelti. (Attenzione non voglio che sia l'utente a decidere se generare o meno la mail, voglio proprio che parta in automatico una volta salvato il form)

Come posso fare ?

Preciso che nel db chiaramente sono presenti sia la tabella che viene popolata dopo la compilazione del form, sia la tabella degli utenti autorizzati ad accedere al sito, con i relativi indirizzi mail.

E possibile fare quello che chiedo ?
 
Inserisci la funzione di invio email dopo la query di inserimento dati presi dal form
 
Ok... puoi aiutarmi a capire come fare questa funzione ? E questo che non riesco a capire, come sia il codice da scrivere ...
 
Allora, ho provato a inserire questa funzione, dopo il richiamo all'inserimento dei dati nel db (mysqli_query) :
PHP:
$nome_mittente = "xxxxxxxxxxxxxxx";
$mail_mittente = "xxxxxxxxxxxxxxx@gmail.com";
$mail_destinatario = "xxxxxxxxxxxxxxx.@me.com";

$mail_oggetto = "Messaggio di prova";

$mail_corpo = <<<HTML
<html>
<head>
  <title>Prova Invio Nuovo Incident</title>
</head>
<body>
Questo è un messaggio di prova l'<b>invio di mail in HTML</b> con la funzione mail() di PHP
</body>
</html>
HTML;

$mail_headers = "From: " .  $nome_mittente . " <" .  $mail_mittente . ">\r\n";
$mail_headers .= "Reply-To: " .  $mail_mittente . "\r\n";
$mail_headers .= "X-Mailer: PHP/" . phpversion() . "\r\n";

// Aggiungo alle intestazioni della mail la definizione di MIME-Version,
// Content-type e charset (necessarie per i contenuti in HTML)
$mail_headers .= "MIME-Version: 1.0\r\n";
$mail_headers .= "Content-type: text/html; charset=iso-8859-1";

if (mail($mail_destinatario, $mail_oggetto, $mail_corpo, $mail_headers))
  echo "Messaggio inviato con successo a " . $mail_destinatario;
else
  echo "Errore. Nessun messaggio inviato.";
l'ho messo all'interno dello stesso codice php del form.
Ho provato a inserire dei dati, salvando il form, ma la mail non parte

Dove sto sbagliando ?!?
 
Ultima modifica di un moderatore:
@Borghese
Da regolamento del forum, come tutti noi sei tenuto ad usare il tag
code-gif.6007
o il tag
php-png.6009
per il PHP, quando posti del codice, oppure la funzione codice dalla barra degli strumenti
box-inserisci-2-png-jpg.6008

Inoltre ti prego di leggere attentamente il regolamento generale del forum e quello di sezione dove posti
Grazie

Per questa volta te lo sistemo io ma mi raccomando per il futuro
 
@Borghese
Da regolamento del forum, come tutti noi sei tenuto ad usare il tag
code-gif.6007
o il tag
php-png.6009
per il PHP, quando posti del codice, oppure la funzione codice dalla barra degli strumenti
box-inserisci-2-png-jpg.6008

Inoltre ti prego di leggere attentamente il regolamento generale del forum e quello di sezione dove posti
Grazie

Per questa volta te lo sistemo io ma mi raccomando per il futuro

Scusa Max! Non ricapiterà :) Grazie!
 
Mi sono letto tutto il topic, e studiato gli script. La funzione mi è chiara, ma ho alcuni dubbi :

Ho usato lo script "semplice" per l'invio :

PHP:
# http://localhost/test_site/php/test/MAIL/PHPMail_Test.php

if (isset($_POST['Submitted'])){

  // estrae e stampa variabili e valori da $_POST
  print '<table width="500" border="0" cellspacing="5" cellpadding="5">';
  while(list($chiave, $valore)=each($_POST)){
    ${$chiave}=trim(strip_tags($valore));
    print "<tr><td>".$chiave." : </td><td>".${$chiave}."</td></tr>";
  }
  print "</table>";


//  require_once 'Config_MAIL.php';    // servizi SMTP disponibili
//  SMTPservice(1);            // sceglie il servizio SMTP da usare per invio mail, da Config_MAIL.php

  // utilizza i parametri seguenti NON quelli di php.ini, solo per questo script
  ini_set("SMTP"     ,$eM_Host);
  ini_set("smtp_port",$eM_Port);
  ini_set("username" ,$eM_username);
  ini_set("password" ,$eM_password);

  // prepara e invia messaggio
  // per FROM viene usato $eM_username per evitare il rifiuto dell' invio (invece che $emailFROM)
  $eM_header = "MIME-Version: 1.0\r\n";
  $eM_header.= "Content-type: text/html; charset=utf-8\r\n";
  $eM_header.= "From: <".$eM_username.">\r\n";

  if(!empty($eM_CC1))  $eM_header.= "cc: " .$eM_CC1 ."\r\n";    // copia conoscenza
  if(!empty($eM_BCC1)) $eM_header.= "Bcc: ".$eM_BCC1."\r\n";    // copia conoscenza nascosta

  if(!empty($eM_ReplyTo)) $eM_header.= "Reply-To: ".$eM_ReplyTo."\r\n";    // rispondere a ...

  if (mail($eM_TO1, $eM_subject, $eM_body, $eM_header)) print "<b>MESSAGGIO INVIATO</b>";
  else                                                  print "<b>ERRORE : MESSAGGIO NON INVIATO</b>";

  print "<br /><br /><a href=\"PHPMail_Test.php\">RIPROVA</a>";
}
else{

  require_once 'Config_MAIL.php';    // servizi SMTP disponibili
  SMTPservice(1);            // sceglie il servizio SMTP da provare per invio mail, da Config_MAIL.php


?>
<!DOCTYPE html>
<form action="PHPMail_Test.php" method="post" enctype="multipart/form-data" name="myform" id="myform">
  <table width="500" border="0" cellspacing="5" cellpadding="5">
    <caption>&nbsp;</caption>
    <tr>
      <td colspan="2"><b>PROVA INVIO MAIL (funzione mail di php)</b></td>
    </tr>
    <tr>
      <td width="165"><label for="eM_Host">Servizio SMTP :</label></td>
      <td width="300"><input type="text" name="eM_Host" id="eM_Host" required value="<?= $eM_Host; ?>" size="50"></td>
    </tr>
    <tr>
      <td width="165"><label for="eM_Port">Porta :</label></td>
      <td width="300"><input type="text" name="eM_Port" id="eM_Port" required value="<?= $eM_Port; ?>" size="50"></td>
    </tr>
    <tr>
      <td><label for="eM_username">Utente registrato :</label></td>
      <td><input type="email" name="eM_username" id="eM_username" required value="<?= $eM_username; ?>" size="50"></td>
    </tr>
    <tr>
      <td><label for="eM_password">Password :</label></td>
      <td><input type="text" name="eM_password" id="eM_password" required value="<?= $eM_password; ?>" size="50"></td>
    </tr>
    <tr>
      <td><label for="eM_FROM">e-mail from :</label></td>
      <td><input type="email" name="eM_FROM" id="eM_FROM" required value="<?= $eM_username; ?>" size="50"></td>
    </tr>
    <tr>
      <td><label for="eM_TO1">e-mail to :</label></td>
      <td><input type="email" name="eM_TO1" id="eM_TO1" required value="<?= $eM_TO1; ?>" size="50"></td>
    </tr>
    <tr>
      <td><label for="eM_subject">Oggetto :</label></td>
      <td><input type="text" name="eM_subject" id="eM_subject" required value="oggetto per messaggio di prova" size="50"></td>
    </tr>
    <tr>
      <td><label for="eM_body">Messaggio :</label></td>
      <td><input type="text" name="eM_body" id="eM_body" required value="testo del messaggio di prova" size="50"></td>
    </tr>
    <tr>
      <td colspan="2">&nbsp;</td>
    </tr>
    <tr>
      <td colspan="2"><input name="submit" type="submit" id="submit" formaction="PHPMail_Test.php" formenctype="multipart/form-data" formmethod="POST" value="Invia"></td>
    </tr>
    <tr>
      <td colspan="2"><span class="autorizzo">Autorizzo ai sensi del D. Lgs. 30 Giugno 2003 n. 196 il trattamento dei dati personali trasmessi</span></td>
    </tr>
  </table>
  <input type="hidden" name="eM_TO2" value="">
  <input type="hidden" name="eM_CC1" value="">
  <input type="hidden" name="eM_BCC1" value="">
  <input type="hidden" name="eM_ReplyTo" value="">

  <input type="hidden" name="Submitted" value="1" />
</form>
</html>
<?PHP
}
?>

questo script, l'ho inserito dentro il codice php che richiama la compilazione del form, subito dopo la funzione di inserimento dati nel db
Ho importato anche il file Config:MAIL.php nella stessa cartella del webserver, che ha questo codie :

PHP:
<?php
function SMTPservice($service) {
  global $eM_Host,$eM_Port,$eM_Auth,$eM_Secure,$eM_username,$eM_password;

  switch ($service) {

      $eM_Host     = "smtp.gmail.com";        // ok PHPmailer
      $eM_Port     = 465;
      $eM_Auth     = true;
      $eM_Secure   = "ssl";
      $eM_username = "ilmioaccount@gmail.com";
      $eM_password = "la pwd del mio account";
      break;
  }
  return;
}
?>

Salvato tutto, ho provato a compilare il form, salvando, i dati vengono correttamente scritti nel db (come prima del resto) ma non parte alcuna mail.

Mi aiutate a capire dove e cosa sto sbagliando ?!
 
Allora, ho fatto un piccolo passo avanti :

ho scaricato il class.phpmailer.php
ho scaricato il class.smtp.php
ho scaricato un modulo di prova html
ho scaricato il file richiesta info.php contenente le impostazioni del mio accout gmail

ho messo tutto nel percorso del webserver

Ho raggiunto il modulo html via browser web, e compilando il form, ricevo correttamente la mail

Ora dovrei, "trasportare" la funzione, nel form esistente sul mio sito.
Ho provato a mettere la funzione all'inizio del form, ma non funziona :

[
mi aiutate a capire dove sbaglio ?
 
Ultima modifica:
il form deve contenere tutte le info che vuoi ottenere da chi lo compila,
quando compilato, la pressione di un tasto "submit",
richiama uno script php
che prende i dati dall'array $_POST (vedi method="POST"),
gestisce l'aggiornamento del db,
invia la mail,
quindi richiama una pagina successiva

nelle 3 righe postate, hai inserito 2 "form" con richiamati 2 script diversi
dovresti dichiarare un solo "form" e richiamare un solo script che compie le azioni sopra descritte
(vedi come sono fatti gli esempi che ti ho indicato)

considera anche che il tuo indirizzo mail, come lo hai inserito, é di fatto alla vista di tutti coloro che vogliono guardare il codice html della tua pagina, andrebbe messo nello stesso script con i parametri del provider del servizio mail
 
Uso anche io phpmailer in una form di iscrizione corsi per la conferma dei dati inseriti e funziona egregiamente, tutti i parametri lasciali a livello di php, non metterli in chiaro nella pagina html, possibilmente in un .php fuori dalla Document-Root (se usi Apache).
 
ok allora se ho capito bene :

il contenuto di richiestainfo.php lo metto dentro lo stesso script che richiama il form (Incident/Addnew.php)

Considerate che il form stesso è in php. non è in html

Per intenderci, questo è il codice del form :
[
mi è chiaro il discorso dell'indirizzo, da mettere nello script per non farlo vedere nel codice della pagina.
non mi è chiaro però come implementare il codice php del form.... mi potete aiutare per favore solo in questo ?!
 
Ultima modifica:
Ci sono riuscito !!!!!!!!!

Ho messo lo script in php di invio mail dopo il php di compilazione e ora la mail parte regolarmente.

Adesso mi basterebbe poter creare il corpo della mail con i dati appena inseriti nel db....ma sono veramente al buio!!!
 
Ultima modifica:
sempre ripreso dall'esempio con phpmailer,
PHP:
// ----- impostazione del messaggio
    $mail->WordWrap   = 80;     // set word wrap
    $mail->IsHTML(true);        // send as HTML

    $eM_body  ="<p>questo é il corpo del mio messaggio</p>";
    $eM_body .="<p>a cui aggiungo il valore che viene dal form " . $_POST['nome'] . "</p>";

    $mail->Subject = "qui ci metto l'oggetto seguito dalla data e ora di invio" . date('d-m-Y H:i:s');

    $mail->Body    = $eM_body;
 
Marino GRAZIE!!!!
Ora sono riuscito a ottenere un corpo mail abbastanza pulito, ordinato, e leggibile. Ho messo i campi salienti nell'oggetto, e tutto il resto che viene dal form nel body

Adesso mi rimane da fare solo una cosa :

Ho dei campi nel form, che in realtà nel db scrivono un valore numerico, spiego meglio :

Facciamo finta che nel form ci sia una domanda tipo : "Che priorità dai all'amore ?" risposte : "HIGH" "MEDIUM" "LOW"

Ora, lo script php, nel db non mi scrive high, medium o low, ma 1 (se high) 2 se (medium) e 3 (se low)

Chiaramente adesso, se richiamo il campo del form con lo script di phpmailer, nella mail mi ritrovo 1, 2 o 3

Come faccio a dirgli, in quello script, se leggi 1 restituiscimi HIGH, 2 Medium e cosi via ?

Ho provato con la funzione IF/Else ma non mi esce....
 
puoi evitare if/else con questo codice,
PHP:
$priorita = array( 1 => "HIGH", 2 => "MEDIUM", 3 => "LOW" );

echo $priorita[2];

con il risultato

upload_2019-2-6_8-47-50.png
 
Ultima modifica:
Grazie Marino, ma niente da fare. Ci ho provato in tutti i modi, ma o non và a buon fine la compilazione del form (pagina bianca) o la mail non viene spedita.
Così è come ho messo lo script, sbaglio qualcosa :
 
Ultima modifica:
dovresti imparare a leggere il log degli errori di php
perché ci sono diversi errori nello script che hai postato,
confronta con lo script che segue per avere almeno l'idea di dove sono gli errori

per inviare posta con gmail ho sempre usato porta 465 e crittografia ssl non proprio ciò che hai messo nel tuo script
PHP:
<?php

    $priorita = array( 1 => "HIGH", 2 => "MEDIUM", 3 => "LOW" );

  // recupero i dati dai campi del form
    $to               = $_POST['destinatario'];     
    $from             = $_POST['mittente'];
    $INCIDENT         = $_POST['Ticket'];
    $AREA             = $_POST['Area'];
    $SERVIZIO         = $_POST['Servizio'];
    $INDICEPRIORITA   = $_POST['Priorita'];


  // richiamo la funzione phpmailer che avr? caricato sul mio server
  // require_once('class.phpmailer.php');
     require_once 'PHPMailer/PHPMailerAutoload.php';

    $mail = new PHPMailer(false);

    $mail->SMTPDebug = 0;

    $mail->IsSMTP();
    $mail->IsHTML(true);
    
    $mail->WordWrap   = 80;
    
    try {
      $mail->Host       = "smtp.gmail.com";
      $mail->Port       = 465;
      $mail->SMTPAuth   = true;
      $mail->SMTPSecure = "ssl";
      $mail->Username   = "CAMBIAMI@gmail.com";
      $mail->Password   = "CAMBIAMI";

      $mail->SetFrom($from, $from);
      $mail->AddReplyTo($from, $from);
      $mail->AddAddress($to);


      $mail->Subject = $INCIDENT . " - " . $SERVIZIO . " - " . $Priorita[$INDICEPRIORITA];

      $eM_body  ="<p>Control Room Web Portal - Nuovo Incident :</p>";
      $eM_body .="<p>Area : $AREA<br>Tipologia Fault : $TOPOLOGIA_FAULT<br>Tipologia Cliente : $Tipo_cliente<br>Urgenza : $Urgenza<br><div>Descrizione Incident : $Descrizione<br><br>Aperto da : $User_Open" . $_POST['nome'] . "</p>";

      $mail->Body    = $eM_body;

      $mail->AltBody = $INCIDENT . " - " . $SERVIZIO . " - " . $Priorita[$INDICEPRIORITA];

      $ris = $mail->Send();
    }
    catch (phpmailerException $e) { echo $e->errorMessage(); } // PHPMailer error messages
    catch (Exception $e)          { echo $e->getMessage(); }   // anything else error messages
 
  if($ris) { echo "<h2>Il tuo messaggio ? stato inviato correttamente.</h2>"; }
  else     { echo "<br /><br />Ritenta l?invio tornando alla pagina del modulo."; }
?>

questo é il risultato

upload_2019-2-7_20-36-27.png
 

Discussioni simili