La validation des adresses e-mail dans delphi


Est une adresse de courriel valide?
la Validation des adresses e-mail dans Delphi
aujourd'Hui, il est très fréquent que nos programmes de stocker des adresses email dans les bases de données en tant que partie des données du personnel, des clients, des fournisseurs, etc. Lorsque invitant l'utilisateur à une adresse e-mail, comment savons-nous si la valeur saisie est formellement correct? Dans cet article je vais vous montrer comment valider des adresses de messagerie à l'aide d'une variation de la RFC #822.
La RFC #822 règles de la 'NORME POUR LE FORMAT DES MESSAGES TEXTE INTERNET ARPA'.
Selon cette règle, les éléments suivants sont des adresses email valides:
& nbsp & nbsp John Doe [email protected]
& nbsp & nbsp John Doe
& nbsp & nbsp 'John Doe' [email protected]
& nbsp & nbsp 'John Doe'
Le but de mon code n'est pas de valider de telles choses, mais uniquement ce qui est nécessaire pour atteindre un destinataire unique (comme '[email protected]'), que dans le cahier des charges est considéré comme un 'addr-spec', ce qui est de la forme:
& nbsp & nbsp local-part@domaine

  • local-part = un 'mot' ou plus, séparés par des périodes
  • domaine = un 'sous-domaine' ou plus, séparés par des périodes


