Valutazione 4.87/ 5 (100.00%) 5838 voti

Condividi:        

[PHP]Sendmail

Problemi di HTML? Di PHP, ASP, .NET, JSP, Perl, SQL, JavaScript, Visual Basic..?
Vuoi realizzare programmi in C, C++, Java, Ruby o Smalltalk, e non sai da che parte cominciare?
Entra qui e troverai le risposte!

Moderatori: Triumph Of Steel, archimede

[PHP]Sendmail

Postdi romand700 » 06/07/06 22:59

Salve,
ho un modulo di invio mail nel mio sito e il codice è il seguente:
<form action="sendmail.php" method="POST" name="form_contatti">
<input type="text" name="Nome_Azienda" class="form_5">
<input name="Email1" type="text" class="form_7">
<textarea name="Dettagli" cols="20" rows="20" class="form_9"></textarea>
<input name="button1" type="button" class="form_10" onClick="SubmitForm1()" value="Invia"> //pulsante di invio

(nel pulsante invio c'è SubmitForm1() che è una funzione javascript per validare i campi obligatori)

e questa è la pagina sendmail.php
<?php

// L'INDIRIZZO DEL DESTINATARIO DELLA MAIL
$to = "mia email dove mi arriva la posta";

// IL SOGGETTO DELLA MAIL
$subject = "Modulo Preventivi";

// COSTRUISCO IL CORPO DEL MESSAGGIO
$body = "Contenuto del modulo:\n\n";
$body .= "Nome Azienda: " . trim(stripslashes($_POST["Nome_Azienda"])) . "\n";
$body .= "Email1: " . trim(stripslashes($_POST["Email1"])) . "\n";
$body .= "Dettagli: " . trim(stripslashes($_POST["Dettagli"])) . "\n";

// INTESTAZIONI SUPPLEMENTARI
$intmail = "From: <" . ($_POST["Email1"]) . ">";

// INVIO DELLA MAIL
if(@mail($to, $subject, $body, $intmail)) { // SE L'INOLTRO E' ANDATO A BUON FINE...

echo "Modulo inoltrato con successo.";

} else {// ALTRIMENTI...

echo "Si sono verificati dei problemi nell'invio della mail.";

}

?>
Il mio problema è che quando clicco sul pulsante invio mi si apre la finestra sendmail.php mentre vorrei che i ringraziamenti o modulo inviato con successo lo possa mettere nella stessa finestra del modulo, ripeto senza che mi si apre la finestra dove ho impostate tutte le variabili della pagina.php (sendmail.php).
Per capirci cliccando sul pulsante invio del modulo mi si deve aprire la stessa finestra tipo in modalità SELF con appunto la dicitura di ringraziamenti o modulo inviato che io vado a mettere in qualsiasi parte della pagina.
Potete aiutarmi?
Grazie anticipatamente.
romand700
Utente Junior
 
Post: 77
Iscritto il: 06/07/06 22:36

Sponsor
 

Postdi Triumph Of Steel » 06/07/06 23:11

mmh mi vengono in mente 2 modi per ora..

1. Fai un redirect ad un'altra pagina dopo il sendmail
2. usi un IF nella stessa pagina, controllando che il form sia stato inviato.
ad esempio, nel form metti una variabile nascosta (type="hidden"), e fai

Codice: Seleziona tutto
if ($_POST['variabileHidden'] != "") ... ecc.

allora invia il form, e
Codice: Seleziona tutto
echo "grazie!";

è chiaro che se uno preme refresh del browser, ti arriva un'altra mail, e così finche l'utente si stanca. Nel caso setta una variabile $_SESSION e controlli che (prima di inviare la mail) sia vuota (e quindi invii), e se invece è piena, no (ha già inviato)!
Avatar utente
Triumph Of Steel
Moderatore
 
Post: 7852
Iscritto il: 22/08/01 01:00

sendmail

Postdi romand700 » 06/07/06 23:29

grazie per la celerità nel rispondere ma sinceramente(anche se dal post non sembra) non è tanto che mi sono avvicinato al php e quindi non credo di aver capito bene quello che intendi dire.

Potresti farmi un es. più chiaro? (se puoi)

Grazie come sempre anticipatamente

P.S. Avevo già provato con un altro metodo e difatti presentandomi il problema del refresh (come hai giustamente te detto) ho abbandonato.
Mi arriverebbero molte email in bianco.
romand700
Utente Junior
 
Post: 77
Iscritto il: 06/07/06 22:36

Postdi romand700 » 06/07/06 23:41

Pensando bene il redirect ci posso arrivare però sempre ad un altra pagina devo puntare. Mentre io i ringraziamenti li vorrei mettere sempre nella stessa pagina dove c'è il modulo.
Per farti capire cosa intendo vai su questo sito e prova a riempire il modulo contatti tanto non ti chiede di validare l'email puoi inserire i campi a caso, cosi ti rendi conto cosa intendo.
http://www.account.it
sezione contatti
riempi il form e vedi che nella stessa pagina ti dice in alto modulo inviato con successo e nel mentre pulisce i campi
Il sito e in php

Grazie di nuovo
romand700
Utente Junior
 
Post: 77
Iscritto il: 06/07/06 22:36

Postdi romand700 » 07/07/06 12:02

Avete qualche soluzione? O mi devo rassegnare al redirect?(che non vorrei usare)
Ripeto come esempio potete vedere come reagisce il modulo contatti di http://www.account.it

Grazie di nuovo.

Saluti. Andrea
romand700
Utente Junior
 
Post: 77
Iscritto il: 06/07/06 22:36

Postdi Triumph Of Steel » 07/07/06 12:08

allora è la seconda soluzione che ti ho detto.
per farla semplice:

- Inserisci un campo nascosto nel form
Codice: Seleziona tutto
<input type="hidden" name="formSubmit" value="1">


nella pagina PHP che contiene il form, fai:

Codice: Seleziona tutto
<form ... ecc>

<?php

// Controlla che il form sia inviato
if (isset($_POST['formSubmit']) && $_POST['formSubmit'] == 1) {
   // controlla che non abbia già inviato il form 1 volta
   if (isset($_SESSION['formInviato']) && $_SESSION['formInviato'] == 1) {
      // L'utente ha già inviato la mail
      echo "Hai già inviato la mail!";
   } else {
      // codice che invia la mail
      echo "Grazie!";
      // imposta una sessione per non inviare form con refresh
      $_SESSION['formInviato'] = 1;
   }
}

?>

non lo ho testo, provalo :)
Avatar utente
Triumph Of Steel
Moderatore
 
