Teil von SELFHTML aktuell Teil von Artikel Teil von JavaScript

E-Mail-Syntax überprüfen

nach unten Lutz Eymers
nach unten Zum Thema
nach unten Das Script
nach unten Ausprobieren

Lutz Eymers

E-Mail: E-Mail lutz@polzin.com

Bei Fragen zu diesem Beitrag bitte den Autor des Beitrags kontaktieren!

nach obennach unten

Zum Thema

Ein klassisches Problem, das einem beim Erstellen von HTML Forms immer wieder begegnet, ist das Prüfen der vom User eingegebenen E-Mail Adresse. Es gibt zwar die Möglichkeit, eine Syntax- oder eine Validitätsprüfung per CGI-Script auf der Serverseite vorzunehmen. Aber nicht immer besteht die Möglichkeit, selbstprogrammierte CGI Programme einzusetzen. Zudem kann eine Clientseitige Überprüfung die Serverlast auch erheblich verringern.

Zu diesem Zweck habe ich eine Javascript Funktion geschrieben, die eine Syntaxprüfung nach englischsprachige Seite RFC819 (Appendix A: BNF Specification) duchführt. Das Script stuft eine E-Mail Adresse als gültig ein, wenn sie dem Schema "user @ FQDN" oder "user @ IPADDRESS" nach RCF819 entspricht. Auch einige Besonderheiten bzgl. Quoted Strings (Realnames, etc.) sollten beachtet werden.

Wir setzen dieses Script mittlerweile in allen HTML Forms ein, bei denen die Angabe einer E-Mail Adresse notwendig ist (Bestellformulare, Anmdeldeformulare, etc.). Je nach Verwendungszweck, kann man das Script entweder mit einem JavaScript Confirm oder einem Alert verbinden.

Der Autor ist dankbar über eine Benachrichtigung, falls eine gültige E-Mail Adresse fälschlicherweise vom Script als ungültig eingestuft wird (nur TCP/IP; ausgenommen sind natürlich UUCP, DECnet und andere Protokolle).

nach obennach unten

Das Script

Das Script sollte im Kopf der HTML-Datei notiert werden, in der das auch das Formular mit der zu überprüfenden E-Mail Adresse steht.

<SCRIPT language="JavaScript1.1">
/*
  Copyright Lutz Eymers <ixtab@polzin.com>, 1997
  Polzin GmbH, Duesseldorf
*/
<!--
  function isDigit( ch )
  {
    if ( (ch >= '0') && (ch <= '9') )
      return true;
    else
      return false;
  }


  function isAlpha( ch )
  {
    if ( ((ch >= 'a') && (ch <= 'z')) || ((ch >= 'A') && (ch <= 'Z')) )
      return true;
    else
      return false;
  }


  function isAlnum( ch )
  {
    if ( isAlpha( ch ) || isDigit( ch ) )
      return true;
    else
      return false;
  }


  function notIn( str1, str2 )
  {
    var i = 0;
    var j = str2.length;
    for( ; i<j; i++ )
    {
      var str3 =  str2.charAt(i);
      if( str1.indexOf( str3 ) != -1 )
        return false;
    }
    return true;
  }


  function checkUsername( username, mustBeQuoted )
  {
    var i = 0;
    var j = username.length;
    if ( username.charAt(0) != '"' )
    {
      if ( (username.charAt(0) <  ' ') || (username.charAt(0) >  '~')
            || !notIn( mustBeQuoted, username.charAt(0) ) )
        return false;
      for( i=1; i<j; i++ )
      {
        if ( ( (username.charAt(i) < ' ') || (username.charAt(i) >  '~')
              || !notIn ( mustBeQuoted, username.charAt(i) ) )
             && ( username.charAt(i-1) != '\\' ) )
          return false;
      }
    }
    else
    {
      if ( username.charAt( j-1 ) != '"' )
        return false;
      for( i=1; i<j-1; i++ )
      {
        if ( ( (username.charAt(i) == '\n') || (username.charAt(i) == '\r')
              || (username.charAt(i) == '\"') )
            && (username.charAt(i-1) != '\\') )
          return false;
      }

    }
    return true;
  }


  function checkNr ( nr )
  {
    var i=0;
    var j=nr.length;

    if( j < 1 )
      return false;

    for( ; i<j; i++ )
      if( ( nr.charAt(i) < '0' ) || ( nr.charAt(i) > '9' ) )
        return false;

    return true;
  }


  function checkIpnr( ipnr )
  {
    var iL=0;
    var iC=0;
    var i=0;
    var sNr = "";

    for( ; i< ipnr.length; i++ )
    {
      if ( ipnr.charAt(i) == '.' )
      {
        if ( !iL || (iL> 3) || parseInt( sNr,10 ) > 255 )
          return false;
        iC++;
        iL = 0;
        sNr = "";
        continue;
      }
      if ( isDigit ( ipnr.charAt(i) ) )
      {
        iL++;
        sNr = sNr + ipnr.charAt(i);
        continue;
      }
      return false;
    }

    if ( parseInt( sNr,10 ) > 255 )
      return false;
    if ( ( (iC==3) && (iL>=1) && (iL<=3) ) || ( (iC==4) && (!iL) )  )
      return true;
    else
      return false;
  }


  function checkFqdn( fqdn )
  {
    var iL=0;
    var iC=0;
    var i=fqdn.length-1;

    if ( (fqdn.charAt(0) == '.') || (fqdn.charAt(0) == '-') )
      return false;
    if ( fqdn.charAt(i) == '.' )
      i=i-1;

    for( ; i>=0; i-- )
    {
      if ( fqdn.charAt(i) == '.' )
      {
        if ( iL < 2 && iC < 2 )
          return false;
        if ( fqdn.charAt(i-1) == '-' )
          return false;
        iC++;
        iL = 0;
        continue;
      }
      if ( isAlnum ( fqdn.charAt(i) ) )
      {
        iL++;
        continue;
      }
      if ( fqdn.charAt(i) == '-' )
      {
        if ( !iL )
          return false;
        iL++;
        continue;
      }
      return false;
    }

    if ( !iC || ( iL == 1 && iC < 2 ) || ( !iL && iC==1 ) ) {
      return false;
    }

    return true;

  }


  function checkHostname( hostname )
  {
    if ( hostname.charAt(0) == '[' )
    {
      if ( hostname.charAt(hostname.length-1) != ']' )
        return false;
      var ipnr = hostname.substring( 1, hostname.length -1 );
        return checkIpnr( ipnr );
    }

    if ( hostname.charAt(0) == '#' )
    {
      var nr = hostname.substring( 1, hostname.length );
        return checkNr( nr );
    }

    return checkFqdn( hostname );
  }


  function checkEmailAdr( address )
  {
    var status = true;
    var username = "";
    var hostname = "";

    if ( address.length < 8 )
      return false;

    var seperate = address.lastIndexOf("@");
    if ( seperate == -1 )
      return false;

    username = address.substring(0, seperate );
    if ( ! checkUsername( username, "<>()[],;:@\" " ) )
      return false;

    hostname = address.substring(seperate+1, address.length );
    if ( ! checkHostname( hostname ) )
      return false;

    return true;
  }


  function checkEmail( email, allowFullname )
  {
    var existFullname = false;
    var status = true;
    var fullname = "";
    var adress = "";
    if ( email.length < 8 )
      return false;
    var emailBegin = email.indexOf("<");
    var emailEnd = email.lastIndexOf(">");

    if ( (emailBegin == -1) && (emailEnd == -1) )
      return checkEmailAdr( email );

    if ( ( (emailBegin == -1) && (emailEnd != -1) )
        || ( (emailBegin != -1) && (emailEnd == -1) ) )
      return false;

    adress = email.substring( emailBegin+1, emailEnd );

    if ( ! checkEmailAdr( adress ) )
      return false;

    if ( email.length == adress.length + 2 )
      return true;
    else
      if ( ! allowFullname )
        return false;

    if ( emailEnd == email.length - 1 )
    {
      if ( emailBegin == 0 )
        return true;
      if ( email.charAt( emailBegin -1 ) != ' ' )
        return false;
      fullname = email.substring( 0, emailBegin-1 );
      return checkUsername ( fullname, "<>()[],;:@\"" );
    }

    return false ;

  }
