Wie macht man denn richtig? Ich dachte durch das htmlspecialchars im action würde das Problem beseitigt?
Nein. Hier geht es um den Inhalt der Nachricht. Nicht um die Adresse des Skriptes. Du musst also alles behandeln, was in die Nachricht einfließt.
Oder verstehe ich das ganze immer noch falsch?
Das denke ich wohl.
Du wirst nach ein paar Tagen nach Veröffentlichung des Kontaktformulars merken, was da so alles eingegeben wird und dass Kontaktformular-Spam „lediglich ärgerlich“ ist.