Überprüfen von e-Mail-Adressen in delphi
Ist eine e-Mail-Adresse gültig?
Überprüfen von e-Mail-Adressen in Delphi
Heutzutage ist es sehr häufig vor, dass unsere Programme als Teil der Daten der Mitarbeiter, Kunden, Anbieter e-Mail-Adressen in Datenbanken speichern. Wenn die Benutzerführung für eine e-Mail-Adresse, wie wissen wir wenn der eingegebene Wert formal korrekt ist? In diesem Artikel zeige ich Ihnen, wie e-Mail-Adressen verwenden eine Variante des RFC #822 überprüft.
Die RFC-822 # Regeln der 'STANDARD für das FORMAT von ARPA INTERNET TEXTNACHRICHTEN'.
Nach dieser Regel sind folgende gültige e-Mail-Adressen:
John Doe der [email protected]
John Doe < als [email protected] >
'John Doe' der [email protected]
'John Doe' < als [email protected] >
The purpose of my code is not to validate such things, but strictly what is necessary to reach a single recipient (like '[email protected]'), that in the specification is referred as an 'addr-spec', which has the form:
local-Part@Domain
- lokal-Teil = ein 'Wort' oder mehr, durch Punkte getrennte
- Domäne = eine 'Sub-Domain' oder mehr, die durch Punkte getrennt
Ein 'Wort' kann ein 'Atom' oder ein 'zitiert-String':
'Sub-Domain' kann eine 'Domäne-Ref' (ein 'Atom') oder 'Domäne-Literal':
- Domäne-Literal = einen Text in eckigen Klammern, die 0 oder mehr Zeichen enthalten kann (#0.. #127) außer ' [', ']' und #13. Ein umgekehrter Schrägstrich ('\ ') zitiert das nächste Zeichen.
Nach RFC-822, erweiterte Zeichen (#128.. #255) kann nicht Teil einer e-Mail-Adresse sein, aber viele Mailserver akzeptieren und Menschen einsetzen, so werde ich diese berücksichtigen.
Die RFC-822 ist sehr offen über Domain-Namen. Vielleicht sollten wir für eine echte Internet-e-Mail-Adresse den Domänenteil einschränken. Lesen Sie mehr über Domain-Namen in der RFC #1034 und RFC 1035 #.
Für den RFC 1034 und RFC 1035, ein Domain-Name wird gebildet, indem 'Subdomains' durch Punkte getrennt, und jede Unterdomäne beginnt mit einem Buchstaben ('a'..' z', 'A'..' Z') und sollte von 0 (null) oder mehr Buchstaben, Ziffern und Bindestriche gefolgt werden, aber dürfen nicht mit einem Bindestrich enden. Wir werden prüfen, daß eine gültige Domain muss mindestens zwei 'Sub-Domains' (wie 'host.com' aus).
Jetzt haben wir die Regeln klar, kommen wir zur Arbeit. Der Algorithmus für die Funktion ähnelt eine Maschine Staaten-Übergang. Zeichen der Zeichenfolge werden in einer Schleife verarbeitet und für jedes Zeichen zuerst wir bestimmen, in welchem Zustand die Maschine ist und dann verarbeiten wir das Zeichen entsprechend, um festzustellen, ob die Maschine sollte in diesem Staat weiterhin, wechseln in ein anderes Land oder einen Fehler (brechen der Schleife). Diese Art von Algorithmen Programmierung-Algorithmen Lehrbüchern ausführlich behandelt werden, also lassen Sie uns den Code zu Recht:
function ValidEmail(email: string): boolean;
// Returns True if the email address is valid
// Author: Ernesto D'Spirito
const
// Valid characters in an 'atom'
atom_chars = [#33..#255] - ['(', ')', '<', '>', '@', ',', ';', ':',
'\', '/', ''', '.', '[', ']', #127];
// Valid characters in a 'quoted-string'
quoted_string_chars = [#0..#255] - [''', #13, '\'];
// Valid characters in a subdomain
letters = ['A'..'Z', 'a'..'z'];
letters_digits = ['0'..'9', 'A'..'Z', 'a'..'z'];
subdomain_chars = ['-', '0'..'9', 'A'..'Z', 'a'..'z'];
type
States = (STATE_BEGIN, STATE_ATOM, STATE_QTEXT, STATE_QCHAR,
STATE_QUOTE, STATE_LOCAL_PERIOD, STATE_EXPECTING_SUBDOMAIN,
STATE_SUBDOMAIN, STATE_HYPHEN);
var
State: States;
i, n, subdomains: integer;
c: char;
begin
State := STATE_BEGIN;
n := Length(email);
i := 1;
subdomains := 1;
while (i <= n) do begin
c := email[i];
case State of
STATE_BEGIN:
if c in atom_chars then
State := STATE_ATOM
else if c = ''' then
State := STATE_QTEXT
else
break;
STATE_ATOM:
if c = '@' then
State := STATE_EXPECTING_SUBDOMAIN
else if c = '.' then
State := STATE_LOCAL_PERIOD
else if not (c in atom_chars) then
break;
STATE_QTEXT:
if c = '\' then
State := STATE_QCHAR
else if c = ''' then
State := STATE_QUOTE
else if not (c in quoted_string_chars) then
break;
STATE_QCHAR:
State := STATE_QTEXT;
STATE_QUOTE:
if c = '@' then
State := STATE_EXPECTING_SUBDOMAIN
else if c = '.' then
State := STATE_LOCAL_PERIOD
else
break;
STATE_LOCAL_PERIOD:
if c in atom_chars then
State := STATE_ATOM
else if c = ''' then
State := STATE_QTEXT
else
break;
STATE_EXPECTING_SUBDOMAIN:
if c in letters then
State := STATE_SUBDOMAIN
else
break;
STATE_SUBDOMAIN:
if c = '.' then begin
inc(subdomains);
State := STATE_EXPECTING_SUBDOMAIN
end else if c = '-' then
State := STATE_HYPHEN
else if not (c in letters_digits) then
break;
STATE_HYPHEN:
if c in letters_digits then
State := STATE_SUBDOMAIN
else if c <> '-' then
break;
end;
inc(i);
end;
if i <= n then
Result := False
else
Result := (State = STATE_SUBDOMAIN) and (subdomains >= 2);
end;
Jegliche Zusammenarbeit um diese Funktion zu verbessern werden willkommen sein.
Den vollständigen Quellcode dieses Artikels finden Sie im Archiv, die die Pascal Newsletter #22 begleitet.
Überprüfen von e-Mail-Adressen in delphi
Überprüfen von e-Mail-Adressen in delphi : Mehreren tausend Tipps, um Ihr Leben einfacher machen.
Ist eine e-Mail-Adresse gültig?
Überprüfen von e-Mail-Adressen in Delphi
Heutzutage ist es sehr häufig vor, dass unsere Programme als Teil der Daten der Mitarbeiter, Kunden, Anbieter e-Mail-Adressen in Datenbanken speichern. Wenn die Benutzerführung für eine e-Mail-Adresse, wie wissen wir wenn der eingegebene Wert formal korrekt ist? In diesem Artikel zeige ich Ihnen, wie e-Mail-Adressen verwenden eine Variante des RFC #822 überprüft.
Die RFC-822 # Regeln der 'STANDARD für das FORMAT von ARPA INTERNET TEXTNACHRICHTEN'.
Nach dieser Regel sind folgende gültige e-Mail-Adressen:
John Doe der [email protected]
John Doe < als [email protected] >
'John Doe' der [email protected]
'John Doe' < als [email protected] >
The purpose of my code is not to validate such things, but strictly what is necessary to reach a single recipient (like '[email protected]'), that in the specification is referred as an 'addr-spec', which has the form:
local-Part@Domain
- lokal-Teil = ein 'Wort' oder mehr, durch Punkte getrennte
- Domäne = eine 'Sub-Domain' oder mehr, die durch Punkte getrennt
Ein 'Wort' kann ein 'Atom' oder ein 'zitiert-String':
'Sub-Domain' kann eine 'Domäne-Ref' (ein 'Atom') oder 'Domäne-Literal':
- Domäne-Literal = einen Text in eckigen Klammern, die 0 oder mehr Zeichen enthalten kann (#0.. #127) außer ' [', ']' und #13. Ein umgekehrter Schrägstrich ('\ ') zitiert das nächste Zeichen.
Nach RFC-822, erweiterte Zeichen (#128.. #255) kann nicht Teil einer e-Mail-Adresse sein, aber viele Mailserver akzeptieren und Menschen einsetzen, so werde ich diese berücksichtigen.
Die RFC-822 ist sehr offen über Domain-Namen. Vielleicht sollten wir für eine echte Internet-e-Mail-Adresse den Domänenteil einschränken. Lesen Sie mehr über Domain-Namen in der RFC #1034 und RFC 1035 #.
Für den RFC 1034 und RFC 1035, ein Domain-Name wird gebildet, indem 'Subdomains' durch Punkte getrennt, und jede Unterdomäne beginnt mit einem Buchstaben ('a'..' z', 'A'..' Z') und sollte von 0 (null) oder mehr Buchstaben, Ziffern und Bindestriche gefolgt werden, aber dürfen nicht mit einem Bindestrich enden. Wir werden prüfen, daß eine gültige Domain muss mindestens zwei 'Sub-Domains' (wie 'host.com' aus).
Jetzt haben wir die Regeln klar, kommen wir zur Arbeit. Der Algorithmus für die Funktion ähnelt eine Maschine Staaten-Übergang. Zeichen der Zeichenfolge werden in einer Schleife verarbeitet und für jedes Zeichen zuerst wir bestimmen, in welchem Zustand die Maschine ist und dann verarbeiten wir das Zeichen entsprechend, um festzustellen, ob die Maschine sollte in diesem Staat weiterhin, wechseln in ein anderes Land oder einen Fehler (brechen der Schleife). Diese Art von Algorithmen Programmierung-Algorithmen Lehrbüchern ausführlich behandelt werden, also lassen Sie uns den Code zu Recht:
function ValidEmail(email: string): boolean;
// Returns True if the email address is valid
// Author: Ernesto D'Spirito
const
// Valid characters in an 'atom'
atom_chars = [#33..#255] - ['(', ')', '<', '>', '@', ',', ';', ':',
'\', '/', ''', '.', '[', ']', #127];
// Valid characters in a 'quoted-string'
quoted_string_chars = [#0..#255] - [''', #13, '\'];
// Valid characters in a subdomain
letters = ['A'..'Z', 'a'..'z'];
letters_digits = ['0'..'9', 'A'..'Z', 'a'..'z'];
subdomain_chars = ['-', '0'..'9', 'A'..'Z', 'a'..'z'];
type
States = (STATE_BEGIN, STATE_ATOM, STATE_QTEXT, STATE_QCHAR,
STATE_QUOTE, STATE_LOCAL_PERIOD, STATE_EXPECTING_SUBDOMAIN,
STATE_SUBDOMAIN, STATE_HYPHEN);
var
State: States;
i, n, subdomains: integer;
c: char;
begin
State := STATE_BEGIN;
n := Length(email);
i := 1;
subdomains := 1;
while (i <= n) do begin
c := email[i];
case State of
STATE_BEGIN:
if c in atom_chars then
State := STATE_ATOM
else if c = ''' then
State := STATE_QTEXT
else
break;
STATE_ATOM:
if c = '@' then
State := STATE_EXPECTING_SUBDOMAIN
else if c = '.' then
State := STATE_LOCAL_PERIOD
else if not (c in atom_chars) then
break;
STATE_QTEXT:
if c = '\' then
State := STATE_QCHAR
else if c = ''' then
State := STATE_QUOTE
else if not (c in quoted_string_chars) then
break;
STATE_QCHAR:
State := STATE_QTEXT;
STATE_QUOTE:
if c = '@' then
State := STATE_EXPECTING_SUBDOMAIN
else if c = '.' then
State := STATE_LOCAL_PERIOD
else
break;
STATE_LOCAL_PERIOD:
if c in atom_chars then
State := STATE_ATOM
else if c = ''' then
State := STATE_QTEXT
else
break;
STATE_EXPECTING_SUBDOMAIN:
if c in letters then
State := STATE_SUBDOMAIN
else
break;
STATE_SUBDOMAIN:
if c = '.' then begin
inc(subdomains);
State := STATE_EXPECTING_SUBDOMAIN
end else if c = '-' then
State := STATE_HYPHEN
else if not (c in letters_digits) then
break;
STATE_HYPHEN:
if c in letters_digits then
State := STATE_SUBDOMAIN
else if c <> '-' then
break;
end;
inc(i);
end;
if i <= n then
Result := False
else
Result := (State = STATE_SUBDOMAIN) and (subdomains >= 2);
end;
Jegliche Zusammenarbeit um diese Funktion zu verbessern werden willkommen sein.
Den vollständigen Quellcode dieses Artikels finden Sie im Archiv, die die Pascal Newsletter #22 begleitet.
Überprüfen von e-Mail-Adressen in delphi
By Wiezutun
Überprüfen von e-Mail-Adressen in delphi : Mehreren tausend Tipps, um Ihr Leben einfacher machen.