//-->
</SCRIPT>
<SCRIPT language="JavaScript1.1">
<!--
  var js11=true;
//-->
</SCRIPT>
<SCRIPT language="JavaScript">
<!--
  function checkForm( form )
  {
    var warn = "";
    if ( form.email.value == "" ) {
      warn = "Bitte geben Sie ihre E-Mail-Adresse ein!\n";
    }
    else
    {
      if ( js11 ) {
        if ( ! checkEmail( form.email.value, true ) ) {
          warn = "Ihre E-Mail-Adresse ist syntaktisch falsch!\n";
        } else {
          return true;
        }
      }
    }
    if ( warn != "" ) {
      alert( "Fehler!\n\n" + warn );
    }
    return false;
  }
//-->
</SCRIPT>

Ein Formular in der Datei, das dieses Script zur Überprüfung benutzt, kann z.B. folgenden Aufbau haben:

<FORM ACTION="/artikel/cgi-bin/javascript/email-check/comments.pl" METHOD="post" onSubmit="return checkForm( this )">
  <INPUT TYPE="text" SIZE="49" NAME="email" MAXLENGTH="128"><BR>
  <INPUT TYPE="SUBMIT" VALUE="Absenden">
</FORM>

Es folgt eine kurze Übersicht über die definierten Funktionen

Das Script zerlegt eine E-Mail Adresse sukzessive in ihre semantische Bestandteile und überprüft diese dann einzeln auf syntaktische Korrektheit.

e.g "Lutz Eymers" <batxi@ixtab.de>

Im Beispiel wird in einem zweiten Scriptbereich eine übergeordnete Funktion checkForm( form ) definiert, die als "Vermittlungszentrale" zwischen HTML-Code und JavaScript dient. Im zweiten Teil des Beispiels wird die Funktion im einleitenden <form>-Tag aufgerufen. Allgemeineres zu dieser Art, eine JavaScript-Syntax-Prüfung vor dem Absenden durchzuführen, finden Sie innerhalb von SELFHTML im JavaScript-Beispiel Seite Formulareingaben überprüfen.

nach obennach unten

Ausprobieren

Geben Sie eine E-Mail Adresse ein (und probieren Sie ruhig auch mal syntaktisch falsche Adressen aus):


Teil von SELFHTML aktuell Teil von Artikel Teil von JavaScript

© 2007 bereichsübergreifende Seite Impressum