- Home
- Categorie
- Coding e Sistemistica
- PHP
- Creare un form con mail che invia una richiesta
-
Creare un form con mail che invia una richiesta
Salve a tutti,
è da poco che bazzico su questo forum ed è questa la prima volta che scrivo in questa sezione.Tutto il mondo della creazione di siti mi è alquanto oscuro, ma in maniera particolare tutto ciò che ha a che vedere con la programmazione.
Scrivo per chiedere un aiuto o anche solo un buon consiglio:
vorrei creare un form su alcune pagine del mio sito che funzioni più o meno in questo modo:
- io promuovo una serie di piccoli e-book
- un utente accede alla pagina e trova un form che gli chiede:
nome, cognome, provincia, mail - un tasto che gli dice che se si iscrive ad una mailing list sarà automaticamente aggiornato su tutti gli e-book che pubblicherò (per invogliarlo ad iscriversi)
- in automatico mi parte una mail con il link dell'e-book
- lui viene reindirizzato su una pagina di ringraziamento
- una volta al mese gli arriva una mail con i link dei nuovi e-book
So che in mezzo a questa richiesta ci sono vari argomenti, non tutti trattabili in questa sezione.
Ho scritto tutto per rendere più facile la comprensione generale.
Esaurito un aspetto, aprirò un altro topic nella sezione adatta per affrontarne un altro.Nello specifico qui chiedo dove e come reperire un modulo, se bisogna farne uno personalizzato o se si possono trovare di personalizzabili
grazie mille
rafa
-
Ciao pinokkietto,
come hai ben detto sono più argomentazioni, ma con un po' di buona volontà e pazienza vedrai che riuscirai a venirne a capo.Intanto posso segnalarti due discussioni presenti nella sottosezione Scripting e Risorse utili.
Uno per l'invio di mail tramite form, che trovi quì.
L'altro per l'invio di newsletter, con utilizzo di un Db MySQL, quì (eventualmente è presente anche una versione che non utilizza l'appoggio del Db, quì).Alcuni aspetti da te citati probabilmente andranno ricercati in altri script presenti in sezione o puoi provare ad usufruire anche della sottosezione Funzioni di PHP.
Spero di esserti stato utile e che riuscirai nel tuo intento.
Per chiarimenti, siam sempre quì.
-
Innanzitutto ti ringrazio per le tue segnalazioni, che ho letto e sto leggendo con molto interesse ma, ahimè, non credo di riuscirne a capire molto.
In ogni caso approfitto ancora della tua disponibilità per chiederti un aiuto, questa volta un pelino più mirato:
in rete sono riuscito a trovare un form e sono riuscito a modificarlo in base alle mie esigenze. Quello che adesso mi manca è l'implementazione del file .php ad esso associato, per far funzionare il tutto al meglio.
Mi spiego:
-
questo è il form: [...]
collegato al file inviamail.php -
ho bisogno di inserire questo form in più pagine per rendere disponibile il download di più contenuti: pagina 1 con contenuto 1, pagina 2 con contenuto 2 e così via.
-
ho bisogno anche che il form mandi la mail con oggetto1 se si trova su pagina1, oggetto2 se si trova su pagina2 e oggetto3 se si trova su pagina 3
La cosa è possibile con una semplice stringa da inserire nel file .php oppure è necessario avere un file .php per ogni pagina?
Io, sguazzando nella mia ignoranza, ho pensato che potesse esistere una soluzione, ma le mie sono solo speculazioni filosoficheggianti:
- ho pensato che fosse possibile inserire una stringa, magari non visibile, all'interno della pagina che contiene il form e far si che, di volta in volta, il file php vada a leggersi quella stringa, così se su pagina 1 inserisco il form e nel form compilo laa stringa "oggetto1", la mail inviata dal form avrà quell'oggetto..
Se po' fa?!
In ogni caso, grazie mille
rafa
-
-
E ti dirò che hai pensato bene!!
Basta inserire nel form un hidden data che punti al contenuto interessato a quella pagina:
[html]<input type="hidden" name="object" value="1">[/html]Insieme agli altri dati, nel file .php, recuperi anche il valore di object ed a seconda del suo valore ti gestirai il link e l'oggetto della mail.Ti faccio un esempio molto semplice di come poter fare:
[php]<?php
$object="";
$object=$_POST['object'];
switch ($object){
case 1:
$object_mail="Oggetto mail prodotto 1";
$link="vvv.nomesito.ext/indirizzoprodotto1";
break;
case 2:
$object_mail="Oggetto mail prodotto 2";
$link="vvv.nomesito.ext/indirizzoprodotto2";
break;
case 3:
$object_mail="Oggetto mail prodotto 3";
$link="vvv.nomesito.ext/indirizzoprodotto3";
break;
........
case n:
$object_mail="Oggetto mail prodotto n";
$link="vvv.nomesito.ext/indirizzoprodotton";
break;
}
?>[/php]Così avrai valorizzato l'oggetto della mail ed il link da includere nella mail a seconda del valore ricevuto dal form tramite l'hidden data.
-
Samyorn innanzitutto ti ringrazio, perchè so che mi hai dato un grande aiuto. Purtroppo per me, però, in queste cose vado un po' preso per mano perchè proprio non ne capisco:
-
inserendo la stringa "hidden" nel form, al posto di "object", devo scrivere l'oggetto della mail?
Quel "value=1" si riferisce a qualcosa del tipo "1=acceso" "0=spento" oppure è il testo che inserisco in questo campo a diventare poi l'oggetto della mail? -
il codice php che mi hai indicato, sta a significare: se l'input arriva da pagina1 rispondi con Oggetto1, se arriva da pagina2 rispondi con Oggetto2 etc ?
Scusami samyorn per la mia incompetenza.
rafa
-
-
Aggiungo che ho provato diverse combinazioni, ma nessuna mi funziona:
ricevo una mail senza alcun oggetto.rafa
-
Ciao pinokkietto,
non hai nulla di cui scusarti, tranquillo.Il funzionamento dell'input "hidden" è similare agli altri innput presenti nel tuo form, uniche differenze: non è visibile e, nel tuo caso, è pre-valorizzato.
Portandoti un semplice esempio, ammettiamo che questo sia il tuo form:
[html]<form name="form" method="POST" action="inviamail.php">
<input type="text" name="nome" value="" />
<input type="text" name="email" value="" />
<input type="hidden" name="object" value="1" />
<input type="submit" value="Invia" />
</form>[/html]
Object è il nome dell'elemento da recuperare e value è il suo valore, in questo caso identifica la pagina1, nella pagina2 inserirai il value="2":
[html]<form name="form" method="POST" action="inviamail.php">
<input type="text" name="nome" value="" />
<input type="text" name="email" value="" />
<input type="hidden" name="object" value="2" />
<input type="submit" value="Invia" />
</form>[/html]
Sul file inviamail.php recuperi tutti i dati inviati dal form:
[PHP]<?php
$nome="";
$email="";
$object="";
$nome=$_POST['nome'];
$email=$_POST['email'];
$object=$_POST['object'];
?>[/PHP]In questo modo avrai all'interno delle variabili $nome, $email ed $object i relativi dati ottenuti dal form. Solo che a seconda della pagina da dove viene trasmesso il form tu vuoi che vari l'oggetto della mail ed il link all'e-book.
Questo lo puoi fare utilizzando la funzione switch() che, a seconda del valore di $object, eseguirà le istruzioni da te impostate, ovvero valorizzare l'oggetto della mail ed il link all'e-book
[PHP]<?php
switch ($object){
case 1:
$object_mail="Oggetto mail prodotto 1";
$link="vvv.nomesito.ext/indirizzoprodotto1";
break;
case 2:
$object_mail="Oggetto mail prodotto 2";
$link="vvv.nomesito.ext/indirizzoprodotto2";
break;
case 3:
$object_mail="Oggetto mail prodotto 3";
$link="vvv.nomesito.ext/indirizzoprodotto3";
break;
........
case n:
$object_mail="Oggetto mail prodotto n";
$link="vvv.nomesito.ext/indirizzoprodotton";
break;
}
?>[/PHP]
case 1 significa: "quando il valore di $object è uguale a 1" e così via.A questo punto avrai la variabile $object_mail che conterrà l'oggetto della mail relativo alla pagina da cui è stato inviato il form e la variabile $link che conterrà il link dell'e-book, sempre relativo alla pagina da cui è stato inviato il form. (Questi valori li devi ovviamente impostare tu case per case. )
Sostituisci l'oggetto del tuo script mail con la variabile $object_mail ed inserisci nel testo della mail la variabile $link ed il gioco è, quasi, fatto.Nel precedente post mi son dimenticato di linkarti anche alcune FAQ presenti, quì.
Spero di esser stato chiaro.
-
Io sono più che sicuro che tu sia stato molto chiaro, ma io non riesco a farlo funzionare:
ti allego il testo del mio form e quello del mio php, così mi dici cosa di preciso ho sbagliato. Premetto che il form l'ho scaricato, quindi ci sono anche delle indicazioni che, comunque, non mi sono bastate.. per questo chiedo scusa, perchè quando uno è tardo di comprendonio diventa pure scocciante!
Ecco i miei file:
la prima parte del form:
<table border="0" width="540" height="420" cellspacing="0" cellpadding="0" background="http://www.giorgiotave.it/forum/images/contenuti/cornice_form.png" style="background-repeat:no-repeat">
<tr>
<td width="100%"><div align="center"><center><table border="0" width="100%">
<tr>
<td align="center" valign="top" rowspan="2" width="90%">
<form name="modulo" method="post" action="inviamail.php">
<input type="hidden" name="object" value="1" />Il file .php:
//(3) oggetto del messaggio
//$oggetto_email = "";
$object="";
$object=$_POST['object'];
switch ($object){
case 1:
$object_mail="Oggetto mail prodotto 1";
$link="vvv.nomesito.ext/indirizzoprodotto1";
break;
case 2:
$object_mail="Oggetto mail prodotto 2";
$link="vvv.nomesito.ext/indirizzoprodotto2";
break;
case 3:
$object_mail="Oggetto mail prodotto 3";
$link="vvv.nomesito.ext/indirizzoprodotto3";
break;}
Le parti in corsivo sono quelle che c'erano nel file scaricato. I 2 slash in neretto li ho aggiunti io per sostituire quella riga con le righe che mi hai dato tu.
Di sicuro ho omesso qualche elemento di sintassi o roba simile, perchè la mail mi arriva sempre senza oggetto.
Rafa
-
Prova a postare il form completo ed il file .php dove c'è la funzione mail() così vediamo come sistemarle.
-
Samyorn io ti ringrazio davvero tanto, per tutto il tempo che mi stai deidcando e per l'onestà che mi hai dimostrato nello scambio di messaggi.
Stavo copiando il codice del file .php per postartelo quando mi sono accorto, ahimè per la prima volta soltanto adesso, che alla fine del file c'era un richiamo alla variabile "object_mail".
Ho sistemato quella, che nella versione originale del file si chiamava "oggetto_mail" ed è andato, finalmente, tutto liscio.
Adesso non mi resta che, si fa per dire, che mettere su tutto l'ambaradan necessario per creare un sistema che mi salvi i dati delle mail in un database e che mi faccia da risponditore automatico all'arrivo delle mail da parte dei form.
Ma per questo, mi sa, che mi conviene aprire un altro topic.
Grazie mille e a buon rendere.
Rafa
-
Ciao pinokkietto,
se sei daccordo potremmo continuare su questo thread per implementare l'inserimento dei dati sul Db dato che riguarda lo stesso file .php di elaborazione. Poi se approdiamo, sempre con il tuo consenso, potremmo fare un ritocchino al Titolo della discussione e spostarla in Script e Risorse utili. Sarà di certo un enorme aiuto a tutta l'utenza del Forum.P.S. ho un paio di giorni di fuoco, non preoccuparti se non rispondo in breve tempo.
-
Ovvio che sono d'accordo.
Pensavo di chiudere la discussione solo perchè non volevo andare troppo OT, ma se ritieni che cambiandole il titolo e posizionandola in una sezione più adeguata possa essere d'aiuto ad altri, fa pure.
A questo punto ne approfitto per fare un'altra domanda:
ad essere sinceri io non capisco come il modulo possa inviare una mail, cioè come faccia a farlo senza collegarsi ad un server SMTP o qualcosa comunque che gli consenta l'invio. Ma, visto che lo fa (ogni tanto bisogna accontentarsi della "fede"), mi chiedevo se, addirittura, si poteva configurare qualcosa che fungesse anche da autorisponditore. Mi spiego meglio:
- Attualmente cliccando sul tasto "invia" del form, io ricevo una mail con i dati inseriti nel form e con l'oggetto che riesco ad ottenere grazie al giochetto mostrato da Samyorn
E' possibile fare in modo che le mail inviate siano 2, una a me con i dati inseriti nel form, ed una all'email inserita nel form con un testo preimpostato? Ovviamente recuperando in entrambi i casi gli oggetti personalizzati
In questo modo la ricezione del link dove poter scaricare il contenuto gratuito sarebbe pressapoco immediata e non ci sarebbe bisogno di implementare un autorisponditore con le opportune regole.
rafa
-
@pinokkietto said:
Pensavo di chiudere la discussione solo perchè non volevo andare troppo OT, ma se ritieni che cambiandole il titolo e posizionandola in una sezione più adeguata possa essere d'aiuto ad altri, fa pure.
Riguardando la stessa elaborazione di dati troviamo più opportuno ed utile fare tutto nella stessa discussione.@pinokkietto said:
.. ad essere sinceri io non capisco come il modulo possa inviare una mail, cioè come faccia a farlo senza collegarsi ad un server SMTP o qualcosa comunque che gli consenta l'invio. Ma, visto che lo fa (ogni tanto bisogna accontentarsi della "fede"), mi chiedevo se, addirittura, si poteva configurare qualcosa che fungesse anche da autorisponditore.
Nessun mistero della "fede", basta che guardì quì.Esistono ovviamente funzioni che utilizzano una connessione ad un server SMTP, e di certo sarebbe molto più idoneo, sicuro e, in molti casi, ti potrebbe evitare, o diminuire, la possibilità di finire in SPAM. Ma sono settaggi un po' più complessi. Puoi iniziare comunque a dare un'occhiata quì.
@pinokkietto said:
E' possibile fare in modo che le mail inviate siano 2, una a me con i dati inseriti nel form, ed una all'email inserita nel form con un testo preimpostato? Ovviamente recuperando in entrambi i casi gli oggetti personalizzati
Basta replicare la riga dove trovi la funzione mail() e sostituire la tua mail con quella ricevuta dal form che, nell'esempio precedente, è contenuta nella variabile $email.
-
Sam mi piace che la fai così facile, perchè è evidente che mostri fiducia in me.. ma mi dispiace doverti deludere.
Cioè, non ci ho neanche provato perchè credo che farei un casino, però sono convinto che inviare la seconda mail facendo quello che mi stai dicendo sia anche piuttosto facile. Ma implementare la seconda mail con un testo preimpostato mi sembra sia davvero qualcosa al limite del "malefico"..
Quindi pensavo: non è che per caso potrebbe essere una strada migliore associare una seconda "action" al form facendo riferimento ad un secondo file inviamail.php, in modo da pote configurare i due file in maniera distinta e separata tra di loro??
Capisco che potrebbe non essere la soluzione meglio ottimizzata, ma se fosse, tra le varie opzioni, quella più semplice da realizzare, io sarei contentissimo così.
Rafa
-
Ciao Rafa,
posta il contenuto del file inviamail.php, includendo tutto il codice tra i tag [php] (Questa iconcina che trovi nella modalità avanzata dell'editor)Vedrai che non c'è nulla di difficile, quindi abbi fiducia in te, più che in me, nel caso puoi sempre lavorare su una copia del file così se qualcosa va male hai sempre modo di ripristinare.
-
Ok, ci provo
[php]
<?php
$email=$_POST['email'];#######################################
IMPOSTAZIONI DA CONFIGURARE
#######################################
//(1) indirizzo email del destinatario del modulo
$destinatario = "[email protected]";//(2) indirizzo email del mittente, campo FROM
// non toccare se desiderate che l'indirizzo email inserito nel modulo sia
// riportato nel campo DA del messaggio che sarà ricevuto.
// Se invece desiderate un campo fisso annullare la prima riga e abilitare
// la seconda inserendo la dicitura desiderata (per annullare mettere //
// all'inizio della prima riga e per abilitare togliere // dalla seconda riga)
$nome_mittente = "$email";
// $nome_mittente = "Dal Modulo";//(3) oggetto del messaggio;
$object="";
$object=$_POST['object'];
switch ($object){
case 1:
$object_mail="Oggetto mail prodotto 1";
$link="vvv.nomesito.ext/indirizzoprodotto1";
break;
case 2:
$object_mail="Oggetto mail prodotto 2";
$link="vvv.nomesito.ext/indirizzoprodotto2";
break;
case 3:
$object_mail="Oggetto mail prodotto 3";
$link="vvv.nomesito.ext/indirizzoprodotto3";
break;}
$all_free = "n";
$campi_req = array("nome","email","citta","prov");
$obbligo_email = "y";
$accetta_condizioni = "y";
//(8) URL della pagina di ringraziamento
$pagina_grazie = "vvv.dominio.ext/contenuti/ty_page.html";//(9) URL della pagina errore campi vuoti
$pagina_error_empty = "vvv.dominio.ext/contenuti/err_page.html";//(10) URL della pagina errore email
$pagina_error_email = "vvv.dominio.ext/contenuti/err_page.html";//(11) URL della pagina errore condizioni non accettate
$pagina_error_condizioni = "vvv.dominio.ext/contenuti/err_page.html";//(12) URL della pagina errore invio non autorizzato (mancanza di referer)
$pagina_error_referer = "vvv.dominio.ext/contenuti/err_page.html";#######################################
FINE IMPOSTAZIONI DA CONFIGURARE
#######################################
//ora e data
$ora = date ("H:i:s");
$data = date ("d/m/Y");//intestazione email che arriva al destinatario
$corpo = "
Modulo inviato il $data alle ore $ora
Riepilogo dati:\n\n";########### CODICI ###########
//variabili per rendere lo script compatibile anche con la versione PHP 4.2 e maggiori
if(!isset($_SERVER) OR !$_SERVER OR !is_array($_SERVER) OR count(array_diff($_SERVER, $HTTP_SERVER_VARS))){
$_POST = &$HTTP_POST_VARS;
}//prende IP ADDRESS
if(isset($_SERVER["HTTP_X_FORWARDED_FOR"])){if ($_SERVER["HTTP_X_FORWARDED_FOR"] == "") {
$ipnumb = getenv("REMOTE_ADDR");
}else {
$ipnumb = getenv("HTTP_X_FORWARDED_FOR");
} } else {
$ipnumb = getenv("REMOTE_ADDR");
}
###################################//controllo referer
if(empty($_SERVER["HTTP_REFERER"])){header ("Location: $pagina_error_referer"); exit(); }
########### CONTROLLO DEI CAMPI ###########
$control_campi = 0;if($all_free != "y"){
foreach($_POST as $key => $valore){ if(in_array($key,$campi_req)){ if(trim($valore) == ""){ $control_campi++; } } } } else { $control_campi = 0; }
########### CONTROLLO EMAIL ###########
$control_email = 0;if($obbligo_email == "y"){
if(isset($_POST['email'])){ if(!eregi("^([a-zA-Z0-9_.-])+@(([a-zA-Z0-9_-])+.)+[a-z]{2,6}$", $_POST['email'])){ $control_email++; } } else { $control_email = 0; } }
########### CONTROLLO CONDIZIONI ###########
$control_condizioni = 0;if($accetta_condizioni == "y"){
if(isset($_POST['trattamento_dati']) && $_POST['trattamento_dati'] == "accetto"){ $control_condizioni = 0; } else { $control_condizioni ++; } }
########### INVIO EMAIL ###########
if($control_campi == 0){if($control_email == 0){ if($control_condizioni == 0){
foreach($_POST as $key => $valore){
$key = ucfirst(stripslashes(trim($key)));
$valore = stripslashes(trim($valore));
$key = str_replace("_"," ",$key);if(trim($valore) == "") $valore = "Non compilato"; $corpo .= $key .": ". $valore ."\n\n"; } $corpo .= "Numero IP: $ipnumb"."\n";
$corpo .= "____________________________________________________________ \n\n
";
// invio e-mail
// Header Mail
$headmail.="From: $nome_mittente <$nome_mittente>\n";
$headmail.="Return-Path: $nome_mittente\n";
$headmail.="User-Agent: Php Mail Function\n";
$headmail.="X-Accept-Language: en-us, en\n";
$headmail.="MIME-Version: 1.0\n";
$headmail.="X-Priority: 1 (Highest)\n";
$headmail.="Content-Type: text/plain; charset=ISO-8859-1; format=flowed\n";
$headmail.="Content-Transfer-Encoding: 7bit\n";ini_set('sendmail_from', "$destinatario");
mail("$destinatario", "$object_mail", "$corpo", "$headmail");header ("Location: $pagina_grazie"); } else { header ("Location: $pagina_error_condizioni"); } } else { header ("Location: $pagina_error_email"); } } else { header ("Location: $pagina_error_empty"); }
?>
[/php]questo è tutto il file.Sam dovrai darmi modo di sdebitarmi, in un modo o nell'altro
rafa
-
Allora, vediamo un po'.
Questa è la riga 217 del file, quella che contiene la funzione mail():
[php]mail("$destinatario", "$object_mail", "$corpo", "$headmail");[/php]I parametri inseriti tra parentesi non sono altro che, in ordine:- e-mail del destinatario (in questo caso $destinatario contiene la tua mail)
- Oggetto della Mail
- Testo della mail
- Header della mail
Se tu vuoi mandare una mail anche a chi compila il modulo non devi far altro che copiare, intanto, la riga subito dopo questa, cambiare l'e-mail del destinatario, ovvero quella inserita nel form che in questo file è contenuta nella variabile $email. Fatto questo variare il testo della mail che sicuramente sarà diverso dalla mail che giunge a te.
Per il corpo della mail, anche per avere una maggiore leggibilità del codice, puoi utilizzare il seguente metodo (questa parte va inserita tra le due righe contenenti le funzioni mail()
[php]$corpo="Salve ".$nome.",\n"; // \n serve ad andare a capo
$corpo.="blablablablablablabla.\n"; // attenzione al .= serve a aggiungere a seguire il resto del testo
$corpo.="Puoi scaricare l'e-book da <a href="".$link."" title="Clicca per scaricare">questo link</a>.\n";[/php]Altra cosa:
[php]$nome_mittente = "$email";[/php]Sostituisci $email con il nome che vuoi che appaia nel mittente (sempre tra virgolette) e poi:
[php]$headmail.="From: $nome_mittente <$nome_mittente>\n";
$headmail.="Return-Path: $nome_mittente\n";[/php]Trasformalo in:
[php]$headmail.="From: ".$destinatario." <".$nome_mittente.">\n";
$headmail.="Return-Path: ".$destinatario."\n";[/php]Vediamo se con queste modifiche che ti ho scritto va.