Tobias Winkler: Fehler in Perl Script Formularwerte an sendmail

Hallo,

ich habe folgendes Problem:

auf der Intersuite www.saubersitzer.de unter Infoanfoderung ist ein Formular, dass über den Button abschicken eine Email mit den eingetragenen Informationen an mich schicken soll.

Es kommt immer wieder die Fehlermeldung:

Internal Server Error
The server encountered an internal error or misconfiguration and was unable to complete your request.
Please contact the server administrator, webmaster@xpservices.de and inform them of the time the error occurred, and anything you might have done that may have caused the error.
More information about this error may be available in the server error log.
--------------------------------------------------------------------------------
Apache/1.3.31 Server at www.saubersitzer.de Port 80

Das Script lautet wie folgt:

if($ENV{'REQUEST_METHOD'} eq 'GET')
 {
  $Daten = $ENV{'QUERY_STRING'}
 }
else
 {
  read(STDIN, $Daten, $ENV{'CONTENT_LENGTH'});
 }

@Formularfelder = split(/&/, $Daten);
foreach $Feld (@Formularfelder)
 {
  ($name, $value) = split(/=/, $Feld);
  $value =~ tr/+/ /;
  $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
  $value =~ s/<!--(.|\n)*-->//g;
  $Formular[$i] = $name;
  $i = $i + 1;
  $Formular[$i] = $value;
  $i = $i + 1;
 }

$Mailprogramm = "/usr/sbin/sendmail";  # siehe Erläuterung unten
$MailSubject = "Formluar-Feedback";   # siehe Erläuterung unten
$Empfaenger = "formular@saubersitzer.de"; # siehe Erläuterung unten
$SenderName = $Formular[3];           # siehe Erläuterung unten
$SenderMail = $Formular[7];           # siehe Erläuterung unten

open(MAIL,"|$Mailprogramm -t") || die;

print MAIL "To: $Empfaenger\n";
print MAIL "From: $SenderMail $SenderName\n";
print MAIL "Subject: $MailSubject\n\n";

$i = 0;
$max = $Formular;
for($i=0;$i=$max;$i=$i+2)
{
 print MAIL "$Formular[$i]: $Formular[$i+1]\n";
}
close(MAIL);

Was läuft da falsch?

  1. Moin!

    Internal Server Error

    ...

    Was läuft da falsch?

    Das Skript ist fehlerhaft.

    1. Es fehlt die Shebang

    Das ist die erste Zeile. In dieser soll der das Skript verarbeitende Interpreter stehen:
    Auf den meisten UNIX/LINUX-Systemen wird dies

    #! /usr/bin/perl

    sein.

    Es gibt da noch ein paar Spezifikationen, wie der Interpreter arbeiten soll:

    #! /usr/bin/perl -w  - enable many useful warnings (RECOMMENDED)
    #! /usr/bin/perl -T  - enable tainting checks

    Diese lassen sich auch kombinieren:

    #! /usr/bin/perl -wT

    Hast Du diesen Fehler ausgemerzt und es läuft noch immer nicht, schau nach, ob Du genug Rechte vergeben hast. Das Skript muss ausführbar sein.

    MFFG (Mit freundlich- friedfertigem Grinsen)

    fastix®

    --
    Als Freiberufler bin ich immer auf der Suche nach Aufträgen: Schulungen, Seminare, Training, Development
  2. Hallo Tobias,

    mal abgesehen von dem, was dir fastix schon gesagt hat, sollte das Script nach dem Versand der Mail einen gültigen HTTP-Header erzeugen. Der kann auch nur den Content-Type enthalten oder den Statuscode 204 zurückgeben.

    Weiterhin solltest du das strict-Modul einbinden und das hier

    if($ENV{'REQUEST_METHOD'} eq 'GET')
    {
      $Daten = $ENV{'QUERY_STRING'}
    }
    else
    {
      read(STDIN, $Daten, $ENV{'CONTENT_LENGTH'});
    }

    @Formularfelder = split(/&/, $Daten);
    foreach $Feld (@Formularfelder)
    {
      ($name, $value) = split(/=/, $Feld);
      $value =~ tr/+/ /;
      $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
      $value =~ s/<!--(.|\n)*-->//g;
      $Formular[$i] = $name;
      $i = $i + 1;
      $Formular[$i] = $value;
      $i = $i + 1;
    }

    entfernen und die Routinen aus dem CGI-Modul verwenden. Die sind wesentlich zuverlässiger.

    Viele Grüße
      Patrick Canterino

    --
    "Ein kluger Mann widerspricht nie einer Frau. Er wartet, bis sie es selbst tut." (Humphrey Bogart)