Hi,
mal ganz abgesehen davon, daß $ics keinen Dateinamen enthält (siehe Antwort von dedlfix):
// Termindatei herunterladen header('Location: ./' . $filename . '.ics');
Das sagt, daß der Browser irgendwann in der Zukunft (nämlich dann, wenn ihn die Response erreicht) einen neuen Request stellen soll für die Datei.
// Termindatei löschen if(file_exists($ics)){ unlink($ics); }
Unmittelbar danach (also noch lange, bevor der Browser die Response bekommen hat und noch viel länger bevor der Browser den neuen Request gestellt hat), wird die Datei entsorgt. Der Browser hat also dann gar keine Chance, sich die Datei zu holen, da sie ja schon gelöscht ist …
cu,
Andreas a/k/a MudGuard