php als CGI, mail() und Error 500

Soeben habe ich wieder einmal einen seltsamen Fehler in PHP gefunden. Genaugenommen kein direkter Fehler, sondern ein undokumentiertes Feature in der Funktion mail(), welcher im Zusammenhang einen Fehler erzeugte.

Die Symptome:

  • Error 500 beim Mailversand

Die Voraussetzungen:

  • PHP wird als CGI betrieben wie z.B. bei DomainFactory
  • an mail() wird eine ungültige Empfänger-Adresse übergeben (in unserem Fall enthielt sie Umlaute)
  • vermutlich weitere (mail() ruft ein externes Programm auf? Dieses benutzt stdout statt stderr?)

Was passiert:

mail() hat ein undokumentiertes Feature: Fehlermeldungen des (eigenen) Mailservers werden auf stdout ausgegeben (oder vermutlich eher stderr). Wenn PHP als mod_php läuft, landen diese im error log des Webservers. Also kein Problem.

Anders sieht das jedoch bei CGIs aus. In diesem Fall wird die Fehlermeldung vom Webserver als HTTP-Header interpretiert und als ungültig erkannt, was den „Fehler 500“ verursacht.

Im Error Log schlug bei uns die Meldung „syntax error in mailbox addres“[sic] auf.

Die Lösungsansätze:

  • mail() mit vorangestelltem @ aufrufen hilft nicht.
  • output buffering mit ob_start() teste ich gerade, Ergebnisse liefere ich nach.

Eine weitere Anmerkung: Meine Logdatei zeigt, dass mail() trotz des Fehlers „true“ zurückgegeben hat. Das werde ich ein anderes Mal untersuchen.
Hat eine Weile gedauert, bis ich diesen kausalen Zusammenhang erkannt habe. Daher dokumentier ich das mal für die Nachwelt.


Manuel

Kommentarfunktion ist deaktiviert