asphelper.de - Tipps & Skripts - Email-Adresse prüfen, die zweite

Link: Wichtiger Hinweis in eigener Sache!


 Autor: Klaus Keller Erstellt am: 2002-10-24  Geändert am: 2004-03-08 Aufrufe: 27691 


 << Vorheriger Tipp Nächster Tipp >>



Tipp 18: Email-Adresse prüfen, die zweite



In Erweiterung zu Email-Adresse prüfen, Tipp 15, soll nun nicht nur geprüft werden, ob das @ angeben wurde, und ob der "." Punkt angegeben wurde, sondern es wird auch noch geprüft, ob der Top-Level Domainnamen korrekt angegeben wurde. Steht in der Email-Adresse de, at, ch, com, org.....?

So sieht z.B. eine korrekte Adresse aus:
Info@Hallo.de
Geprüft wird:
  1. Mind. 1 Zeichen ist vor dem @-Zeichen.
  2. Das @-Zeichen ist im String enthalten.
  3. Mind. 2 Zeichen stehen nach dem @-Zeichen und vor dem Punkt (also das Hallo).
  4. Es ist ein Punkt enthalten.
  5. Top-Level-Domain (hier "de") ist korrekt.
  6. Es ist nur ein @-Zeichen vorhanden


Diese 5 Punkte werden geprüft. Allerdings: Es gibt immer wieder neue Top-Level-Domains, eine neue ist z.B. ".eu". Gibt es neue Top-Level-Domains, müssen diese natürlich in den String "arrDomains=..." eingetragen werden, da sonst die Prüfung des neuen Top-Level-Domain Namens nicht korrekt funktioniert.

Update:
Mit der Einführung der IDN-Domains wird das Prüfen einer Email-Adresse leider deutlich erschwert. IDN-Domains geben den Domainvergabestellen wie z.B. denic.de die Möglichkeit, nicht nur Domainnamen zu vergeben die nur Zeichen aus dem einfachen ASCII-Code haben. Wollte man den Internetauftritt der Stadt München besuchen, so musste man dazu das ü in ue ändern. Mit IDN-Domains kann man auch ü in Domainnamen verwenden. Bisher konnten die Domain-Vergabestellen u.a. die Länge der Domains (maximale und minimale) bestimmen. So sind z.B. mindestens 3 Zeichen bei den Domainnamen für eine .de-Domain erforderlich. Bei at-Domains reichen schon 2 Zeichen. Mehr Informationen rund um IDN finden Sie unter http://www.i-d-n.net.

Mit IDN kommt noch eine weitere Entscheidungsfreiheit dazu, die Zeichen. Dabei kann jede Domainvergabestelle Zeichen aus dem UNICODE vergeben. Natürlich nicht alle, aber es ist ausreichend genug, um jede Emailprüfung zur (fast-)Doktorarbeit zu machen. Angefangen von den Umlauten, Arabischen Zeichen bis hin zu Japanischen Zeichen. Wie also das ganze prüfen, ohne eine Whois-Abfrage zu starten? Ich stelle Ihnen hier gleich 3 Versionen vor, mit der Sie Email-Adressen prüfen können. Vorweg allerdings noch ein wichtiger Hinweis: Die neuen Zeichen sind nur innerhalb des Domainnamens möglich (also asphelper.de), nicht jedoch für den Namen des Emailskontos (z.B. Irgendwas@asphelper.de, das Irgendwas)

Die erste Version ist eine einfache Erweiterung der bisherigen, hier veröffentlichten Version. Dabei werden die Buchstaben äöü als korrekt angesehen. Falls ein Eszet ( ß ) angegeben wurde, wird dies für die Prüfung in zwei s umgewandelt, da die Domainvergabestellen wie z.B. denic.de auch diese Wandlung vornehmen, somit ist für die Denic eine Domain mit einem ß die gleiche Domain wie eine mit den zwei s. Bei allen 3 Versionen wurde dazu die Prüfung der Top-Level-Domainnamen optimiert. So wurde die Reihenfolge geändert, damit de, at, ch, com usw. effektiver geprüft werden. Hier nun die erste Version:

