Regex-Validierung von E-Mail-Adressen nach RFC5321 / RFC5322

8

Kennt jemand eine Regex, die E-Mail-Adressen nach RFC5321 / RFC5322 ?

Da (nestbare) Kommentare die Grammatik unregelmäßig machen, sollten nur Adressen ohne Kommentare betrachtet werden.

Wenn Sie eine Adresse validieren möchten, die tatsächlich jemandem gehört, besteht die einzige echte Validierung darin, eine E-Mail an die Adresse zu senden und zu überprüfen, ob der Eigentümer sie erhalten hat. Ich bin jedoch rein interessiert an den RFC-Standards. Für einen praktischen Ansatz ist diese Frage relevanter.

Zusätzlich zu Kommentaren bin ich bereit, faltbaren Leerraum zu opfern, aber abgesehen davon bin ich nicht an Ausdrücken interessiert, die irgendwelche Adressen ablehnen, die RFC5321 / 2-gültig sind. (Unter bestimmten Umständen wäre es sogar sinnvoll, den faltbaren Leerraum außer Acht zu lassen.)

Im Idealfall würde die Regex alles ablehnen, was nicht RFC-gültig ist, aber das ist weniger wichtig. Es ist nicht so interessant, eine exorbive Liste von Top-Level-Domains zum Beispiel in die Regex aufzunehmen. Es genügt, eine Top-Level-Domain zu akzeptieren.

Ich bin mir nicht sicher, ob Adress-Tags (z.B. Adresse + [email protected]) Teil der RFCs sind, die ich erwähnt habe, aber ich möchte, dass die Regex diese validiert.

IPv6 sollte definitiv korrekt behandelt werden ( RFC5952 ).

Wie ich verstehe, internationalisierte E-Mail ( RFC6530 , RFC6531 , RFC6532 , RFC6533 ) ist noch in der experimentellen Phase, aber ein Ausdruck, der diese Adressen validiert, wäre auch interessant.

Um die Antworten allgemein interessant zu machen, wäre es schön, wenn irgendwelche regulären Ausdrücke im POSIX-Format wären.

    
Rinke 21.12.2012, 15:02
quelle

2 Antworten

10

Nestbare Kommentare machen die Grammatik für E-Mail-Adressen unregelmäßig (kontextfrei). Wenn Sie Kommentare jedoch ausschließen, ist die resultierende Grammatik regelmäßig. Die primäre Definition ermöglicht (faltende) Leerzeichen zwischen lexikalischen Token (z. B. a @ b.com ). Das Entfernen aller faltbaren Leerzeichen führt zu einer kanonischen Form.

Dies ist die Regex für kanonische E-Mail-Adressen nach RFC 5322 (Ausschluss von Kommentaren):

([!#-'*+/-9=?A-Z^-~-]+(\.[!#-'*+/-9=?A-Z^-~-]+)*|"([]!#-[^-~ \t]|(\[\t -~]))+")@([!#-'*+/-9=?A-Z^-~-]+(\.[!#-'*+/-9=?A-Z^-~-]+)*|\[[\t -Z^-~]*])

Wenn Sie faltbare Leerzeichen akzeptieren müssen, ist dies der reguläre Ausdruck für E-Mail-Adressen gemäß RFC 5322 (Ausschluss von Kommentaren):

((([\t ]*\r\n)?[\t ]+)?[-!#-'*+/-9=?A-Z^-~]+(\.[-!#-'*+/-9=?A-Z^-~]+)*(([\t ]*\r\n)?[\t ]+)?|(([\t ]*\r\n)?[\t ]+)?"(((([\t ]*\r\n)?[\t ]+)?([]!#-[^-~]|(\[\t -~])))+(([\t ]*\r\n)?[\t ]+)?|(([\t ]*\r\n)?[\t ]+)?)"(([\t ]*\r\n)?[\t ]+)?)@((([\t ]*\r\n)?[\t ]+)?[-!#-'*+/-9=?A-Z^-~]+(\.[-!#-'*+/-9=?A-Z^-~]+)*(([\t ]*\r\n)?[\t ]+)?|(([\t ]*\r\n)?[\t ]+)?\[((([\t ]*\r\n)?[\t ]+)?[!-Z^-~])*(([\t ]*\r\n)?[\t ]+)?](([\t ]*\r\n)?[\t ]+)?)

Gültige E-Mail-Adressen sind in RFC 5321 (SMTP) weiter eingeschränkt. Es lässt grundsätzlich den Teil vor dem @ -Zeichen stehen, akzeptiert aber nur Hostnamen oder Adressliterale nach dem @ -Zeichen. ("---.---" ist ein gültiges Punktatom, aber kein gültiger Hostname und "[...]" ist ein gültiges Domänenliteral, aber kein gültiges Adressliteral.)

Die in RFC 5321 vorgestellte Grammatik ist zu mild, wenn es sowohl um Hostnamen als auch um IP-Adressen geht. Ich habe mir erlaubt, die fraglichen Regeln zu "korrigieren", indem ich diesen Entwurf und RFC 1034 (Abschnitt 3.5) als Richtlinien. Hier ist die resultierende Regex.

([!#-'*+/-9=?A-Z^-~-]+(\.[!#-'*+/-9=?A-Z^-~-]+)*|"([]!#-[^-~ \t]|(\[\t -~]))+")@([0-9A-Za-z]([0-9A-Za-z-]{0,61}[0-9A-Za-z])?(\.[0-9A-Za-z]([0-9A-Za-z-]{0,61}[0-9A-Za-z])?)*|\[((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}|IPv6:((((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){6}|::((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){5}|[0-9A-Fa-f]{0,4}::((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){4}|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):)?(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){3}|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){0,2}(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){2}|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){0,3}(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){0,4}(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::)((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3})|(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3})|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){0,5}(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3})|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){0,6}(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::)|(?!IPv6:)[0-9A-Za-z-]*[0-9A-Za-z]:[!-Z^-~]+)])

Alle Regexes sind POSIX EREs. Der letzte verwendet einen negativen Lookahead. Siehe hier für die Ableitungen von die regulären Ausdrücke.

    
Rinke 18.11.2014, 08:08
quelle
-1

Soweit ich weiß, spezifiziert RFC822 die E-Mail-Adressensyntax.

Ссылка

    
Rafał Toboła 21.12.2012 15:27
quelle

Tags und Links