Post: 7852
Iscritto il: 22/08/01 01:00

Postdi romand700 » 07/07/06 12:40

sto cercando di capire. Scusa una cosa ma con:
<form action="sendmail.php" method="POST" name="form_contatti">

....e

</form>
che ci faccio? comunque se lascio queste impostazioni quando clicco sul pulsante invia mi passa alla pagina sendmail.php

Non riesco proprio a capire. :eeh:

Grazie della tua pazienza.
romand700
Utente Junior
 
Post: 77
Iscritto il: 06/07/06 22:36

Postdi Triumph Of Steel » 07/07/06 17:27

l'action del form lo devi dare sempre alla stessa pagina...
in pratica ti trovi con 1 pagina sola, che ha sia il FORM che la funzione di invio mail..

ti prendi quello che hai nella pagina sendmail.php, e lo inserisci nella pagina dove hai il form, dove c'è il commento

Codice: Seleziona tutto
// codice che invia la mail
Avatar utente
Triumph Of Steel
Moderatore
 
Post: 7852
Iscritto il: 22/08/01 01:00

Postdi romand700 » 07/07/06 19:34

scusami ci sono quasi ma non invia nessuna mail ti posto il codice completo

Funzione che valida i 3 campi in java
Codice: Seleziona tutto
<script language="JavaScript" type="text/javascript">
function validateForm(){
var f = document.form_contatti
   if(f.Nome.value==""){
      alert("Attenzione: Inserire un Nome!")
      f.Nome.focus()
      return false
   }
   if (isEmail(f.Email.value) == 0) {
      alert("Attenzione: Inserire un indirizzo E-mail valido!")
      f.Email.focus()
      return false
   }
   if(f.Descrizione.value==""){
      alert("Attenzione: Scrivi una descrizione!")
      f.Descrizione.focus()
      return false
   }
   return true
}
function SubmitForm() {
   if(validateForm()){
      document.form_contatti.submit()
   }
}
</script>


