Ich möchte dir hiermit empfehlen keinen der hier geposteten Codes in einer Produktivumgebung einsetzen.
Begründen möchte ich das ganze wie folgt:
1. Der Code ist anfällig für XSS Attacken da Kontextwechsel nicht korrekt behandelt werden, mit einem manipulierten Link kann daher fremder Schadcode in deine Seite eingebunden werden.
2. Der Code ist anfällig für SQL Injections da du Nutzereingaben ungefiltert in die Datenbank sendest, ein unbefugter ist hierdurch durchaus in der Lage deinen Webserver zu übernehmen.
3. Die Passwortverschlüsselung ist nicht wirklich sicher, du verwendest hierbei SHA 256 und keine konstante Laufzeit. Zu empfehlen wäre hier auf die PHP native API zurückzugreifen. Funktionen (passwort_hash() und passwort_verify())
4. Wenn du die HTML Codes für Umlaute verwenden musst, dann ist die Kodierung deiner Dokumente & Datenbanken fehlerhaft. Verwende durchgängig Koalition UTF-8 WOB (Datenbankverbindung, Dokument, Datenbank) dann bekommst du auch keine Probleme mit Umlauten mehr und musst nicht diese HTML Krücken in den Text schreiben.
Als zusätzliche Anregung:
Deine "Whitelist" als solche lässt sich eleganter lösen, ein zusätzliches Feld in der Nutzerdatenbank ist vollkommen ausreichend z.B. "status" mit den möglichen Werten 0 und 1, dabei steht 0 für deaktiviert und 1 für aktiviert. Beim Einloggen prüfst du ob der Wert von Status 1 ist, nur dann erfolgt ein Login. Bei zu vielen erfolglosen Login Versuchen kannst du damit auch gleich den Account sperren
Abschließend zu deiner Frage mit der Mail.
mail() zu verwenden ist nicht wirklich empfehlenswert, da du die Header richtig einbinden musst (was schnell daneben geht) damit der Versendende "Webserver" nicht als SPAM Server auf einer Blacklist der gängigen Provider (WEB, GMX und Co.) landet. Die Verwendung von Mailerklassen ist daher empfehlenswert.