chalda.it
17dic/096

Controllo validazione email con javascript anche con i nuovi domini accentati

validazione.email
Sempre la solita solfa!

Come fare a validare un indirizzo email con javascript?

La risposta quasi sempre è una questa semplice funzioncina:

function validEmail(email){
  return  /^([a-zA-Z0-9_.-])+@([a-zA-Z0-9_.-])+.([a-zA-Z])+([a-zA-Z])+/.test(email);
}

Bene... questa è sbagliata!!! Non riesce a validare alcuni indirizzi email! non ci credete?

Facciamo dei test con i seguenti indirizzi email (cliccaci sopra per eseguire il test ):

Ora molti diranno... È ovvio che gli ultimi non vengano validati! Sono pieni di caratteri strani, incomprensibili! Sono certamente errati!

E qui casca l'asino.

Tutti gli indirizzi qui sopra sono validi! Non mi credete? Analizziamoli passo a passo

Email con caratteri accentati / non latini

Le email citate prima ( provà@example.com e 甲斐@黒川.日本 ) sono assolutamente valide, poiché da settembre 2009 è stata data la possibilità di registrare domini con caratteri anche non latini, detti domini internazionalizzati.

Email che contengono simboli

Spulciando le specifiche dell'email (per semplicità date un'occhiata alla wikipedia inglese) ho scoperto che in realtà in esse non sono definiti i caratteri validi, ma quelli non validi. E non sono tanti come si possa immaginare! Quindi email caratteri come parentesi grafe, asterischi, tilde, dollari ecc. sono assolutamente da ritenersi valide.

La funzione di validazione email definitiva

Girando per internet sono riuscito a trovarla! Craig Cockburn modificando la funzione di Sandeep V. Tamhankar!, ha creato una funzione che segue alla lettera le specifiche riguardanti le email, così da non dover aver più nessun problema in futuro! (almeno finché non cambiano le specifiche :D )

/*
 * Original author:  Sandeep V. Tamhankar (stamhankar@hotmail.com)
 * old Source on http://www.jsmadeeasy.com/javascripts/Forms/Email%20Address%20Validation/template.htm
 * The above address bounces and no current valid address
 * can be found. This version has changes by Craig Cockburn
 * to accommodate top level domains .museum and .name
 * plus various other minor corrections and changes
 *
 * Italian translation by Giulio Chalda Bettega
*  http://blog.chalda.it/?p=11
 */

  function emailCheck(emailStr) {
        var emailPat = /^(.+)@(.+)$/;
        var specialChars = "\\(\\)<>@,;:\\\\\\\"\\.\\[\\]";
        var validChars = "[^\\s" + specialChars + "]";
        var quotedUser = "(\"[^\"]*\")";
        var ipDomainPat = /^\[(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\]$/;
        var atom = validChars + "+";
        var word = "(" + atom + "|" + quotedUser + ")";
        var userPat = new RegExp("^" + word + "(\\." + word + ")*$");
        var domainPat = new RegExp("^" + atom + "(\\." + atom + ")*$");
        var matchArray = emailStr.match(emailPat);
        if (matchArray == null) {
            alert("L'email sembra essere sbagliata: (controlla @ e .)");
            return false;
        }
        var user = matchArray[1];
        var domain = matchArray[2];
        if (user.match(userPat) == null) {
            alert("La parte dell'email prima di '@' non sembra essere valida!");
            return false;
        }
        var IPArray = domain.match(ipDomainPat);
        if (IPArray != null) {
            for (var i = 1; i <= 4; i++) {
                if (IPArray[i] > 255) {
                    alert("L'IP di destinazione non è valido!");
                    return false;
                }
            }
            return true;
        }
        var domainArray = domain.match(domainPat);
        if (domainArray == null) {
            alert("La parte dell'email dopo '@' non sembra essere valida!");
            return false;
        }
        var atomPat = new RegExp(atom, "g");
        var domArr = domain.match(atomPat);
        var len = domArr.length;
        if (domArr[domArr.length - 1].length < 2 ||
            domArr[domArr.length - 1].length > 6) {
            alert("Il dominio di primo livello (es: .com e .it) non sembra essere valido!");
            return false;
        }
        if (len < 2) {
            var errStr = "L'indirizzo manca del dominio!";
            alert(errStr);
            return false;
        }
        return true;
    }
//  End -->

Ora riprovate a validare questi indirizzi:

Conclusioni

Le email con caratteri strani e lettere accentate non hanno ancora preso piede e devo dire per esperienza personale che è alquanto difficile utilizzare una email con simboli "non consoni": mi ero fatto un indirizzo #chalda#@example.com e non vi dico le difficoltà nell'utilizzarlo in giro, poiché tutti i sistemi automatici utilizzano validazioni come quella qui sopra. E allora vai di segnalazioni al webmaster

Inoltre quando operatori telefonici mi richiedevano un indirizzo email il 25% sbagliava a scriverlo, il 25% mi diceva che non poteva essere valido e l'altro 50% non riusciva ad inserirlo nel sistema. Un buon metodo anti spam devo dire. :D

Tutta questa male informazione penso sia stata creata da Hotmail, Yahoo, Gmail e affini: questi servizi, inserendo delle limitazioni nella possibilità di scegliere l'indirizzo email, hanno fatto supporre a tutti i loro utenti (che sono una gran fetta del mercato) che le email devono per forza essere fatte a quella maniera.

Ora sapete che non è così. :)

Be Sociable, Share!
Commenti (6) Trackback (1)
  1. Finalmente l’ho trovato, grazie!

  2. Scusate la domanda,
    Magari parlo da ignorantissimo essendo nuovo dell’ambito ma perchè uccidersi a fare una funzione così lunga quando si potrebbe semplicemente impostare che la chiocciola debba essere posizionata al secondo carattere?
    O meglio, se la mail deve accettare praticamente ogni simbolo o carattere , perchè non dirgli direttamente di accettare tutto a patto che la chiocciola sia inserita in una posizione realistica per una mail?

  3. @Fabrizio: Semplicemente per avere una funzione che segue le specifiche, così sei sicuro di avere email valide :-)

  4. Grazie per la segnalazione! io fino ad oggi ho usato:
    /^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,4})+$/.test(email)

    E sinceramente credo di continuare ad usare questa per la sua semplicità e leggerezza anche perchè fino ad oggi mi è servita in controlli dove l’utenza media di provenienza esclusivamente italiana non va oltre a nome.congnome@miodiminio.com e non sa e forse è meglio così di poter usare caratteri “strani” quindi mi “tolgo” il problema dei domini internazionalizzati, però mi lascia perplesso la possibilità di ammettere email nella forma: !#$%&’*+-/=?^_`{|}~@example.com nel senso come le maneggi in sicurezza delle mail che hanno caratteri che in php sarebbero fatali?

  5. Ciao,

    bisogna anche tener presente un’altra cosa: esistono gli alias o mail temporanee che uno può crearsi come vuole, è per questo che ho messo la reg così e un codice a parte che la limita a 320 caratteri totali

    var reg = new RegExp(“^((.*)[@](.*)[.][a-z]{2,6})$”);

    In questo modo uno può inserire quello che vuole ed ha solo 3 obblighi: la chiocciola, il punto prima del dominio e dominio da 2-6 caratteri minuscoli

  6. Grazie x l ‘informazioni


Leave a comment