Nella stessa pagina sotto ho il codice php in questione compreso il tuo frammento di codice.
IL problema sicuramente deve stare nel pezzo di codice tuo, nel senso che non so in SubmitForm e Form Inviato che ci devo mettere.
Codice: Seleziona tutto
<form action="Contatti.php" method="POST" name="form_contatti">
<?php
  // Controlla che il form sia inviato
if (isset($_POST['SubmitForm']) && $_POST['SubmitForm'] == 1) {
   // controlla che non abbia già inviato il form 1 volta
   if (isset($_SESSION['formInviato']) && $_SESSION['formInviato'] == 1) {
      // L'utente ha già inviato la mail
      echo "Hai già inviato la mail!";
   } else {
      // codice che invia la mail
      // L'INDIRIZZO DEL DESTINATARIO DELLA MAIl
$to = "mio indirizzo

// IL SOGGETTO DELLA MAIL
$subject = "Modulo Contatti";

// COSTRUISCO IL CORPO DEL MESSAGGIO
$body = "Contenuto del modulo:\n\n";
$body .= "Nome: " . trim(stripslashes($_POST["Nome"])) . "\n";
$body .= "Email: " . trim(stripslashes($_POST["Email"])) . "\n";
$body .= "Descrizione: " . trim(stripslashes($_POST["Descrizione"])) . "\n";

// INTESTAZIONI SUPPLEMENTARI
$intmail = "From: <" . ($_POST["Email"]) . ">";

// INVIO DELLA MAIL[/color]

@mail($to, $subject, $body, $intmail);
          echo "Grazie!";
      // imposta una sessione per non inviare form con refresh
      $_SESSION['formInviato'] = 1;
   }
}

?>
<input type="text"  name="Nome" class="form_1">
<input type="text"  name="Email" class="form_1">
<textarea name="Descrizione" cols="20" rows="20" class="form_2"></textarea>

//richiamo la funzione java per validare i campi e invia il form
<input name="button" type="button" class="form_10" onClick="SubmitForm()" value=" Invia ">


Scusa per il disturbo ma sono nottate che ci sbatto la testa. Specialmente sul fatto del refresh che reinvia la mail in bianco.

Grazie come semre anticipatamente.

Andrea
romand700
Utente Junior
 
Post: 77
Iscritto il: 06/07/06 22:36

Postdi romand700 » 07/07/06 20:02

Dimenticavo, ovviamente il campo nascosto come da tuo suggerimento è inserito in una parte della pagina
Codice: Seleziona tutto
<input type="hidden" name="formSubmit" value="1">


Grazie. Andrea
romand700
Utente Junior
 
Post: 77
Iscritto il: 06/07/06 22:36

Postdi romand700 » 07/07/06 20:53

