So, das hat mich jetzt 2h gekostet, nur weil ich nicht genau gelesen habe, was der Support schreibt:

Die Mailadresse des Kunden ist markus.van.holter.@veryimportant.com und das System kann einfach keine Mail dorthin senden!

Tatsächlich verweigert das System das Senden an diese Mailadresse. Bloss warum?

Manche Dinge erscheinen auf den ersten Blick simpel. Nehmen wir einmal eine Mailadresse, ihr wisst schon, dieses Relikt aus der Zeit vor WhatsUp :). Wie prüfe ich, ob mein Benutzer auch wirklich eine Mailadresse eingegeben hat?

Der simple Weg

Nichts leichter als das oder? Ich meine wir alle wissen, wie eine Mailadresse aussieht!

thomas.vonwinkel@mail.de

Also erst irgendwas, dann ein @, gefolgt von irgendwas, einem Punkt und am Schluss 1-3 Buchstaben oder so richtig? Interessanterweise gilt: In den allermeisten Fällen ja! Und in der Tat gibt es bestimmt viele Webseiten und Programme, die eine Mailadresse etwa so prüfen:

code   
  1. DATA: lv_email TYPE STRING,
  2. lv_local TYPE STRING,
  3. lv_host TYPE STRING,
  4. lv_tld TYPE STRING.
  5.  
  6. lv_email = 'thomas.zumwinkel@mail.de'.
  7.  
  8. "Zerlege die Mailadresse in ihre Bestandteile
  9. FIND REGEX '(.*)@(.*)\.(.*)' IN lv_email SUBMATCHES lv_local lv_host lv_tld.
  10.  
  11. "Prüfe ob eines der Felder leer ist
  12. IF lv_local IS INITIAL OR lv_host IS INITIAL OR lv_tld IS INITIAL.
  13. WRITE: / 'Mailadresse ungültig!'.
  14. WRITE: / 'Mailadresse ok'.

Wir zerlegen mittels eines regulären Ausdrucks (Regex -> Ein sehr mächtiges Werkzeug. Wer das noch nicht kennt, sollte sich unbedingt einlesen!) die Mailadresse in ihre drei Bestandteile und prüfen dann, ob jeder Teil vorhanden ist. Das ist ein guter Anfang und ich schätze damit erwischen wir 95% aller Mailadressen.

ABER, eben nur 95%. Beispielsweise sind das hier auch gültige Mailadressen nach RFC 5321:

  • „meinname“@domain.ch
    • Wobei die Anführungszeichen nicht zur Mailadresse gehören
  • blue1922@[IPv6:2001:e18::1]
    • Klar, ich geb gerne die IP meiner Domain an
  • hans.xn--mller-kva@bla.com
    • Eigentlich hans.müller@bla.com. Ja Umlaute 🙂
  • „hans ich liebe leerzeichen“@bla.com
    • Jep Leerzeichen (und noch ne Menge sonstiger Müll -.-)
  • info(Hier bekommen Sie Infos)@bla.com
    • Das Zeug zwischen den Klammern ist ein Kommentar

OK, also Umlaute vorne und hinten (Danke für Unicode-Domains an der Stelle… nicht). Dazu Kommentare, IPs statt Domains sowie Anführungszeichen. Ausserdem gibt es noch einige komische Zusatzregeln (Und eine davon betrifft unsere schöne Kundenadresse von oben):

  • Kein Punkt am Ende oder am Anfang des Lokalteil
    • hans.meier.@bla.com ist also eine inkorrekte Adresse
  • Die TLD muss mindestens zweistellig sein
    • Also example.ch ist ok, example.c nicht

Fazit

Es gibt in praktisch jeder Programmiersprache Bibliotheken zur Prüfung von Mailadressen. Nutzt die. Punkt. Wenn ihr wirklich eine Prüfung machen müsst und keine Bibliothek dafür einbinden könnt, dann benutzt diesen Regex (Offiziell aus RFC 5322):

(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_
`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\
x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0
-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0
-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3
}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0
-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\
[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])

Mit dem funktionieren bestimmt 99%. Ja du hast richtig gelesen: Der Regex im offiziellen RFC zu Mailadressen validiert nicht zu 100% korrekt! Also bleibt schlussendlich nur noch eine Möglichkeit: Sendet dem Kunden eine Aktivierungsmail um zu sehen, ob seine Mailadresse korrekt ist (Ist sowieso usus das zu tun…)