1   
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
Public Function CheckEmail(ByVal PruefAdresse)
    'Version 1.3, letzte Änderung: 07.03.2004
    Dim strDomains, arrDomains, i, Adresse, Laenge, Flag, SetAt
    Dim SetAtPlace, Character, ASCII, ix
    SetAt = false
    PruefAdresse = LCase(PruefAdresse)
    PruefAdresse = Replace(PruefAdresse, "ß", "ss")
    Laenge = len(PruefAdresse)
    
    If Laenge > 0 Then
        If instr(2,PruefAdresse,"@") > 0 Then
            If instr(instr(1,PruefAdresse,"@")+ 3,PruefAdresse,".") > 0 then
                Adresse=Right(PruefAdresse,Laenge-InstrRev(PruefAdresse,".",-1))
                arrDomains = Array("de","at","ch","com","org","net","aero", _
                "ac","ad","ae","af","ag","ai","al","am","an","ao","aq","ar", _
                "arpa","as","au","aw","az","ba","bb","bd","be","bf","bg", _
                "bh","bi","biz","bj","bm","bn","bo","br","bs","bt","bv", _
                "bw","by","bz","ca","cc","cd","cf","cg","ci","ck","cl", _
                "cm","cn","co","coop","cr","cu","cv","cx","cy","cz","dj", _
                "dk","dm","do","dz","ec","edu","ee","eg","eh","er","es", _
                "et","eu","fi","fj","fk","fm","fo","fr","ga","gd","ge", _
                "gf","gg","gh","gi","gl","gm","gn","gov","gp","gq","gr", _
                "gs","gt","gu","gw","gy","hk","hm","hn","hr","ht","hu", _
                "id","ie","il","im","in","info","io","iq","ir","is","it", _
                "je","jm","jo","jp","ke","kg","kh","ki","km","kn","kp", _
                "kr","kw","ky","kz","la","lb","lc","li","lk","lr","ls", _
                "lt","lu","lv","ly","ma","mc","md","mg","mh","mk","ml", _
                "mm","mn","mo","mp","mq","mr","ms","mt","mu","museum","mv", _
                "mw","mx","my","mz","na","name","nc","ne","nf","ng","ni", _
                "nl","no","np","nr","nu","nz","om","pa","pe","pf","pg", _
                "ph","pk","pl","pm","pn","pr","pro","ps","pt","pw","py", _
                "qa","re","ro","ru","rw","sa","sb","sc","sd","se","sg", _
                "sh","si","sj","sk","sl","sm","sn","so","sr","st","su", _
                "sv","sy","sz","tc","td","tf","tg","th","tj","tk","tm", _
                "tn","to","tp","tr","tt","tv","tw","tz","ua","ug","uk", _
                "um","us","uy","uz","va","vc","ve","vg","vi","vn","vu", _
                "wf","ws","ye","yt","yu","za","zm","zr","zw")
                For i = 0 to Ubound(arrDomains)
                    If arrDomains(i) = LCase(Adresse) Then
                        Flag = true
                        Exit For
                    End if
                Next
                If Flag Then
                    SetAtPlace = instr(2, PruefAdresse, "@")
                    For ix = 1 To Laenge
                        Character = mid(PruefAdresse,ix,1)
                        Ascii = asc(Character)
                        If Character = "@" Then
                            If SetAt Then
                                CheckEmail = false
                                Exit Function
                            Else
                                SetAt = true
                            End If
                        ElseIf ix > SetAtPlace Then
                            If NOT (Character = "." OR Character = "_" OR _
                                Character = "-" OR (ASCII > 47 AND ASCII < 58) OR _
                                (ASCII > 96 AND ASCII < 123) OR _
                                ASCII = 228 OR ASCII = 246 OR ASCII = 252) Then
                                    CheckEmail = false
                                    Exit Function
                            End If
                        ElseIf NOT (Character = "." OR Character = "_" OR _
                            Character = "-" OR (ASCII > 47 AND ASCII < 58) OR _
                            (ASCII > 96 AND ASCII < 123)) Then
                                CheckEmail = false
                                Exit Function
                        End if
                    Next
                    CheckEmail = true
                    Exit Function
                End If
            End if
        End if
    End if
    CheckEmail = false
End Function