allora problema dell'invio mail risolto, avevo scambiato formsubmit e submitform, soltanto che continuano ad arrivare email sul refresh, come se non vedesse
Codice: Seleziona tutto
if (isset($_SESSION['formInviato']) && $_SESSION['formInviato'] == 1) {
      // L'utente ha già inviato la mail
      echo "Hai già inviato la mail!"; ecc...
romand700
Utente Junior
 
Post: 77
Iscritto il: 06/07/06 22:36

Postdi Triumph Of Steel » 07/07/06 21:55

ehmm.. scusa mi sa che ho dimenticato un pezzo..
prima di tutto il codice (anche quello HTML), inserisci

Codice: Seleziona tutto
<?php session_start();?>

e poi tutto il resto :P
Avatar utente
Triumph Of Steel
Moderatore
 
Post: 7852
Iscritto il: 22/08/01 01:00

Postdi romand700 » 07/07/06 22:14

6 un grande. A miticoooooooo... :lol:

Ciao e di nuovo grazie

Funziona tutto.

Ultima chicca se possibile.
Non so se mi spiego bene ma ci provo.
In questa pagina contatti.php è possibile nel punto dove mi hai detto te:
Codice: Seleziona tutto
  } else {
      // codice che invia la mail
      echo "Grazie!";

per evitare di mettere tutto il codice, in questo punto dove dici te //codice che invia la mail, esiste una funzione php che si chiama una pagina esterna che contiene il codice e la legge?
Dico questo per evitare che se uno apre il codice sorgente della pagina vede lo script con in quel punto impostata la mia mail che vorrei tenere nascosta.

Solo se è una cosa semplice, altrimenti ti ringrazio e magari ci si sente per il prossimo intoppo (spero di averne sempre di meno).
romand700
Utente Junior
 
Post: 77
Iscritto il: 06/07/06 22:36

Postdi romand700 » 07/07/06 22:31

Opsss :oops: Triumph Of Steel scusami tanto nella pagina non si vede il codice php :P , pensavo che se uno cliccasse sul sorgente della pagina si vedesse. Tutto ok.

Grazie ancora.

Andrea
romand700
Utente Junior
 
Post: 77
Iscritto il: 06/07/06 22:36

Postdi Triumph Of Steel » 07/07/06 23:30

beh cmq l'idea non è male..
ti puoi creare una funzione che invia una mail, passandogli dei parametri, in modo da usarla ovunque e quando vuoi
Codice: Seleziona tutto
function sendMail($from,$to,$subject,$body,$headers) {


ancora meglio, esistono delle classi ... su phpclasses.org ne trovi un po', anche che permettono l'invio di mail con allegati. :)

ricordati di fare nella pagina dove richiami la funzione/classe
Codice: Seleziona tutto
include("nomePagina.php")
Avatar utente
Triumph Of Steel
Moderatore
 
Post: 7852
Iscritto il: 22/08/01 01:00

Postdi romand700 » 08/07/06 00:24

Ancora grazie per la dritta certo sarebbe la cosa migliore anche perchè nello stessa pagina ho 2 form (uno addirittura è a 20 campi per richiesta preventivi) e quindi mi rimarrebbe comodissima però :( le classi le mastico poco e non mi va di romperti troppo. Da solo ci starei sicuro qualche nottata a combatterci.

Piccolo quesito:
lo script come detto in precedenza funziona, però come non spedisce la mail con il refresh non la spedisce neanche se un utente vuole inviarne 2 di seguito.
Mi spiego:
se uno mi manda una mail e poi si accorge magari di aver sbagliato e vuole inviarmene un altra a me la seconda non mi arriva perchè c'è
Codice: Seleziona tutto
if (isset($_SESSION['formInviato']) && $_SESSION['formInviato'] == 1) ecc..(se non vado errato)

Quindi lui è convinto di averla reinviata ma in realta a me non arriva.

Mi confermi sta cosa o sto prendendo un abbaglio io?

Grazie.
Andrea
romand700
Utente Junior
 
Post: 77
Iscritto il: 06/07/06 22:36

Postdi Triumph Of Steel » 08/07/06 08:27

è vero..
potresti mettere un link "Invia un'altra mail", che punta sempre alla stessa pagina.
Il link è tipo
Codice: Seleziona tutto
<a href="pagina.php?altra=1">Invia un'altra mail</a>

Nel codice della pagina metti (oltre al link)
Codice: Seleziona tutto
if (isset($_REQUEST['altra']) && $_REQUEST['altra'] == 1) {
      $_SESSION['formInviato'] = 0;
}

questo prima di tutto (dopo il session_start() diciamo :))
Avatar utente
Triumph Of Steel
Moderatore
 
Post: 7852
Iscritto il: 22/08/01 01:00

Postdi romand700 » 08/07/06 09:17

:lol: a fenomenoooooooooo funziona e anche alla grande. il link l'ho messo dove prima c'era hai gia inviato una mail e va alla stragrande:
Codice: Seleziona tutto
if (isset($_SESSION['formInviato']) && $_SESSION['formInviato'] == 1) {
      // L'utente ha già inviato la mail
     // echo "Hai già inviato la mail!";
    echo"<a href='pagina.php?altra=1'>Prima di poter inviare un'altra mail clicca qui</a>"


Alla prossima che credo non tarderà perchè sei un un grande.
Ma dimmi una cosa, da quanto tempo è che mastichi il php?

ciao. Andrea
romand700
Utente Junior
 
Post: 77
Iscritto il: 06/07/06 22:36

Postdi Triumph Of Steel » 09/07/06 10:05

boh.. saranno 4 o 5 anni...
ma lo sto usando molto negli ultimi 2 anni o poco meno...
Avatar utente
Triumph Of Steel
Moderatore
 
Post: 7852
Iscritto il: 22/08/01 01:00


Torna a Programmazione


Topic correlati a "[PHP]Sendmail":

Sendmail non funziona +
Autore: fe_caesar
Forum: Software Linux
Risposte: 3

Chi c’è in linea

Visitano il forum: Nessuno e 6 ospiti