- Home
- Categorie
- Coding e Sistemistica
- PHP
- Validare campi invio email
-
La classe è molto lunga da riportare.
L'ho zippata e caricata su un server.
Ecco il link
siciliareport.com/class.phpmailer.zip
aggiungere www
-
La classe è molto lunga da riportare.
L'ho zippata e caricata su un server.
Ecco il link
siciliareport.com/class.phpmailer.zip
aggiungere www
-
Io farei così:
Modificherei la funzione AddAddress della classe in questo modo:
function AddAddress($address, $name = '') { $find = "/^[a-zA-Z0-9-_.]+@[a-zA-Z0-9-_.]+.[a-zA-Z]{2,4}$/"; if(preg_match($find, trim($address))){ $cur = count($this->to); $this->to[$cur][0] = trim($address); $this->to[$cur][1] = $name; return true; } else { return false; } } ```Poi nel tuo codice sostituirei: $mail->AddAddress($destinatario); con: if(!$mail->AddAddress($destinatario)) die "Indirizzo e-mail non valido"; Comunque utlilizzare una classe del genere per inviare una mail ad un singolo destinatario è come usare un cannone per sparare ad una mosca... Funziona, ma avresti potuto semplificarti di molto la vita... ;)
-
Innanzi tutto grazie.
È vero, la classe è esagerata per l'invio ad un solo destinatario.
L'ho utilizzata in realtà per l'invio dei tre allegati, che non avrei saputo gestire altrimenti.
Ora provo il codice della tua soluzione, ma in ogni caso, ancora grazie.
-
Innanzi tutto grazie.
È vero, la classe è esagerata per l'invio ad un solo destinatario.
L'ho utilizzata in realtà per l'invio dei tre allegati, che non avrei saputo gestire altrimenti.
Ora provo il codice della tua soluzione, ma in ogni caso, ancora grazie.
-
Purtroppo mi da errore:
Parse error: syntax error, unexpected T_CONSTANT_ENCAPSED_STRING in D:\inetpub\webs\siciliareportcom\formmail.php on line 16Alla riga 16 c'è:
if(!$mail->AddAddress($destinatario)) die "Indirizzo e-mail non valido";forse è necessario usare sqltextinjection visto che con phpmailer posso includere solo le funzioni.
Se pensi che il metodo che sto seguendo è del tutto sbagliato, lo cambio, soprattutto se conosci un metodo magari già pubblicato per inviare una mail con tre allegati, e controllo sui campi nome ed email.
I rete ho trovato tanto, ma con questi requisiti nulla.
E come sempre...grazie.
-
Potrebbe non essere solo questo l'errore, ma a quella riga ho dimenticato delle parentesi, chiedo scusa per la svista.
Prova a correggere così:
if(!$mail->AddAddress($destinatario)) die**("Indirizzo e-mail non valido")**;Se ci sono altri errori riportali pure qui che vediamo di risolverli.
-
L'errore non lo da più, ma il controllo non viene effettuato.
Infatti digitando qualche carattere a caso, senza chiocciola, nel campo email, l'invio avviene ugualmente, nonostante il controllo preveda
[PHP]
function AddAddress($address, $name = '') {
$find = "/^[a-zA-Z0-9-.]+@[a-zA-Z0-9-.]+.[a-zA-Z]{2,4}$/";
if(preg_match($find, trim($address))){
$cur = count($this->to);
$this->to[$cur][0] = trim($address);
$this->to[$cur][1] = $name;
return true;
} else { return false; }
}
[/PHP]$address andrebbe sostituito con $destinatario, giusto ?
(ho provato anche questo, ma niente)
Ho visto che usi $name, e non capisco:
non credo di doverlo sostituire con il mio $nominativo.
Questi sono i miei campi:
$destinatario
$nominativo
$mittente
$oggetto
$messaggio
$allegato_1
$allegato_2
$allegato_3
-
I nomi delle variabili che trovi all'interno della funzione AddAddress, sono riferiti solamente a quel contesto.
Questo vuol dire che se tu chiami la funzione con AddAddress($destinatario), il valore contenuto in destinatario sarà passato alla funzione e trattato come se fosse $name.
In termini pratici, la risposta è no, non devi sostituire $address con $destinatario.Il parametro $name è un parametro opzionale, che puoi non passare quando richiami la funzione.
Il motivo per il quale ti invia comunque l'e-mail mi è sconosciuto, se riposti il codice (il contenuto di formmail.php per intero) come lo abbiamo modificato posso ricontrollarlo e semmai fare una prova in locale.
Intanto, ho notato che l'espressione regolare per la verifica della e-mail è sbagliata. Avevo dato per scontato che fosse corretta pensando (aihmè sbagliando) che l'avessi presa da qualche parte già verificata e funzionante.
-
All'interno della funzione AddAddress, l'assegnazione della variabile $find va modificata così:
$find = "/^[a-zA-Z0-9-_\.]+@[a-zA-Z0-9-_\.]+\.[a-zA-Z]{2,4}$/";
Ho testato la funzione AddAddress e con questa modifica funziona correttamente.
Prova a far girare di nuovo il tutto al completo e dimmi se così funziona.
-
Ancora grazie, soprattutto per la pazienza...
L'email parte ugualmente, anche se non è in forma corretta.
Di seguito riporto la pagina che invia
[PHP]
<?php
// Recupero il valore dei campi del form
$destinatario = $_POST['destinatario'];
$nominativo = $_POST['nominativo'];
$mittente = $_POST['mittente'];
$oggetto = $_POST['oggetto'];
$messaggio = $_POST['messaggio'];
$allegato_1 = $_FILE['allegato_1'];
$allegato_2 = $_FILE['allegato_2'];
$allegato_3 = $_FILE['allegato_3'];require_once("class.phpmailer.php");
$mail = new PHPMailer();
$mail->From = $mittente;
$mail->FromName = $nominativo;
if(!$mail->AddAddress($destinatario)) die("Indirizzo e-mail non valido");
$mail->AddCC($mittente);
$mail->AddReplyTo($mittente);
$mail->IsHTML(true);
$mail->Subject = $oggetto;
$mail->Body = $messaggio."<br>".$nominativo;
$mail->AltBody = $bodytxt;
$mail->AddAttachment($_FILES['allegato_1']['tmp_name'],$_FILES['allegato_1']['name']);
$mail->AddAttachment($_FILES['allegato_2']['tmp_name'],$_FILES['allegato_2']['name']);
$mail->AddAttachment($_FILES['allegato_3']['tmp_name'],$_FILES['allegato_3']['name']);if(!$mail->Send()){
echo "Si è verificato un errore nell'invio della mail";
}else{
echo "Mail inviata con successo";
}
?>
[/PHP]
-
Strano, io ho provato la funzione a che ti ho scritto a parte e restituiva risultati corretti.
Sono anche un po' fuso oggi, ma a meno che non ci siano errori nel modo in cui hai utilizzato la classe o nella funzione che ti ho fatto modificare non so che dire...Se mi viene in mente qualcosa ti aggiorno, nel frattempo chissà che qualcuno di passaggio non trovi l'errore...
-
AddAddress ora che ci penso è la mail del destinatario, cioè la mia, che è nel codice ed è chiaro che è corretta.
Provo ad applicare il tutto a From, vediamo che succede....
-
Che svista clamorosa! Bravo, io proprio non ci avevo pensato!
-
Per quanto riguarda From ho trovato solo questo nel file phpmailer:
- Sets the From email address for the message.
- @var string
*/
var $From = 'root@localhost';
che si trova nelle proprietà, all'inizio, riga 75.
Tra le funzioni non ce n'è nessuna dedicata a $From
In questo caso che faccio? Ne creo una ?
- @var string
- Sets the From email address for the message.
-
Grandi novità, ancora non invia ma il controllo funziona.
Anche con livevalidation ottenni lo stesso risultato, ma quello funziona lato client, non c'entra niente...Allora, ho inserito un nuova funzione in phpmailer:
[PHP]
function From($address, $name = '') {
$find = "/^[a-zA-Z0-9-.]+@[a-zA-Z0-9-.]+.[a-zA-Z]{2,4}$/";
if(preg_match($find, trim($address))){
$cur = count($this->to);
$this->to[$cur][0] = trim($address);
$this->to[$cur][1] = $name;
return true;
} else { return false; }
}
[/PHP]
e nel file php di invio ho modificato questo
[PHP]
$mail->From = $mittente;
[/PHP]
in questo
[PHP]
if(!$mail->From($mittente)) die("Indirizzo e-mail non valido");
[/PHP]Il controllo funziona, ma l'email non viene più inviata. Perchè secondo te ?
-
Semplifichiamo un po'... A questo punto puoi rimerrere la classe phpmailer originale, oppure tenerla così com'è, ma non è necessario modificare più nulla al suo interno.
Modifichiamo formmail.php in questo modo:
[php]
<?php
// Recupero il valore dei campi del form
$destinatario = $_POST['destinatario'];
$nominativo = $_POST['nominativo'];
$mittente = $_POST['mittente'];
$oggetto = $_POST['oggetto'];
$messaggio = $_POST['messaggio'];
$allegato_1 = $_FILE['allegato_1'];
$allegato_2 = $_FILE['allegato_2'];
$allegato_3 = $_FILE['allegato_3'];//dichiaro la funzione che verifica gli indirizzi e-mail
function verifica($email) {
$find = "/^[a-zA-Z0-9-.]+@[a-zA-Z0-9-.]+.[a-zA-Z]{2,4}$/";
if(preg_match($find, trim($email))){
return true;
} else { return false; }
}//verifico che il mittente sia valido
if(!verifica($mittente)) die("Indirizzo e-mail mittente non valido");require_once("class.phpmailer.php");
$mail = new PHPMailer();
$mail->From = $mittente;
$mail->FromName = $nominativo;
if(!$mail->AddAddress($destinatario)) die("Indirizzo e-mail destinatario non valido");
$mail->AddCC($mittente);
$mail->AddReplyTo($mittente);
$mail->IsHTML(true);
$mail->Subject = $oggetto;
$mail->Body = $messaggio."<br>".$nominativo;
$mail->AltBody = $bodytxt;
$mail->AddAttachment($_FILES['allegato_1']['tmp_name'],$_FILES['allegato_1']['name']);
$mail->AddAttachment($_FILES['allegato_2']['tmp_name'],$_FILES['allegato_2']['name']);
$mail->AddAttachment($_FILES['allegato_3']['tmp_name'],$_FILES['allegato_3']['name']);if(!$mail->Send()){
echo "Si è verificato un errore nell'invio della mail";
}else{
echo "Mail inviata con successo";
}
?>
[/php]Ovviamente se rimetti la classe phpmailer originale devi anche sostituire
[PHP]if(!$mail->AddAddress($destinatario)) die("Indirizzo e-mail destinatario non valido");[/PHP]
con
[PHP]$mail->AddAddress($destinatario);[/PHP]
-
Il procedimento è lo stesso, infatti la mail non arriva.
Non che io ne capisca niente, ma un'altra soluzione che mi è stata suggerita (solo parzialmente) è la seguente:
inserire in phpmailer una funzione tipo
[PHP]
function From() {}
function sqltextinjection($testo){
$testo=trim($testo);
if (empty($testo)){
return 1;}
if(!ereg("^[A-Za-z0-9 ]+$",$testo)){
return 1;//$testo;
break;
}
else
{
return $testo;
}
}
[/PHP]e visto che
$nome=$_POST['nome'];/assegna a $nome il valore passato con POST['nome']/
effettuare qui il controllo:
[PHP]
$tnome=sqltextinjection($nome);/*$tnome è la variabile temporanea di appoggio
if($tnome==1){
die("il campo Nome è vuoto oppure hai inserito caratteri non validi.");
} */se il valore di ritorno è 1 .....
[/PHP]
Per logica il metodo potrebbe funzionare, perchè effettua il controllo su una stringa, e non su una variabile, annullando i problemi di passaggio della variabile, che sono riscontrabili con la gestione del controllo che abbiamo provato prima, ed anche con altri metodi che ho provato.
C'è solo un piccolo problema: a quella funzione sono stati eliminati i parametri, ed io non saprei da dove cominciare. Tu ci capisci niente ?