Die zweite Version ist dann schon etwas anspruchsvoller. Die Deutsche Domain-Vergabestelle hat neben den ASCII Zeichen noch weitere 92 Zeichen aus dem (Unicode-)Latin-1-Zeichensatz in Domainnamen als gültig erklärt. nic.at, die Domainvergabestelle für at-Domains hat hingegen nur 34 als zusätliche Zeichen für gültig erklärt. Für ch-Domains gibt es dagegen "nur" 27 neue Zeichen aus dem Unicode. Nähere Informationen unter folgenden Adressen:
http://www.denic.de/de/faqs/idn_faqs/index.html
http://www.nic.at/de/service/idn/ia_austria.asp
http://www.switch.ch/de/id/idn/

Aufgrund der Vielfalt der TopLevelDomains (tld, z.B. de, at, ch) wird nicht für jede tld eine Prüfung durchgeführt. Es wird nur auf jene 92 Zeichen geprüft, welche von Denic.de als Korrekt gesehen werden. Denn die zusätzlichen Zeichen bei at, ch sind in diesen 92 Zeichen mit enthalten. Der Quellcode dazu:
1   
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
Public Function CheckEmail(ByVal PruefAdresse)
    'Version 1.4, letzte Änderung: 07.03.2004
    Dim strDomains, arrDomains, i, Adresse, Laenge, Flag, SetAt
    Dim SetAtPlace, index, SignFound, arrSonderZeichen, Character
    Dim ASCII, ix

    
    PruefAdresse = LCase(PruefAdresse)
    PruefAdresse = Replace(PruefAdresse, "ß", "ss")
    
    i = InStr(PruefAdresse, "&#")
    Do While i > 0
        PruefAdresse = Left(PruefAdresse, i - 1) _
             & ChrW(CLng(Mid(PruefAdresse, i + 2, 3))) _
             & Mid(PruefAdresse, i + 6)
        i = InStr(i + 1, PruefAdresse, "&#")
    Loop

    SetAt = false
    Laenge = len(PruefAdresse)
    If Laenge > 0 Then
        If instr(2,PruefAdresse,"@") > 0 Then
            If instr(instr(1,PruefAdresse,"@")+ 3,PruefAdresse,".") > 0 then
                Adresse=Right(PruefAdresse,Laenge-InstrRev(PruefAdresse,".",-1))
                arrDomains = Array("de","at","ch","com","org","net","aero", _
                "ac","ad","ae","af","ag","ai","al","am","an","ao","aq","ar", _
                "arpa","as","au","aw","az","ba","bb","bd","be","bf","bg", _
                "bh","bi","biz","bj","bm","bn","bo","br","bs","bt","bv", _
                "bw","by","bz","ca","cc","cd","cf","cg","ci","ck","cl", _
                "cm","cn","co","coop","cr","cu","cv","cx","cy","cz","dj", _
                "dk","dm","do","dz","ec","edu","ee","eg","eh","er","es", _
                "et","eu","fi","fj","fk","fm","fo","fr","ga","gd","ge", _
                "gf","gg","gh","gi","gl","gm","gn","gov","gp","gq","gr", _
                "gs","gt","gu","gw","gy","hk","hm","hn","hr","ht","hu", _
                "id","ie","il","im","in","info","io","iq","ir","is","it", _
                "je","jm","jo","jp","ke","kg","kh","ki","km","kn","kp", _
                "kr","kw","ky","kz","la","lb","lc","li","lk","lr","ls", _
                "lt","lu","lv","ly","ma","mc","md","mg","mh","mk","ml", _
                "mm","mn","mo","mp","mq","mr","ms","mt","mu","museum","mv", _
                "mw","mx","my","mz","na","name","nc","ne","nf","ng","ni", _
                "nl","no","np","nr","nu","nz","om","pa","pe","pf","pg", _
                "ph","pk","pl","pm","pn","pr","pro","ps","pt","pw","py", _
                "qa","re","ro","ru","rw","sa","sb","sc","sd","se","sg", _
                "sh","si","sj","sk","sl","sm","sn","so","sr","st","su", _
                "sv","sy","sz","tc","td","tf","tg","th","tj","tk","tm", _
                "tn","to","tp","tr","tt","tv","tw","tz","ua","ug","uk", _
                "um","us","uy","uz","va","vc","ve","vg","vi","vn","vu", _
                "wf","ws","ye","yt","yu","za","zm","zr","zw")
                For i = 0 to Ubound(arrDomains)
                    If arrDomains(i) = LCase(Adresse) Then
                        Flag = true
                        Exit For
                    End if
                Next
                If Flag Then
                    SetAtPlace = instr(2, PruefAdresse, "@")
                    For ix = 1 To Laenge
                        Character = mid(PruefAdresse,ix,1)
                        Ascii = ascW(Character)
                        If Character = "@" Then
                            If SetAt Then
                                CheckEmail = false
                                Exit Function
                            Else
                                SetAt = true
                            End If
                        ElseIf ix > SetAtPlace Then
                            If NOT (Character = "." OR Character = "_" OR _
                                Character = "-" OR (ASCII > 47 AND ASCII < 58) OR _
                                (ASCII > 96 AND ASCII < 123) OR _
                                ASCII = 228 OR ASCII = 246 OR ASCII = 252) Then
                                arrSonderZeichen = Array(224,225,226,227,228,_
                                        229,230,231,232,233,234,235,236,237, _
                                        238,239,240,241,242,243,244,245,246, _
                                        248,249,250,251,252,253,254,255,257, _
                                        259,261,263,265,267,269,271,273,275, _
                                        277,279,281,283,285,287,289,291,293, _
                                        295,297,299,301,303,305,309,311,312, _
                                        314,316,318,322,324,328,326,331,335, _
                                        337,333,339,341,343,345,347,349,351, _
                                        353,355,357,359,361,363,365,367,369, _
                                        371,373,375,378,380,382)
                                SignFound = false
                                For index = 0 to Ubound(arrSonderZeichen)
                                    If ASCII = arrSonderZeichen(index) Then
                                        SignFound = true
                                        Exit For
                                    End If
                                Next
                                If NOT SignFound Then
                                    CheckEmail = false
                                    Exit Function
                                End If
                            End If
                        ElseIf NOT (Character = "." OR Character = "_" OR _
                            Character = "-" OR (ASCII > 47 AND ASCII < 58) OR _
                            (ASCII > 96 AND ASCII < 123)) Then
                            CheckEmail = false
                            Exit Function
                        End if
                    Next
                    CheckEmail = true
                    Exit Function
                End If
            End if
        End if
    End if
    CheckEmail = false
