Fehler in Perl Script Formularwerte an sendmail
Tobias Winkler
- perl
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?
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®
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