2010-08-25 11 views
5

Poiché Delphi non ha alcuna libreria di espressioni regolari incorporata, hai visto una buona funzione per convalidare gli indirizzi di posta elettronica almeno in una certa misura utilizzando solo Delphi RTL/VCL?Delphi: convalida e-mail senza espressioni regolari

Non voglio collegare ulteriori * .dll al mio prodotto integrando il supporto per le espressioni regolari e ho bisogno anche della compatibilità con Delphi 7. Incorporare la libreria regex in exe aumenta le sue dimensioni e dubito che ne valga la pena aggiungere 100k successivi perché hai solo bisogno della funzione 10-50 righe di convalida dell'email.

+7

http: //www.howtodothings. com/computers/a1169-validating-email-addresses-in-delphi.html – Marko

+1

Per quello che vale, la prossima versione di Delphi avrà una libreria regex incorporata nella RTL, ed è in uscita in pochi giorni. –

+0

La convalida degli indirizzi e-mail è uno dei buoni esempi di w qui usare le espressioni regolari potrebbe non essere un'idea brillante - http://stackoverflow.com/questions/36261/test-expand-my-email-regex/36277#36277 – mjn

risposta

5

Come richiesto sto facendo il mio commento una risposta ..

http://www.howtodothings.com/computers/a1169-validating-email-addresses-in-delphi.html

Grazie!

+0

Si noti che quel codice implementa una specifica obsoleta. Era persino obsoleto al momento della pubblicazione del codice. –

+0

@Rob Kennedy: Intendi avvertimento CharInSet? –

+0

No, intendo che il codice implementa RFC 822. Il codice è stato pubblicato nel maggio 2001. RFC 2822 è stato pubblicato nell'aprile 2001. –

5

Il grosso problema nella convalida dell'indirizzo di posta elettronica è che RFC 822 è così ampio che nessuna espressione regolare può essere d'aiuto.

L'articolo I Knew How To Validate An Email Address Until I Read The RFC descrive questo bene.
Cita la RFC the local-part MUST be interpreted and assigned semantics only by the host specified in the domain part of the address (la @ è la parte che precede l'indirizzo @ in un indirizzo di posta elettronica).

Quindi:
l'unico modo per verificare se un indirizzo email è valido, è quello di impostare una connessione SMTP per l'host di posta elettronica per quel particolare dominio, e avviare il processo di sincronizzazione e-mail con l'indirizzo di posta elettronica che si sta cercando verificare.

Questo è ciò che fa un sacco di software anti-SPAM per verificare gli indirizzi e-mail del mittente: contattano il server SMTP del mittente dell'e-mail, provano a configurare un handshake SMTP e, se va bene, valutano l'arrivo email come più piace a non essere spam.

È possibile utilizzare il componente client SMTP di Indy per inviare posta; la risposta accettata allo this question spiega come.

--jeroen

+0

Personalmente applicherò solo: 1. Avere solo un carattere @ nella stringa (con indice> 0) 2. Non avere caratteri nell'intervallo [0..32] nella stringa. 3. Avere almeno un "." carattere dopo l'indice @ (con una distanza di 1 o più). 4. No: o/o \ caratteri nel nome del dominio. – alex

+4

RFC 822 era stato reso obsoleto dal 2822 che rimuoveva alcune sintassi consentite dall'822. In ogni caso, raramente è necessaria la sintassi 2822 completa, consentendo una più semplice espressione regolare –

+2

non è necessario eseguire un handshake SMTP per convalidare un indirizzo. Sì, è necessario connettersi al server SMTP del dominio di posta elettronica, ma successivamente è possibile utilizzare il comando SMTP 'VRFY' per chiedere al server se l'indirizzo è valido. Il componente TIdSMTP di Indy ha un metodo Verify() per questo. –

-1

Per la vecchia versione di Delphi che non ha Espressione regolare:

function TForm1.IsValidEmail(email: string): boolean; 
const 
    charslist = ['_', '-', '.', '0'..'9', 'A'..'Z', 'a'..'z']; 
var 
    Arobasc, lastpoint : boolean; 
    i, n : integer; 
    c : char; 
begin 
    n := Length(email); 
    i := 1; 
    Arobasc := false; 
    lastpoint := false; 
    result := true; 
    while (i <= n) do begin 
    c := email[i]; 
    if c = '@' then 
    begin 
     if Arobasc then // Only 1 Arobasc 
     begin 
     result := false; 
     exit; 
     end; 
     Arobasc := true; 
    end 
    else if (c = '.') and Arobasc then // at least 1 . after arobasc 
    begin 
     lastpoint := true; 
    end 
    else if not(c in charslist) then // valid chars 
    begin 
     result := false; 
     exit; 
    end; 
    inc(i); 
    end; 
    if not(lastpoint) or (email[n] = '.')then // not finish by . and have a . after arobasc 
    result := false; 
end; 

Per chi piace usare RegExpression utilizzando il server di database

function TForm1.IsValidEmail(const AMail: string): Boolean; 
var 
    lQry: TSQLQuery; 
begin 
    // no REGEXP in Delphi 2009 -> use of REGEPX Oracle 
    lQry := TSQLQuery.Create(); 
    lQry.SQLConnection := SQLConnection1; 
    try 
    vQry.SQL.Text := 'SELECT REGEXP_SUBSTR(' + QuotedStr(aMail) + ', ''^[a-zA-Z0-9._%+-][email protected][a-zA-Z0-9.-]+\.[a-zA-Z]{1,}$'') "EMAIL" FROM DUAL'; // ORACLE 
    // vQry.SQL.Text := 'SELECT ' + QuotedStr(aMail) + ' REGEXP ''^[a-zA-Z0-9][a-zA-Z0-9.-]*[a-zA-Z0-9.-]@[a-zA-Z0-9][a-zA-Z0-9._-]*[a-zA-Z0-9]\.[a-zA-Z]{2,4}$''; // MySQL 
    lQry.Open; 
    Result := not lQry.Eof and (lQry.FieldByName('EMAIL').AsString = AMail); 
    finally 
    FreeAndNil(lQry); 
    end; 
end;