![]() |
E-Mail-Syntax überprüfen |
| E-Mail: |
|---|
Bei Fragen zu diesem Beitrag bitte den Autor des Beitrags kontaktieren!
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
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).
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
isDigit( ch ) : wahr, wenn das Zeichen eine Zahl istisAlpha( ch ) : wahr, wenn das Zeichen ein Buchstabe istisAlnum( ch ) : wahr, wenn das Zeichen alphanumerisch istnotIn( str1, str2 ) : wahr, wenn kein Zeichen aus str2 in str1 vorkommtcheckUsername( username, mustBeQuoted ) : wahr, wenn der Username gültig istcheckNr( nr ) : wahr, wenn eine Zifferfolge vorliegtcheckIpnr( ipnr ) : wahr, wenn IP-Adresse als gültig eingestuft wurdecheckFqdn( fqdn ) : wahr, wenn der Fully Qualified Domain Name als gültig eingestuft wurdecheckHostname( hostname ) : wahr, wenn der Hostname als gültig eingestuft wurdecheckEmailAdr( address ) : wahr, wenn die E-mail ohne Realname als gültig eingestuft wurdecheckEmail( email, allowFullname ) : wahr, wenn die E-Mail Adresse als gültig eingestuft wurde, wobei der zweite Parameter festlegt, ob Realname akzeptiert werden oder nichtDas 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
Formulareingaben überprüfen.
Geben Sie eine E-Mail Adresse ein (und probieren Sie ruhig auch mal syntaktisch falsche Adressen aus):