Un 'mot' peut être un 'atome' ou un 'quoted-string':

  • atom = un ou plusieurs caractères dans la plage #33..#126 sauf ()<>@, :\/'.[]
  • quoted-string = Un texte entre guillemets, qui peut contenir 0 ou plusieurs caractères (#0..#127) à l'exception de ''' et #13. Un anti-slash ('\') cite le caractère suivant.


Un 'sous-domaine' peut être un 'domaine-ref' (un 'atome') ou un 'domaine littérale':

  • domaine-littérale = Un texte entre crochets qui peuvent contenir 0 ou plusieurs caractères (#0..#127) à l'exception de '[', ']' et #13. Un anti-slash ('\') cite le caractère suivant.


Selon la RFC 822, des caractères étendus (#128..#255) ne peut faire partie d'une adresse e-mail, cependant, de nombreux serveurs de messagerie de les accepter et de leur utilisation, donc je vais les prendre en compte.
La RFC 822 est très ouvert sur les noms de domaine. Pour une vraie adresse de messagerie Internet peut-être que nous devrions restreindre le domaine de la partie. Vous pouvez en lire plus sur les noms de domaine dans la RFC #1034 et RFC #1035.
Pour les RFC 1034 et RFC 1035, un nom de domaine est formé par les 'sous-domaines', séparés par des points, et chaque sous-domaine commence par une lettre ('a'..'z', 'A'..'Z') et devrait être suivi par zéro ou plusieurs lettres, des chiffres et des traits d'union, mais ne peut pas se terminer avec un trait d'union. Nous allons considérer qu'un domaine valide doit avoir au moins deux 'sous-domaines' (comme 'host.com').
Maintenant que nous avons les règles sont claires, nous allons rendre au travail. L'algorithme pour la fonction ressemble à un états-transition de la machine. Caractères de la chaîne sont traitées dans une boucle, et pour chaque caractère, nous avons d'abord déterminer l'état de la machine et ensuite, nous traitons le personnage en conséquence, pour déterminer si la machine doit continuer dans cet état, passez à un autre état ou produire une erreur (la rupture de la boucle). Ces algorithmes sont largement traités dans la programmation des algorithmes de manuels scolaires, donc, nous allons faire droit à ce code:
function ValidEmail(e-mail: string): boolean
& nbsp & nbsp // Retourne Vrai si l'adresse email est valide
& nbsp & nbsp // Auteur: Ernesto D'Spirito
& nbsp & nbsp const
& ! & ! & ! & nbsp // caractères Valides dans un 'atome'
& ! & ! & ! & nbsp atom_chars = [#33..#255] - ['(', ')', '<', '>', '@', ',', ' ', ':',
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp '\', '/', ''', '.', '[', ']', #127]
& ! & ! & ! & nbsp // caractères Valides dans une 'quoted-string'
& ! & ! & ! & nbsp quoted_string_chars = [#0..#255] - [''', #13, '\']
& ! & ! & ! & nbsp // caractères Valides dans un sous-domaine
& ! & ! & ! & nbsp lettres = ['A'..'Z', 'a'..'z']
& ! & ! & ! & nbsp letters_digits = ['0'..'9', 'A'..'Z', 'a'..'z']
& ! & ! & ! & nbsp subdomain_chars = ['-', '0'..'9', 'A'..'Z', 'a'..'z']
& nbsp & nbsp type
& ! & ! & ! & nbsp Unis = (STATE_BEGIN, STATE_ATOM, STATE_QTEXT, STATE_QCHAR,
& ! & ! & ! & ! & ! & nbsp STATE_QUOTE, STATE_LOCAL_PERIOD, STATE_EXPECTING_SUBDOMAIN,
& ! & ! & ! & ! & ! & nbsp STATE_SUBDOMAIN, STATE_HYPHEN)
& nbsp & nbsp var
& ! & ! & ! & nbsp État: les États
& ! & ! & ! & nbsp i, n, sous-domaines: integer
& ! & ! & ! & nbsp c: char
& nbsp & nbsp commencer
& ! & ! & ! & nbsp État := STATE_BEGIN

& ! & ! & ! & nbsp n := Longueur(email)
& ! & ! & ! & ! i := 1
& ! & ! & ! & nbsp sous-domaines := 1
& ! & ! & ! & nbsp while (i <= n) do begin
& ! & ! & ! & ! & ! & nbsp c := e-mail[i]
& ! & ! & ! & ! & ! & nbsp cas de l'État de
& ! & ! & ! & ! & ! & nbsp STATE_BEGIN:
& ! & ! & ! & ! & ! & ! & ! & nbsp si c dans atom_chars puis
& ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp État := STATE_ATOM
& ! & ! & ! & ! & ! & ! & ! & nbsp sinon si c = '''
& ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp État := STATE_QTEXT
& ! & ! & ! & ! & ! & ! & ! & nbsp else
& ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp pause
& ! & ! & ! & ! & ! & nbsp STATE_ATOM:
& ! & ! & ! & ! & ! & ! & ! & nbsp si c = ' @ '
& ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp État := STATE_EXPECTING_SUBDOMAIN
& ! & ! & ! & ! & ! & ! & ! & nbsp sinon si c = '.'puis
& ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp État := STATE_LOCAL_PERIOD
& ! & ! & ! & ! & ! & ! & ! & nbsp d'autre si ce n' (c dans atom_chars) puis
& ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp pause
& ! & ! & ! & ! & ! & nbsp STATE_QTEXT:
& ! & ! & ! & ! & ! & ! & ! & nbsp si c = ' \ '
& ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp État := STATE_QCHAR
& ! & ! & ! & ! & ! & ! & ! & nbsp sinon si c = '''
& ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp État := STATE_QUOTE
& ! & ! & ! & ! & ! & ! & ! & nbsp d'autre si ce n' (c dans quoted_string_chars) puis
& ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp pause
& ! & ! & ! & ! & ! & nbsp STATE_QCHAR:
& ! & ! & ! & ! & ! & ! & ! & nbsp État := STATE_QTEXT
& ! & ! & ! & ! & ! & nbsp STATE_QUOTE:
& ! & ! & ! & ! & ! & ! & ! & nbsp si c = ' @ '
& ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp État := STATE_EXPECTING_SUBDOMAIN
& ! & ! & ! & ! & ! & ! & ! & nbsp sinon si c = '.'puis
& ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp État := STATE_LOCAL_PERIOD
& ! & ! & ! & ! & ! & ! & ! & nbsp else
& ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp pause
& ! & ! & ! & ! & ! & nbsp STATE_LOCAL_PERIOD:
& ! & ! & ! & ! & ! & ! & ! & nbsp si c dans atom_chars puis
& ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp État := STATE_ATOM
& ! & ! & ! & ! & ! & ! & ! & nbsp sinon si c = '''
& ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp État := STATE_QTEXT
& ! & ! & ! & ! & ! & ! & ! & nbsp else
& ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp pause
& ! & ! & ! & ! & ! & nbsp STATE_EXPECTING_SUBDOMAIN:
& ! & ! & ! & ! & ! & ! & ! & nbsp si c en lettres puis
& ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp État := STATE_SUBDOMAIN
& ! & ! & ! & ! & ! & ! & ! & nbsp else
& ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp pause
& ! & ! & ! & ! & ! & nbsp STATE_SUBDOMAIN:
& ! & ! & ! & ! & ! & ! & ! & nbsp si c = '.'puis commencer
& ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp inc(sous-domaines)
& ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp État := STATE_EXPECTING_SUBDOMAIN
& ! & ! & ! & ! & ! & ! & ! & nbsp fin sinon si c = ' - '
& ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp État := STATE_HYPHEN
& ! & ! & ! & ! & ! & ! & ! & nbsp d'autre si ce n' (c dans letters_digits) puis
& ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp pause
& ! & ! & ! & ! & ! & nbsp STATE_HYPHEN:
& ! & ! & ! & ! & ! & ! & ! & nbsp si c dans letters_digits puis
& ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp État := STATE_SUBDOMAIN
& ! & ! & ! & ! & ! & ! & ! & nbsp else if (c < > ' - '
& ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp pause
& ! & ! & ! & ! & ! & nbsp fin
& ! & ! & ! & ! & ! & nbsp inc(i)
& ! & ! & ! & nbsp fin
& ! & ! & ! & nbsp si i <= n
& ! & ! & ! & ! & ! & nbsp Result := False
& ! & ! & ! & nbsp else
& ! & ! & ! & ! & ! & nbsp Result := (Etat = STATE_SUBDOMAIN) et les sous-domaines >= 2)
& nbsp & nbsp fin

Toute collaboration pour améliorer cette fonction sera la bienvenue.
Vous pouvez trouver le code source complet de cet article dans les archives qui accompagne le Pascal Newsletter #22.









La validation des adresses e-mail dans delphi


La validation des adresses e-mail dans delphi : Plusieurs milliers de conseils pour vous faciliter la vie.


Est une adresse de courriel valide?
la Validation des adresses e-mail dans Delphi
aujourd'Hui, il est tres frequent que nos programmes de stocker des adresses email dans les bases de donnees en tant que partie des donnees du personnel, des clients, des fournisseurs, etc. Lorsque invitant l'utilisateur a une adresse e-mail, comment savons-nous si la valeur saisie est formellement correct? Dans cet article je vais vous montrer comment valider des adresses de messagerie a l'aide d'une variation de la RFC #822.
La RFC #822 regles de la 'NORME POUR LE FORMAT DES MESSAGES TEXTE INTERNET ARPA'.
Selon cette regle, les elements suivants sont des adresses email valides:
& nbsp & nbsp John Doe [email protected]
& nbsp & nbsp John Doe
& nbsp & nbsp 'John Doe' [email protected]
& nbsp & nbsp 'John Doe'
Le but de mon code n'est pas de valider de telles choses, mais uniquement ce qui est necessaire pour atteindre un destinataire unique (comme '[email protected]'), que dans le cahier des charges est considere comme un 'addr-spec', ce qui est de la forme:
& nbsp & nbsp local-part@domaine

  • local-part = un 'mot' ou plus, separes par des periodes
  • domaine = un 'sous-domaine' ou plus, separes par des periodes


Un 'mot' peut etre un 'atome' ou un 'quoted-string':

  • atom = un ou plusieurs caracteres dans la plage #33..#126 sauf ()<>@, :\/'.[]
  • quoted-string = Un texte entre guillemets, qui peut contenir 0 ou plusieurs caracteres (#0..#127) a l'exception de ''' et #13. Un anti-slash ('\') cite le caractere suivant.


Un 'sous-domaine' peut etre un 'domaine-ref' (un 'atome') ou un 'domaine litterale':

  • domaine-litterale = Un texte entre crochets qui peuvent contenir 0 ou plusieurs caracteres (#0..#127) a l'exception de '[', ']' et #13. Un anti-slash ('\') cite le caractere suivant.


Selon la RFC 822, des caracteres etendus (#128..#255) ne peut faire partie d'une adresse e-mail, cependant, de nombreux serveurs de messagerie de les accepter et de leur utilisation, donc je vais les prendre en compte.
La RFC 822 est tres ouvert sur les noms de domaine. Pour une vraie adresse de messagerie Internet peut-etre que nous devrions restreindre le domaine de la partie. Vous pouvez en lire plus sur les noms de domaine dans la RFC #1034 et RFC #1035.
Pour les RFC 1034 et RFC 1035, un nom de domaine est forme par les 'sous-domaines', separes par des points, et chaque sous-domaine commence par une lettre ('a'..'z', 'A'..'Z') et devrait etre suivi par zero ou plusieurs lettres, des chiffres et des traits d'union, mais ne peut pas se terminer avec un trait d'union. Nous allons considerer qu'un domaine valide doit avoir au moins deux 'sous-domaines' (comme 'host.com').
Maintenant que nous avons les regles sont claires, nous allons rendre au travail. L'algorithme pour la fonction ressemble a un etats-transition de la machine. Caracteres de la chaîne sont traitees dans une boucle, et pour chaque caractere, nous avons d'abord determiner l'etat de la machine et ensuite, nous traitons le personnage en consequence, pour determiner si la machine doit continuer dans cet etat, passez a un autre etat ou produire une erreur (la rupture de la boucle). Ces algorithmes sont largement traites dans la programmation des algorithmes de manuels scolaires, donc, nous allons faire droit a ce code:
function ValidEmail(e-mail: string): boolean
& nbsp & nbsp // Retourne Vrai si l'adresse email est valide
& nbsp & nbsp // Auteur: Ernesto D'Spirito
& nbsp & nbsp const
& ! & ! & ! & nbsp // caracteres Valides dans un 'atome'
& ! & ! & ! & nbsp atom_chars = [#33..#255] - ['(', ')', '<', '>', '@', ',', ' ', ':',
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp '\', '/', ''', '.', '[', ']', #127]
& ! & ! & ! & nbsp // caracteres Valides dans une 'quoted-string'
& ! & ! & ! & nbsp quoted_string_chars = [#0..#255] - [''', #13, '\']
& ! & ! & ! & nbsp // caracteres Valides dans un sous-domaine
& ! & ! & ! & nbsp lettres = ['A'..'Z', 'a'..'z']
& ! & ! & ! & nbsp letters_digits = ['0'..'9', 'A'..'Z', 'a'..'z']
& ! & ! & ! & nbsp subdomain_chars = ['-', '0'..'9', 'A'..'Z', 'a'..'z']
& nbsp & nbsp type
& ! & ! & ! & nbsp Unis = (STATE_BEGIN, STATE_ATOM, STATE_QTEXT, STATE_QCHAR,
& ! & ! & ! & ! & ! & nbsp STATE_QUOTE, STATE_LOCAL_PERIOD, STATE_EXPECTING_SUBDOMAIN,
& ! & ! & ! & ! & ! & nbsp STATE_SUBDOMAIN, STATE_HYPHEN)
& nbsp & nbsp var
& ! & ! & ! & nbsp Etat: les Etats
& ! & ! & ! & nbsp i, n, sous-domaines: integer
& ! & ! & ! & nbsp c: char
& nbsp & nbsp commencer
& ! & ! & ! & nbsp Etat := STATE_BEGIN

& ! & ! & ! & nbsp n := Longueur(email)
& ! & ! & ! & ! i := 1
& ! & ! & ! & nbsp sous-domaines := 1
& ! & ! & ! & nbsp while (i <= n) do begin
& ! & ! & ! & ! & ! & nbsp c := e-mail[i]
& ! & ! & ! & ! & ! & nbsp cas de l'Etat de
& ! & ! & ! & ! & ! & nbsp STATE_BEGIN:
& ! & ! & ! & ! & ! & ! & ! & nbsp si c dans atom_chars puis
& ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp Etat := STATE_ATOM
& ! & ! & ! & ! & ! & ! & ! & nbsp sinon si c = '''
& ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp Etat := STATE_QTEXT
& ! & ! & ! & ! & ! & ! & ! & nbsp else
& ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp pause
& ! & ! & ! & ! & ! & nbsp STATE_ATOM:
& ! & ! & ! & ! & ! & ! & ! & nbsp si c = ' @ '
& ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp Etat := STATE_EXPECTING_SUBDOMAIN
& ! & ! & ! & ! & ! & ! & ! & nbsp sinon si c = '.'puis
& ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp Etat := STATE_LOCAL_PERIOD
& ! & ! & ! & ! & ! & ! & ! & nbsp d'autre si ce n' (c dans atom_chars) puis
& ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp pause
& ! & ! & ! & ! & ! & nbsp STATE_QTEXT:
& ! & ! & ! & ! & ! & ! & ! & nbsp si c = ' \ '
& ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp Etat := STATE_QCHAR
& ! & ! & ! & ! & ! & ! & ! & nbsp sinon si c = '''
& ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp Etat := STATE_QUOTE
& ! & ! & ! & ! & ! & ! & ! & nbsp d'autre si ce n' (c dans quoted_string_chars) puis
& ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp pause
& ! & ! & ! & ! & ! & nbsp STATE_QCHAR:
& ! & ! & ! & ! & ! & ! & ! & nbsp Etat := STATE_QTEXT
& ! & ! & ! & ! & ! & nbsp STATE_QUOTE:
& ! & ! & ! & ! & ! & ! & ! & nbsp si c = ' @ '
& ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp Etat := STATE_EXPECTING_SUBDOMAIN
& ! & ! & ! & ! & ! & ! & ! & nbsp sinon si c = '.'puis
& ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp Etat := STATE_LOCAL_PERIOD
& ! & ! & ! & ! & ! & ! & ! & nbsp else
& ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp pause
& ! & ! & ! & ! & ! & nbsp STATE_LOCAL_PERIOD:
& ! & ! & ! & ! & ! & ! & ! & nbsp si c dans atom_chars puis
& ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp Etat := STATE_ATOM
& ! & ! & ! & ! & ! & ! & ! & nbsp sinon si c = '''
& ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp Etat := STATE_QTEXT
& ! & ! & ! & ! & ! & ! & ! & nbsp else
& ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp pause
& ! & ! & ! & ! & ! & nbsp STATE_EXPECTING_SUBDOMAIN:
& ! & ! & ! & ! & ! & ! & ! & nbsp si c en lettres puis
& ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp Etat := STATE_SUBDOMAIN
& ! & ! & ! & ! & ! & ! & ! & nbsp else
& ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp pause
& ! & ! & ! & ! & ! & nbsp STATE_SUBDOMAIN:
& ! & ! & ! & ! & ! & ! & ! & nbsp si c = '.'puis commencer
& ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp inc(sous-domaines)
& ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp Etat := STATE_EXPECTING_SUBDOMAIN
& ! & ! & ! & ! & ! & ! & ! & nbsp fin sinon si c = ' - '
& ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp Etat := STATE_HYPHEN
& ! & ! & ! & ! & ! & ! & ! & nbsp d'autre si ce n' (c dans letters_digits) puis
& ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp pause
& ! & ! & ! & ! & ! & nbsp STATE_HYPHEN:
& ! & ! & ! & ! & ! & ! & ! & nbsp si c dans letters_digits puis
& ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp Etat := STATE_SUBDOMAIN
& ! & ! & ! & ! & ! & ! & ! & nbsp else if (c < > ' - '
& ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp pause
& ! & ! & ! & ! & ! & nbsp fin
& ! & ! & ! & ! & ! & nbsp inc(i)
& ! & ! & ! & nbsp fin
& ! & ! & ! & nbsp si i <= n
& ! & ! & ! & ! & ! & nbsp Result := False
& ! & ! & ! & nbsp else
& ! & ! & ! & ! & ! & nbsp Result := (Etat = STATE_SUBDOMAIN) et les sous-domaines >= 2)
& nbsp & nbsp fin

Toute collaboration pour ameliorer cette fonction sera la bienvenue.
Vous pouvez trouver le code source complet de cet article dans les archives qui accompagne le Pascal Newsletter #22.


La validation des adresses e-mail dans delphi

La validation des adresses e-mail dans delphi : Plusieurs milliers de conseils pour vous faciliter la vie.
Recommander aux amis
  • gplus
  • pinterest

Messages récents

Commentaire

Laisser un commentaire

évaluation