Link: Wichtiger Hinweis in eigener Sache!
| Autor: Klaus Keller | Erstellt am: 2002-10-24 | Geändert am: 2004-03-08 | Aufrufe: 27728 |
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:
- Mind. 1 Zeichen ist vor dem @-Zeichen.
- Das @-Zeichen ist im String enthalten.
- Mind. 2 Zeichen stehen nach dem @-Zeichen und vor dem Punkt (also das Hallo).
- Es ist ein Punkt enthalten.
- Top-Level-Domain (hier "de") ist korrekt.
- 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 |
|