End Function


Allerdings setzt diese Version eine Besonderheit voraus.
Ascii = ascW(Character)
ascW, W steht dabei für Wide Character, Unicode. Damit dies wie gewünscht funktioniert, muss die Codepage sowohl Serverseitig als auch Clientseitig (per HTML) auf Unicode eingestellt sein. Das setzt dann eventuelle Änderungen an Ihren Seiten voraus, so könnte das ganze aussehen:
1   
2
3
4
5
6
7
8
9
10
11
12
13
<% @ Language="VBScript"
   codepage = 1252 %><%
   Session.CodePage = 1252
%>
<html>
  <head>
    <meta http-equiv="content-type" content="text/html;charset=ISO-8859-1">
  </head>
  <body>
    Test!
  </body>
</html>

Mit charset=ISO-8859-1 wird dem Browser mitgeteilt, daß der Unicode, Latin-1-Zeichensatz verwendet wird, der Zeichensatz für die Lateinischen Schriften. Ohne die Angaben von Codepage und content-type werden die Sonderzeichen bzw. Unicode-Zeichen im ASP-Skript nicht korrekt ausgewertet und im HTML-Code nicht richtig dargestellt.

Der Nachteil der ersten Version liegt wohl darin, daß nicht alle möglichen Zeichen geprüft werden. Die zweite Version hat den Nachteil, daß nicht alle Zeichen für alle TopLevelDomains korrekt geprüft werden, sondern lediglich jene aus dem Latin-1-Zeichensatz. Dazu ist es wahrscheinlich, daß es in der Zukunft weitere zusätzliche Zeichen in den Domainnamen geben kann. Die dritte Version ist diesbezüglich anders ausgelegt. Die Zeichen in den Domain-Namen werden nicht mehr auf korrekte Zeichen geprüft, sondern lediglich die Zeichen vor dem @-Zeichen, denn diese müssen weiterhin dem einfachen ASCII-Code entsprechen.

Die dritte Version:
1   
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
Public Function CheckEmail(ByVal PruefAdresse)
    'Version 1.41, letzte Änderung: 07.03.2004
    Dim strDomains, arrDomains, i, Adresse, Laenge, Flag, SetAt
    Dim SetAtPlace, Character, ASCII, ix
    SetAt = false
    PruefAdresse = LCase(PruefAdresse)
    PruefAdresse = Replace(PruefAdresse, "ß", "ss")
    Laenge = len(PruefAdresse)
    
    If Laenge > 0 Then
        If instr(2,PruefAdresse,"@") > 0 Then
            If instr(instr(1,PruefAdresse,"@")+ 3,PruefAdresse,".") > 0 then
                Adresse=Right(PruefAdresse,Laenge-InstrRev(PruefAdresse,".",-1))
                arrDomains = Array("de","at","ch","com","org","net","aero", _
                "ac","ad","ae","af","ag","ai","al","am","an","ao","aq","ar", _
                "arpa","as","au","aw","az","ba","bb","bd","be","bf","bg", _
                "bh","bi","biz","bj","bm","bn","bo","br","bs","bt","bv", _
                "bw","by","bz","ca","cc","cd","cf","cg","ci","ck","cl", _
                "cm","cn","co","coop","cr","cu","cv","cx","cy","cz","dj", _
                "dk","dm","do","dz","ec","edu","ee","eg","eh","er","es", _
                "et","eu","fi","fj","fk","fm","fo","fr","ga","gd","ge", _
                "gf","gg","gh","gi","gl","gm","gn","gov","gp","gq","gr", _
                "gs","gt","gu","gw","gy","hk","hm","hn","hr","ht","hu", _
                "id","ie","il","im","in","info","io","iq","ir","is","it", _
                "je","jm","jo","jp","ke","kg","kh","ki","km","kn","kp", _
                "kr","kw","ky","kz","la","lb","lc","li","lk","lr","ls", _
                "lt","lu","lv","ly","ma","mc","md","mg","mh","mk","ml", _
                "mm","mn","mo","mp","mq","mr","ms","mt","mu","museum","mv", _
                "mw","mx","my","mz","na","name","nc","ne","nf","ng","ni", _
                "nl","no","np","nr","nu","nz","om","pa","pe","pf","pg", _
                "ph","pk","pl","pm","pn","pr","pro","ps","pt","pw","py", _
                "qa","re","ro","ru","rw","sa","sb","sc","sd","se","sg", _
                "sh","si","sj","sk","sl","sm","sn","so","sr","st","su", _
                "sv","sy","sz","tc","td","tf","tg","th","tj","tk","tm", _
                "tn","to","tp","tr","tt","tv","tw","tz","ua","ug","uk", _
                "um","us","uy","uz","va","vc","ve","vg","vi","vn","vu", _
                "wf","ws","ye","yt","yu","za","zm","zr","zw")
                For i = 0 to Ubound(arrDomains)
                    If arrDomains(i) = LCase(Adresse) Then
                        Flag = true
                        Exit For
                    End if
                Next
                If Flag Then
                    SetAtPlace = instr(2, PruefAdresse, "@")
                    For ix = 1 To SetAtPlace - 1
                        Character = mid(PruefAdresse,ix,1)
                        Ascii = asc(Character)
                        If NOT (Character = "." OR Character = "_" OR _
                          Character = "-" OR (ASCII > 47 AND ASCII < 58) OR _
                          (ASCII > 96 AND ASCII < 123)) Then
                            CheckEmail = false
                            Exit Function
                        End if
                    Next
                    CheckEmail = true
                    Exit Function
                End If
            End if
        End if
    End if
    CheckEmail = false
End Function




 << Zum vorherigen Tipp 17:
Login bzw. Geschützter Bereich

 Zum nächsten Tipp 19 >>
Alle Tabellen einer Datenbank anzeigen

top top
© Copyright By Klaus Keller, 2001-2008 - Alle Rechte vorbehalten.