Validere e-postadresser i Delphi

Er en e-postadresse gyldig? validere e-postadresser i Delphi
I dag er det veldig vanlig at våre programmer lagrer e-postadresser i databaser som del av dataene av personell, kunder, leverandører, etc. Når spørre brukeren for en e-postadresse, hvordan vet vi om den angitte verdien er formelt riktig? I denne artikkelen vil jeg vise deg hvordan å validere e-postadresser som bruker en variant av RFC # 822.The RFC # 822 regler "STANDARD FOR Formatet ARPA INTERNETT tekstmeldinger" .Ifølge denne regelen, følgende er gyldig e- adresser: John Doe [email protected] John Doe < [email protected]>~~number=plural; "John Doe" [email protected] "John Doe" < [email protected]> Formålet med koden min er ikke å validere slike ting, men strengt hva som er nødvendig for å nå en enkelt mottaker (som "johndoe @ server. com "), som i spesifikasjonen er omtalt som en" adr-spec ", som har formen: lokal-delen @ domene

lokal-del = en" ord "eller mer, adskilt av perioder

domain = en "sub-domene" eller mer, atskilt av perioder
A "ord" kan være en "atom" eller en "quoted-string":


atom = ett eller flere tegn i serien # 33 .. # 126 unntatt () < > @,;:. \\ /"[]


quoted- string = En tekst i doble anførselstegn som kan inneholde 0 eller flere tegn (# 0 .. # 127) unntatt '»' og # 13. En backslash ('\\') siterer neste tegn
A "sub-domenet" kan være en "domene-ref" (en "atom") eller en "domene-bokstavelig". < .no>
domene-bokstave = En tekst vedlagt i parentes som kan inneholde 0 eller flere tegn (# 0 .. # 127) unntatt '[', ']' og # 13. En backslash ('\\') siterer neste tegn.
Ifølge RFC 822, utvidede tegn (# 128 .. # 255) kan ikke være en del av en e-postadresse, men mange mailservere aksepterer dem og folk bruker dem, så jeg kommer til å ta dem inn account.The RFC 822 er svært åpen om domenenavn. For en ekte Internet e-postadresse kanskje vi bør begrense domenedelen. Du kan lese mer om domenenavn i RFC # 1034 og RFC # 1035.For RFC 1034 og RFC 1035, et domenenavn er dannet av "sub-domener" atskilt med punktum, og hver underdomene begynner med en bokstav (' en '..' z ',' A '..' Z ') og bør følges av null eller flere bokstaver, tall og bindestrek, men kan ikke slutte med bindestrek. Vi kommer til å tenke på at et gyldig domenenavn bør ha minst to "sub-domener" (som "host.com"). Nå som vi har reglene klare, la oss komme til arbeid. Algoritmen for funksjonen ligner en statene-overgang maskin. Tegnene i strengen blir behandlet i en loop, og for hvert tegn først avgjøre vi hvilken delstat maskinen og da vi behandle karakter tilsvarende, for å avgjøre om maskinen skal fortsette i den tilstanden, bytte til en annen stat eller produsere en error (bryte sløyfen). Disse slags algoritmer er grundig behandlet i programmerings-algoritmer lærebøker, så la oss få rett til koden: function ValidEmail (epost: string): boolean; //Returnerer sann hvis e-postadressen er gyldig //Forfatter: Ernesto D'Spirito const //Gyldige tegn i en "atom" atom_chars = [# 33 .. # 255] - ['(', ')', '< ',' > ',' @ ',', ',', ','. ',' \\ ',' /',' "',' ',' [','] ', # 127 ]; //Gyldige tegn i en «quoted-string" quoted_string_chars = [# 0 .. # 255] - ['"', # 13, '\\']; //Gyldige tegn i et underdomene bokstaver = ['A' .. 'Z', 'a' .. 'z']; letters_digits = ['0' .. '9', 'A' .. 'Z', 'a' .. 'z']; subdomain_chars = ['-', '0' .. '9', 'A' .. 'Z', 'a' .. 'z']; skriver States = (STATE_BEGIN, STATE_ATOM, STATE_QTEXT, STATE_QCHAR, STATE_QUOTE, STATE_LOCAL_PERIOD, STATE_EXPECTING_SUBDOMAIN, STATE_SUBDOMAIN, STATE_HYPHEN); Var Stat: statene; i, n, underdomener: integer; c: char; begynne State: = STATE_BEGIN; n: = Lengde (e); i: = 1; underdomener: = 1; while (i < = n) gjør begynne c: = e [i]; Ved State of STATE_BEGIN: hvis ci atom_chars da Stat: = STATE_ATOM annet hvis c = '"' da Stat: = STATE_QTEXT annet break; STATE_ATOM: hvis c = '@' da Stat: = STATE_EXPECTING_SUBDOMAIN annet hvis c = '.' da Stat: = STATE_LOCAL_PERIOD annet hvis ikke (c i atom_chars) deretter bryte; STATE_QTEXT: hvis c = '\\' da Stat: = STATE_QCHAR annet hvis c = '"' da Stat: = STATE_QUOTE annet hvis ikke (c i quoted_string_chars) deretter gå i stykker; STATE_QCHAR: Stat: = STATE_QTEXT; STATE_QUOTE: hvis c = '@' da Stat: = STATE_EXPECTING_SUBDOMAIN annet hvis c = '.' da Stat: = STATE_LOCAL_PERIOD annet break; STATE_LOCAL_PERIOD: hvis ci atom_chars da Stat: = STATE_ATOM annet hvis c = '"' da Stat: = STATE_QTEXT annet break; STATE_EXPECTING_SUBDOMAIN: hvis ci bokstaver da Stat: = STATE_SUBDOMAIN annet break; STATE_SUBDOMAIN: hvis c = '.' deretter begynne Inc (underdomener), State: = STATE_EXPECTING_SUBDOMAIN end annet hvis c = '-' da Stat: = STATE_HYPHEN annet hvis ikke (c i letters_digits) deretter bryte; STATE_HYPHEN: hvis ci letters_digits da Stat: = STATE_SUBDOMAIN annet hvis c < > '-' deretter bryte; ende; inc (i); end, hvis jeg < = n deretter Resultat: = False annet Resultat: = (State = STATE_SUBDOMAIN) og (underdomener > = 2); end; Enhver samarbeid for å forbedre denne funksjonen vil være velkommen.Du finner hele kildekoden til denne artikkelen i arkivet som følger med Pascal Nyhetsbrev # 22. Anmeldelser



Previous: