Martiano: neue *pl erstellen

Hallo,
mein Freund der einen kleinen Buchversand hat wurde das CGI abgeschaltet.
Ich habe einen Server auf dem ich es laufen lassen könnte habe aber keine Ahnung von Perl. Nur html und css.

Ich habe versucht das script von hier ein bisschen anzupassen weiss aber nicht ob es funktionieren kann.
Vor allem weiss ich nicht wo ich www.meine_website.de/danke.htm einsetzen soll.

Wenn jemand mir helfen will hier der gekürzte Code des Formulars, darunter das von mir umgeschriebene buchversand.pl.

Formular:

<HTML>
<HEAD>
<TITLE>Online-Bestellung</TITLE>

<SCRIPT LANGUAGE="JavaScript">
<!--
 gekürzt...

//-->
</SCRIPT>

</HEAD>
<BODY  BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#0000FF" ALINK="#400080"  VLINK="#880088">
 <P>
  <FONT COLOR="#000000" size="2" FACE="Arial,MS Sans Serif,Helvetica">
   <h1>Bestellformular </h1>
   <HR>
   <BR><BR>
  <FONT>
 </p>

<SCRIPT LANGUAGE="JavaScript">
 <!--

tag("P");
   document.write("<FONT COLOR="#000000" size="2" FACE="Arial,MS Sans Serif,Helvetica">");
    document.write("<H3>An:</H3>");

if ("mein_name"!="") {document.write("mein_name<BR>");}
    if ("mein_Buchversand Buchversand"!="") {document.write("mein_Buchversand Buchversand<BR>");}
    document.write("Strasse Nr.<BR>");
    document.write("PLZ Ort<BR>");
    if ("04532-82949"!="") {document.write("Tel: 04532-82949 ");}
    if ("04532-82942"!="") {document.write("Fax: 04532-82942");}
    document.write("<BR>");
    if ("meine-Email@xxx.de"!="") {document.write("E-Mail: <a href="mailto:meine-Email@xxx.de">meine-Email@xxx.de</a><BR>");}
    if ("http://www.meine-website.de"!="") {document.write("Homepage: <a href="http://www.meine-website.de">http://www.meine-website.de</a><BR>");}

document.write("<BR>");
    document.write("<H3>Ihre Daten:</H3>");

gekürzt...

//-->
 </SCRIPT>

<BR>
   <table border="1" cellpadding="0" cellspacing="1">
    <Tr BGCOLOR="#000000">
      <th align="right">
       <FONT color="#FFFFFF" size="2"  FACE="Arial,MS Sans Serif,Helvetica">
        &nbsp;Menge&nbsp;
       </FONT>
      </th>
      <th align="right">
       <FONT color="#FFFFFF" size="2"  FACE="Arial,MS Sans Serif,Helvetica">
        &nbsp;Artikelnr&nbsp;
       </FONT>
      </th>
      <th align="left">
       <FONT color="#FFFFFF" size="2"  FACE="Arial,MS Sans Serif,Helvetica">
        &nbsp;Bezeichnung&nbsp;
       </FONT>
      </th>
      <th align="left">
       <FONT color="#FFFFFF" size="2"  FACE="Arial,MS Sans Serif,Helvetica">
        &nbsp;Einzelpreis&nbsp;<br>&nbsp;in €
       </FONT>
      </th>
      <th align="left">
       <FONT color="#FFFFFF" size="2"  FACE="Arial,MS Sans Serif,Helvetica">
        &nbsp;Gesamtpreis&nbsp;<br>&nbsp;in €
       </FONT>
      </th>
      <th align="left">
       <FONT color="#FFFFFF" size="2"  FACE="Arial,MS Sans Serif,Helvetica">

<SCRIPT LANGUAGE="JavaScript">
       <!--
        var i,ua=navigator.appName;
        if (parent.waehr.length>0)
        {
         document.write("&nbsp;Gesamtpreis&nbsp;<br>&nbsp;in &nbsp;");
         if (ua.indexOf("Microsoft")>-1)
         {
          document.write("<SELECT NAME="WAEHR" ONBLUR="javascript:wchange(value)" ONCHANGE="javascript:wchange(value)">");
          i=parent.awaehr;
          document.write("<OPTION VALUE=""+i+"">"+parent.waehr[i].land+"</OPTION>");
          for (var i=0; i<parent.waehr.length; i++)
          {
           if (parent.waehr[i].land != "" && i!=parent.awaehr)
           {
            document.write("<OPTION VALUE=""+i+"">"+parent.waehr[i].land+"</OPTION>");
           }
          }
          document.write("</SELECT>");
         }
         else
         {
          document.write(parent.waehr[parent.awaehr].land);
         }
        }
       //-->
       </SCRIPT>

</FONT>
      </th>
    </tr>

<SCRIPT LANGUAGE="JavaScript">
     <!--

Code für den Warenkorb gekürzt...

s="meine-Email@xxx.de";
     if (s=="") {s="meine-Email@xxx.de"}

var sub="";
     if (sub.length>0)
     {
      if (sub.substring(sub.length-1,sub.length)=="/")
      {
       sub=sub.substring(0,sub.length-1) ;
      }
       if(sub.search("http") == -1){sub="http://"+sub;}
     }
     if (""!="")
     {
      sub=sub+"/"+"";
      if (sub.substring(sub.length-1,sub.length)=="/")
      {
       sub=sub.substring(0,sub.length-1) ;
      }
     }
     if (sub.length>0)
     {
      sub=sub+"/submit.htm";
     }
     else
     {
      sub="submit.htm";
     }

if ("0"=="1")
     {
      document.write("<FORM ACTION="" METHOD="POST" ONSUBMIT="return Bestellung(this)">");
     }
     else
     {
      if ("0"=="2")
      {
       document.write("<FORM ACTION="http://www.afs-online.de/cgi-bin/FormMail.pl" METHOD="POST" ONSUBMIT="return Bestellung(this)">");
      }
      else
      {
       document.write("<FORM ACTION="mailto:"+s+" ?subject=Bestellung von "+Name+"" METHOD="POST" ENCTYPE="text/plain" ONSUBMIT="return Bestellung(this)">");
      }
     }
     document.write("<P>");
     document.write("<INPUT TYPE="HIDDEN" NAME="recipient" VALUE=""+s+"">");
     document.write("<INPUT TYPE="HIDDEN" NAME="subject" VALUE="Bestellung von "+Name+"">");
     document.write("<INPUT TYPE="HIDDEN" NAME="email" VALUE=""+parent.anschrift.E_Mail+"">");
     if (""!="Wahr")
     {
      document.write("<INPUT TYPE="HIDDEN" NAME="redirect" VALUE=""+sub+"">");
     }
     else
     {
      document.write("<INPUT TYPE="HIDDEN" NAME="afssub" VALUE=""+sub+"">");
     }
     document.write("<INPUT TYPE="HIDDEN" NAME="ORDER" VALUE=""+bestell+"">");

//-->
     </SCRIPT>

<INPUT TYPE="BUTTON" NAME="" VALUE="<- zurück" ONCLICK="JavaScript:history.back()">
    <INPUT TYPE="BUTTON" NAME="" VALUE="- Ausdrucken -" ONCLICK="JavaScript:print()">
    <INPUT TYPE="SUBMIT" NAME="" VALUE="Bestellung absenden ->">

</p>
   </FORM>

</FONT>

</div>
</BODY>
</HTML>
..............................................................

Hier das geänderte buchversand.pl:

#!/usr/bin/perl

-------> Individuelle Parameter des Skriptes - bitte anpassen!

--> SMTP-Programm zum Versenden der Mail:

$Sendmail_Prog = "/usr/lib/sendmail";

--> Ziel-Mailadresse, an die gesendet werden soll:

$mailto = 'meine-Email@xxx.de';

-------> Modul für CGI-Scripts einbinden:

use CGI;

-------> Modul für CGI-Scripts zum Einlesen der Formulardaten anwenden:

$query = new CGI;
@names = $query->param;

-------> interne Daten aus den erwarteten hidden-Feldern auslesen:

$delimiter = $query->param('delimiter');  # ---> Begrenzerzeichen zwischen name und value
$returnhtml = $query->param('return');    # ---> URL für Dankeseite
$subject = $query->param('subject');      # ---> E-Mail-Subject

-------> alle Whitespace-Zeichen (Leerzeichen, Tabulator, Newline) in Leerzeichen wandeln

#             VERHINDERT sonst möglichen MISSBRAUCH des Skripts
$subject =~ s/\s/ /g;

-------> Text der E-Mail aus den Formulardaten ermitteln:

$mailtext = "";
foreach(@names) {
  $name = $_;
  @values = "";
  @values = $query->param($name);
  if($name ne "return" && $name ne "subject" && $name ne "delimiter") {
    foreach $value (@values) {
      $mailtext = $mailtext.$name;
      $mailtext = $mailtext.$delimiter;
      $mailtext = $mailtext.$value."\n";
    }
  }
}

-------> E-Mail versenden:

open(MAIL,"|$Sendmail_Prog -t") || print STDERR "Mailprogramm konnte nicht gestartet werden\n";
print MAIL "To: $mailto\n";
print MAIL "Subject: $subject\n\n";
print MAIL "$mailtext\n";
close(MAIL);

-------> Dankeseite an Browser senden:

print "Location: $returnhtml\n\n";

.........................................................................

Wo wird die $returnhtml als "www.meine_website.de/danke.htm" definiert?

Klappt das überhaupt?

  1. Formular:

    Brrr, schnell skip...

    ..............................................................

    Hier das geänderte buchversand.pl:

    #!/usr/bin/perl

    #!/pfad/zu/perl
    #kann auf verschiedenen Servern anders lauten,
    #deshalb zuerst nachfragen, falls nix funzt

    use strict;
    use warnings;
    use CGI::Carp qw(fatalsToBrowser);

    gib Warnungen an den Browser aus

    -------> Individuelle Parameter des Skriptes - bitte anpassen!

    Dein Problem

    Wo wird die $returnhtml als "www.meine_website.de/danke.htm" definiert?

    my $returnhtml als "www.meine_website.de/danke.htm";

    --> SMTP-Programm zum Versenden der Mail:

    $Sendmail_Prog = "/usr/lib/sendmail";

    my $Sendmail_Prog = "/usr/lib/sendmail";

    --> Ziel-Mailadresse, an die gesendet werden soll:

    $mailto = 'meine-Email@xxx.de';

    my $mailto = 'meine-Email@xxx.de';

    -------> Modul für CGI-Scripts einbinden:

    use CGI;

    use CGI;

    -------> Modul für CGI-Scripts zum Einlesen der Formulardaten anwenden:

    $query = new CGI;

    my $query = new CGI;

    @names = $query->param;

    my @names = $query->param;

    -------> interne Daten aus den erwarteten hidden-Feldern auslesen:

    $delimiter = $query->param('delimiter');  # ---> Begrenzerzeichen zwischen name und value

    my $delimiter = $query->param('delimiter');

    $returnhtml = $query->param('return');    # ---> URL für Dankeseite

    my $returnhtml = $query->param('return');

    $subject = $query->param('subject');      # ---> E-Mail-Subject

    my $subject = $query->param('subject');

    -------> alle Whitespace-Zeichen (Leerzeichen, Tabulator, Newline) in Leerzeichen wandeln

    #             VERHINDERT sonst möglichen MISSBRAUCH des Skripts
    $subject =~ s/\s/ /g;

    obige Darstellung ist leider kompletter BS

    Wir müssen Newlines konvertieren, falls diese vorhanden sind:

    Dennoch ist es praktisch OK.

    $subject =~ s/\s/ /g;

    aber wir sind noch nicht fertig.

    Für das Subject ist ein sezialles Encoding für Umlaute notwendig:

    use Encode qw/encode decode/;
    $subject = decode('MIME-B', $subject);

    -------> Text der E-Mail aus den Formulardaten ermitteln:

    $mailtext = "";

    my $mailtext = "";

    foreach(@names) {
      $name = $_;

    foreach my $name(@names){

    @values = "";
       @values = $query->param($name);
       if($name ne "return" && $name ne "subject" && $name ne "delimiter") {

    foreach $value (@values) {

    foreach my $value (@values) {
           $mailtext = $mailtext.$name;
           $mailtext = $mailtext.$delimiter;
           $mailtext = $mailtext.$value."\n";
         }
       }
     }

    -------> E-Mail versenden:

    open(MAIL,"|$Sendmail_Prog -t") || print STDERR "Mailprogramm konnte nicht gestartet werden\n";

    open(MAIL,"|$Sendmail_Prog -t")
          or die("Fehler beim Aufruf des mailprogramms $!");

    print MAIL "To: $mailto\n";

    print MAIL "To: $mailto\r\n";

    Wir geben Network-Newlines aus!

    print MAIL "Subject: $subject\n\n";

    print MAIL "Subject: $subject\r\n";

    schliesse die Header-Sektion ab:

    print MAIL "\r\n";

    print MAIL "$mailtext\n";

    print MAIL "$mailtext\n";

    close(MAIL);

    -------> Dankeseite an Browser senden:

    print "Location: $returnhtml\n\n";

    Wir haben es mit HTTP-Header zu tun:-> Network-Newlines

    print "Location: $returnhtml\r\n\r\n";

    Das kann an diesem Punkt fehlschlagen wenn Warnungen ausgegeben werden.

    .........................................................................

    Klappt das überhaupt?

    Das wird sich erweisen.

    mfg Beat

    --
    ><o(((°>           ><o(((°>
       <°)))o><                     ><o(((°>o
    Der Valigator leibt diese Fische
    1. Formular:

      Brrr, schnell skip...

      soo schlimm?  ;-)

      ok, ich werde es so probieren.

      Vielen Dank für die schnelle Hilfe

    2. sorry für das doppelposting, hatte einiges verändert und wollte nicht verwirren. Wenn möglich bitte löschen.Hier nochmal hoffentlich an richtiger Stelle:

      mein aktuelles Problem ist folgende Fehlermeldung wenn ich das Formular abschicke:

      Premature end of script headers: FormMail.pl

      Hier der Teil des Formulars der das Schicken regelt:

      --------------------------------------------------------------------

      s="meine@email.de";
           if (s=="") {s="meine@email.de"}

      var sub="";
           if (sub.length>0)
           {
            if (sub.substring(sub.length-1,sub.length)=="/")
            {
             sub=sub.substring(0,sub.length-1) ;
            }
             if(sub.search("http") == -1){sub="http://"+sub;}
           }
           if (""!="")
           {
            sub=sub+"/"+"";
            if (sub.substring(sub.length-1,sub.length)=="/")
            {
             sub=sub.substring(0,sub.length-1) ;
            }
           }
           if (sub.length>0)
           {
            sub=sub+"/submit.htm";
           }
           else
           {
            sub="submit.htm";
           }

      if ("1"=="1")
           {
            document.write("<FORM ACTION="http://www.meine-url.de/cgi-bin/FormMail.pl" METHOD="POST" ONSUBMIT="return Bestellung(this)">");
           }
           else
           {
            if ("1"=="2")
            {
             document.write("<FORM ACTION="http://www.meine-url.de/cgi-bin/FormMail.pl" METHOD="POST" ONSUBMIT="return Bestellung(this)">");
            }
            else
            {
             document.write("<FORM ACTION="mailto:"+s+" ?subject=Bestellung von "+Name+"" METHOD="POST" ENCTYPE="text/plain" ONSUBMIT="return Bestellung(this)">");
            }
           }
           document.write("<P>");
           document.write("<INPUT TYPE="HIDDEN" NAME="recipient" VALUE=""+s+"">");
           document.write("<INPUT TYPE="HIDDEN" NAME="subject" VALUE="Bestellung von "+Name+"">");
           document.write("<INPUT TYPE="HIDDEN" NAME="email" VALUE=""+parent.anschrift.E_Mail+"">");
           if ("Falsch"!="Wahr")
           {
            document.write("<INPUT TYPE="HIDDEN" NAME="redirect" VALUE=""+sub+"">");
           }
           else
           {
            document.write("<INPUT TYPE="HIDDEN" NAME="afssub" VALUE=""+sub+"">");
           }
           document.write("<INPUT TYPE="HIDDEN" NAME="ORDER" VALUE=""+bestell+"">");

      //-->
           </SCRIPT>

      ----------------------------------------------------------------------

      hier mein FormMail.pl:

      #!/usr/bin/perl

      überprüft und ok

      use strict;
      use warnings;
      use CGI::Carp qw(fatalsToBrowser);

      gibt Warnungen an den Browser aus

      my $returnhtml = "http://www.meine-url.de/submit.htm";

      my $Sendmail_Prog = "/usr/sbin/sendmail -t -i";

      überprüft und ok

      my $mailto = 'meine@email.de';

      use CGI;

      my $query = new CGI;

      my @names = $query->param;

      -------> interne Daten aus den erwarteten hidden-Feldern auslesen:

      my $delimiter = $query->param('delimiter');  # ---> Begrenzerzeichen zwischen name und value

      my $returnhtml = $query->param('return');    # ---> URL für Dankeseite

      my $subject = $query->param('subject'); # ---> E-Mail-Subject

      Wir müssen Newlines konvertieren, falls diese vorhanden sind:

      $subject =~ s/\s/ /g;

      aber wir sind noch nicht fertig.

      Für das Subject ist ein spezielles Encoding für Umlaute notwendig:

      use Encode qw/encode decode/;
      $subject = decode('MIME-B', $subject);

      -------> Text der E-Mail aus den Formulardaten ermitteln:

      my $mailtext = "";

      foreach my $name(@names){

      @values = "";
         @values = $query->param($name);
         if($name ne "return" && $name ne "subject" && $name ne "delimiter") {

      foreach my $value (@values) {
             $mailtext = $mailtext.$name;
             $mailtext = $mailtext.$delimiter;
             $mailtext = $mailtext.$value."\n";
           }
         }
       }

      -------> E-Mail versenden:

      open(MAIL,"|$Sendmail_Prog -t")
            or die("Fehler beim Aufruf des mailprogramms $!");

      print MAIL "To: $mailto\r\n";

      Wir geben Network-Newlines aus!

      print MAIL "Subject: $subject\r\n";

      schliesse die Header-Sektion ab:

      print MAIL "\r\n";

      print MAIL "$mailtext\n";

      close(MAIL);

      -------> Dankeseite an Browser senden:

      Wir haben es mit HTTP-Header zu tun:-> Network-Newlines

      print "Location: $returnhtml\r\n\r\n";

      Das kann an diesem Punkt fehlschlagen wenn Warnungen ausgegeben werden.

      -----------------------------------------------------------------------

      auf was weisst dieser Fehler hin?
      Ich kann weder javascript noch perl.
      Was kann ich ändern oder ist offensichtlich falsch?

      1. sorry für das doppelposting, hatte einiges verändert und wollte nicht verwirren. Wenn möglich bitte löschen.Hier nochmal hoffentlich an richtiger Stelle:

        mein aktuelles Problem ist folgende Fehlermeldung wenn ich das Formular abschicke:

        Premature end of script headers: FormMail.pl

        Dann sieh in den error.log auf dem Server nach.

        Hier der Teil des Formulars der das Schicken regelt:

        will ich nicht analysieren.

        hier mein FormMail.pl:

        ...

        foreach my $name(@names){

        @values = "";

        my @values=();

        @values = $query->param($name);

        ...

        -------> Dankeseite an Browser senden:

        Das ändern wir:

        print "Content-type: text/plain; charset=UTF-8\r\n\r\n";

        print "Testausgabe, Dankeseite\n";

        exit;

        Erst nach Erfolg

        Wir haben es mit HTTP-Header zu tun:-> Network-Newlines

        print "Location: $returnhtml\r\n\r\n";

        Das kann an diesem Punkt fehlschlagen wenn Warnungen ausgegeben werden.

        Es kann aber nicht ein ein Location-header UND ein response-body gesendet werden.


        auf was weisst dieser Fehler hin?

        siehe error.log auf dem Server.

        Ich kann weder javascript noch perl.

        Dein Problem.

        mfg Beat

        --
        ><o(((°>           ><o(((°>
           <°)))o><                     ><o(((°>o
        Der Valigator leibt diese Fische
        1. Dann sieh in den error.log auf dem Server nach.

          kurze Zwischenfrage, ich finde kein error.log auf dem server.
          Per FTP-Zugang finde ich keine solche Datei.

          Wie muss ich das anfordern?

          Hier habe ich das von dir vorgeschlagene eingefügt. Wenn ich das richtig verstehe dann soll ich es erstmal so ausprobieren:

          #!/usr/bin/perl  
          use strict;  
          use warnings;  
          use CGI::Carp qw(fatalsToBrowser);  
          my $returnhtml = "http://www.meine-url.de/submit.htm";  
          my $Sendmail_Prog = "/usr/sbin/sendmail -t -i";  
          my $mailto = 'meine@email.de';  
          use CGI;  
          my $query = new CGI;  
          my @names = $query->param;  
          my $delimiter = $query->param('delimiter');  
          my $returnhtml = $query->param('return');    # ---> URL für Dankeseite  
          my $subject = $query->param('subject'); # ---> E-Mail-Subject  
          $subject =~ s/\s/ /g;  
          use Encode qw/encode decode/;  
          $subject = decode('MIME-B', $subject);  
          my $mailtext = "";  
          foreach my $name(@names){  
             @values = "";  
            
          my @values=();  
            
             @values = $query->param($name);  
             if($name ne "return" && $name ne "subject" && $name ne "delimiter") {  
               foreach my $value (@values) {  
                 $mailtext = $mailtext.$name;  
                 $mailtext = $mailtext.$delimiter;  
                 $mailtext = $mailtext.$value."\n";  
               }  
             }  
           }  
            
          # -------> E-Mail versenden:  
          open(MAIL,"|$Sendmail_Prog -t")  
                or die("Fehler beim Aufruf des mailprogramms $!");  
          print MAIL "To: $mailto\r\n";  
          # Wir geben Network-Newlines aus!  
          print MAIL "Subject: $subject\r\n";  
          # schliesse die Header-Sektion ab:  
          print MAIL "\r\n";  
          print MAIL "$mailtext\n";  
          close(MAIL);  
          print "Content-type: text/plain; charset=UTF-8\r\n\r\n";  
          print "Testausgabe, Dankeseite\n";  
          exit;
          

          my @values=();

          habe ich auch reingesetzt.

          print "Content-type: text/plain; charset=UTF-8\r\n\r\n";

          print "Testausgabe, Dankeseite\n";

          exit;

          muss ich Testausgabe und Dankeseite durch andere Eingaben ersetzen wenn ich es testen will?

          Erst nach Erfolg

          die untenstehende Angabe wieder austauschen gegen das Eingefügte, so wie ich dich verstanden habe.

          Wir haben es mit HTTP-Header zu tun:-> Network-Newlines

          print "Location: $returnhtml\r\n\r\n";

          Das kann an diesem Punkt fehlschlagen wenn Warnungen ausgegeben werden.

          Es kann aber nicht ein ein Location-header UND ein response-body gesendet werden.

          verstehe ich nicht ohne mehr zu lernen...

          Ich kann weder javascript noch perl.

          Dein Problem.

          leider, leider   ;-)

          falls es zu umfangreich wird bitte sagen, es sollte nur ein Versuch sein den unzuverlässigen E-mail Client abzuschalten.
          Da ich gesehen hatte wie kurz so ein CGI ist dachte ich dass sich die Hilfe im Rahmen hält.

          schönen Dank bis hierher

          1. Dann sieh in den error.log auf dem Server nach.

            kurze Zwischenfrage, ich finde kein error.log auf dem server.
            Per FTP-Zugang finde ich keine solche Datei.

            in dem Fall erzeuge eine Datei error.txt. Setze entsprechende Schreibrechte auf diese Datei und ersetze ersetze die folgende Zeile

            use CGI::Carp qw(fatalsToBrowser);

            durch

            BEGIN {
               use CGI::Carp qw(carpout);
               open(LOG, ">>","error.txt")
                   or die "Unable to append to error.txt: $!\n";
               carpout(*LOG);
            }

            Fehler werden dann in diese Datei geschrieben.

            Es kann aber nicht ein ein Location-header UND ein response-body gesendet werden.

            verstehe ich nicht ohne mehr zu lernen...

            Ein Location Header bedeutet, dass ein Redirect gesendet wird (Status Code, 301)
            Bei einem solchen ist es nicht vorgesehen dass der Client einen Response body anzeigt.

            falls es zu umfangreich wird bitte sagen, es sollte nur ein Versuch sein den unzuverlässigen E-mail Client abzuschalten.

            Die Zuverlässigkeit des Scriptes ist so auch nicht besser. Es gibt keinerlei serverseitige Validierung.
             Unter anderem Fehlen solche Dinge wie ein Mail-Header zum charset.

            mfg Beat

            --
            ><o(((°>           ><o(((°>
               <°)))o><                     ><o(((°>o
            Der Valigator leibt diese Fische
            1. Die Zuverlässigkeit des Scriptes ist so auch nicht besser. Es gibt keinerlei serverseitige Validierung.

              Unter anderem Fehlen solche Dinge wie ein Mail-Header zum charset.

              Ich schliesse daraus dass es aber auch so funktionieren müsste.

              Aber durch Deine Antwort blicke ich schon etwas besser durch, vielen Dank.
              Ich werde das so gut wie möglich heute alles abarbeiten und melde mich hoffentlich mit Erfolg wieder.

            2. BEGIN {

              use CGI::Carp qw(carpout);
                 open(LOG, ">>","error.txt")
                     or die "Unable to append to error.txt: $!\n";
                 carpout(*LOG);
              }

              Ersetzung habe ich gemacht und die Datei

              error.txt wurde erstellt im cgi-bin Verzeichnis. Schreibrechte sehen so aus:

              -rw-rw-r--    1 ftpxx- users        1965 Oct 22 13:36 FormMail.pl
              -rw-rw-rw-    1 ftpxx- users           0 Oct 22 13:04 error.txt

              Leider kommt immer noch diese Fehlermeldung:
              Die Anfrage kann nicht beantwortet werden, da im Server ein interner Fehler aufgetreten ist.
              Fehlermeldung:
              Premature end of script headers: FormMail.pl

              Im Internet habe ich immer wieder die Schreibrechte als Fehlerursacher für diese Meldung gesehen. Aber das scheint ja hier nicht vorzuliegen.
              Das Verzeichnis selbst (cgi-bin) hat die Rechte 755.

              Aber auch in der Datei error.txt wird nichts geschrieben nachdem ich den Fehler reproduziert habe.

              Die FormMail.pl sieht jetzt so aus:

              #!/usr/bin/perl  
              use strict;  
              use warnings;  
                
              BEGIN {  
                 use CGI::Carp qw(carpout);  
                 open(LOG, ">>","error.txt")  
                     or die "Unable to append to error.txt: $!\n";  
                 carpout(*LOG);  
              }  
              # schreibt Fehler in die datei error.txt  
                
              my $returnhtml = "http://www.meine-adresse.de/submit.htm";  
              my $Sendmail_Prog = "/usr/sbin/sendmail -t -i";  
              my $mailto = 'meine@email.de';  
              use CGI;  
              my $query = new CGI;  
              my @names = $query->param;  
              my $delimiter = $query->param('delimiter');  
              my $returnhtml = $query->param('return');    # ---> URL für Dankeseite  
              my $subject = $query->param('subject'); # ---> E-Mail-Subject  
              $subject =~ s/\s/ /g;  
              use Encode qw/encode decode/;  
              $subject = decode('MIME-B', $subject);  
              my $mailtext = "";  
              foreach my $name(@names){  
                 @values = "";  
              my @values=();  
                 @values = $query->param($name);  
                 if($name ne "return" && $name ne "subject" && $name ne "delimiter") {  
                   foreach my $value (@values) {  
                     $mailtext = $mailtext.$name;  
                     $mailtext = $mailtext.$delimiter;  
                     $mailtext = $mailtext.$value."\n";  
                   }  
                 }  
               }  
              open(MAIL,"|$Sendmail_Prog -t")  
                    or die("Fehler beim Aufruf des mailprogramms $!");  
              print MAIL "To: $mailto\r\n";  
              print MAIL "Subject: $subject\r\n";  
              print MAIL "\r\n";  
              print MAIL "$mailtext\n";  
              close(MAIL);  
              print "Content-type: text/plain; charset=UTF-8\r\n\r\n";  
              print "Testausgabe, Dankeseite\n";  
              exit;
              

              Kann ich noch etwas testen?

              1. Ersetzung habe ich gemacht und die Datei

                error.txt wurde erstellt im cgi-bin Verzeichnis. Schreibrechte sehen so aus:

                -rw-rw-r--    1 ftpxx- users        1965 Oct 22 13:36 FormMail.pl

                Diese Rechte sind zu wenig. Ein script, dass über einen handler vom Perl interpreter ausführbar sein soll, muss schon auch ein x als Recht in der richtigen Gruppe enthalten.

                -rw-rw-rw-    1 ftpxx- users           0 Oct 22 13:04 error.txt

                Leider kommt immer noch diese Fehlermeldung:
                Die Anfrage kann nicht beantwortet werden, da im Server ein interner Fehler aufgetreten ist.
                Fehlermeldung:
                Premature end of script headers: FormMail.pl

                Im Internet habe ich immer wieder die Schreibrechte als Fehlerursacher für diese Meldung gesehen. Aber das scheint ja hier nicht vorzuliegen.
                Das Verzeichnis selbst (cgi-bin) hat die Rechte 755.

                Aber auch in der Datei error.txt wird nichts geschrieben nachdem ich den Fehler reproduziert habe.

                foreach my $name(@names){
                  @values = "";

                Die obige Zeile erscheint irgendwie falsch.
                Was denkt der Noob?

                my @values=();
                  @values = $query->param($name);

                mfg Beat

                --
                ><o(((°>           ><o(((°>
                   <°)))o><                     ><o(((°>o
                Der Valigator leibt diese Fische
                1. Diese Rechte sind zu wenig. Ein script, dass über einen handler vom Perl interpreter ausführbar sein soll, muss schon auch ein x als Recht in der richtigen Gruppe enthalten.

                  »»
                  nur zum testen habe ich jetzt diese Rechte:

                  -rwxrwxrwx    1 ftpxx- users        1965 Oct 22 13:36 FormMail.pl
                  -rwxrwxrwx    1 ftpxx- users           0 Oct 22 13:04 error.txt

                  die ist erstmal immer noch da:

                  Fehlermeldung:
                  Premature end of script headers: FormMail.pl

                  und error.txt 0Byte

                  foreach my $name(@names){
                    @values = "";

                  Die obige Zeile erscheint irgendwie falsch.
                  Was denkt der Noob?

                  »»
                  Grundsätzlich würde ein Noob vermutlich nicht beachten dass hinter @names die geschweifte Klammer ist und damit schon mal alles schiefläuft.
                  Ansonsten versteht er vielleicht noch dass er erst die geschweifte Klammer lösen muss weil das dann wieder @names ergibt.
                  Und vielleicht noch dass die Variable $name den Inhalt von @names hat.
                  Sowas denkt der Noob vielleicht. Mir wär das zu schwer.  ;-)

                  my @values=();
                    @values = $query->param($name);

                  Meine Werte werden so gesammelt?

                  Ich hab dem Code nichts getan...

                  1. foreach my $name(@names){
                      @values = "";

                    Die obige Zeile erscheint irgendwie falsch.
                    Was denkt der Noob?
                    »»
                    Grundsätzlich würde ein Noob vermutlich nicht beachten dass hinter @names die geschweifte Klammer ist und damit schon mal alles schiefläuft.
                    Ansonsten versteht er vielleicht noch dass er erst die geschweifte Klammer lösen muss weil das dann wieder @names ergibt.
                    Und vielleicht noch dass die Variable $name den Inhalt von @names hat.
                    Sowas denkt der Noob vielleicht. Mir wär das zu schwer.  ;-)

                    my @values=();
                      @values = $query->param($name);

                    use strict; verlangt, dass jeder neue Variable mit my declariert werden mus.
                       @values="";
                    stellt einen undeklarierte neue Variable dar.
                    Diese Zeile sollte gar nicht im Code stehen. Sie ist durch dich im Code verblieben.

                    Ich hab dem Code nichts getan...

                    Tut mir leid, aber du als Betreiber bist für den Code verantwortlich.
                    Entweder du brichst das unternehmen ab, oder du arbeitest dich in die Materie hinein.

                    Schmeiss mal folgendes Script hoch:

                    #!/usr/bin/perl  
                      
                    use strict;  
                    use warnings;  
                      
                    print "Content-type: text/plain\r\n\r\n", "Hello World\n";  
                    
                    

                    mfg Beat

                    --
                    ><o(((°>           ><o(((°>
                       <°)))o><                     ><o(((°>o
                    Der Valigator leibt diese Fische
                    1. @values="";
                      stellt einen undeklarierte neue Variable dar.
                      Diese Zeile sollte gar nicht im Code stehen. Sie ist durch dich im Code verblieben.

                      »»
                      hab die Zeile entfernt.
                      aber sorry, du hast recht. Ich muss beim Umschreiben nicht aufgepasst haben. Ich wusste auch das mit strict nicht. Soweit bin ich noch nicht beim Lehrgang. Hab ja erst gestern gestartet.

                      foreach my $name(@names){  
                        
                      my @values=();  
                        
                         @values = $query->param($name); # Muss hier kein my vor?  
                        
                       }
                      

                      Schmeiss mal folgendes Script hoch:

                      #!/usr/bin/perl

                      use strict;
                      use warnings;

                      print "Content-type: text/plain\r\n\r\n", "Hello World\n";

                        
                      auwei, schon hierbei kommt dieselbe Meldung.  
                        
                      Jedesmal dachte ich gleich hab ichs.  
                      Und jetzt ist das anscheinend etwas grundsätzliches.  
                        
                      
                      
    3. $subject = decode('MIME-B', $subject);

      Dies ist falsch. Richtig muss es lauten:

        
          $subject = encode…  
      
      

      Der Encodingname ist vorzugsweise 'MIME-Header' statt 'MIME-B', damit der Wartungsprogrammierer auch auf Anhieb die passende Dokumentationsseite findet.