Ü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':

  • Atom ein oder mehrere Zeichen im Bereich von #33 =.. #126 außer () <> bei,: \ /'. []
  • Zeichenfolge in Anführungszeichen = einen Text in doppelte Anführungszeichen gesetzt, die 0 oder mehr Zeichen enthalten kann (#0.. #127) außer ' '' und #13. Ein umgekehrter Schrägstrich ('\ ') zitiert das nächste Zeichen.


'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':

  • Atom ein oder mehrere Zeichen im Bereich von #33 =.. #126 außer () <> bei,: \ /'. []
  • Zeichenfolge in Anführungszeichen = einen Text in doppelte Anführungszeichen gesetzt, die 0 oder mehr Zeichen enthalten kann (#0.. #127) außer ' '' und #13. Ein umgekehrter Schrägstrich ('\ ') zitiert das nächste Zeichen.


'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.
Überprüfen von e-Mail-Adressen in delphi
Wiezutun
Freunden empfehlen
  • gplus
  • pinterest

Kommentar

Einen Kommentar hinterlassen

Wertung