• User Attivo

    Scrivici il contenuto della classe phpmailer, così vediamo di aggiustarla.


  • User

    La classe è molto lunga da riportare.
    L'ho zippata e caricata su un server.
    Ecco il link
    siciliareport.com/class.phpmailer.zip
    aggiungere www


  • User

    La classe è molto lunga da riportare.
    L'ho zippata e caricata su un server.
    Ecco il link
    siciliareport.com/class.phpmailer.zip
    aggiungere www


  • User Attivo

    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... ;)

  • User

    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.


  • User

    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.


  • User

    Purtroppo mi da errore:
    Parse error: syntax error, unexpected T_CONSTANT_ENCAPSED_STRING in D:\inetpub\webs\siciliareportcom\formmail.php on line 16

    Alla 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.


  • User Attivo

    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.


  • User

    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


  • User Attivo

    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.


  • User Attivo

    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.


  • User

    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]
    :mmm:


  • User Attivo

    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... 😉


  • User

    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....


  • User Attivo

    Che svista clamorosa! 😄 Bravo, io proprio non ci avevo pensato!


  • User

    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 ?

  • User

    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 ?


  • User Attivo

    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]


  • User

    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 &egrave 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 ?