Martin Hoffmann: Wo ist der Fehler?

Hallo zusammen,

ich komme einfach nicht weiter. Seit 2 Tagen beschäftige ich mich mit Perl. Zum einen interessiert mich diese Sprache, zum anderen ist sie noch immer weit verbreitet.

Nun wollte ich also einen Formmailer von Stefan Münz (http://aktuell.de.selfhtml.org/artikel/cgiperl/form-mail/) auf meine Website anwenden.

Unter http://www.abtsbessingen.de/gaestebuch.html möchte ich diesen installieren. Der User soll mir seinen Gästebuch-Eintrag schicken, damit ich Ihn überprüfen kann. Nur irgendwie klappt das nicht.

Ich hoffe, irgendjemand kann mir helfen

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

Schaut euch den Quelltext meiner HTML-Seite an und dann diesen hier vom cgi-Skript:

#!/usr/bin/perl

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

--> SMTP-Programm zum Versenden der Mail:

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

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

$mailto = 'ozzyka@gmail.com';

-------> 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:

$begrenzer = $query->param('begrenzer');  # ---> Begrenzerzeichen zwischen name und value
$adresse = $query->param('adresse');    # ---> URL für Dankeseite
$betreff = $query->param('betreff');      # ---> E-Mail-Subject

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

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

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

$mailtext = "";
foreach(@names) {
  $name = $_;
  @values = "";
  @values = $query->param($name);
  if($name ne "adresse" && $name ne "betreff" && $name ne "begrenzer") {
    foreach $value (@values) {
      $mailtext = $mailtext.$name;
      $mailtext = $mailtext.$begrenzer;
      $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: $betreff\n\n";
print MAIL "$mailtext\n";
close(MAIL);

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

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

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

Ich habe alle anderen wichtigen Dinge beachtet (755, ASCII, Pfad der CGI-Module).

Wer kann mir helfen?

Danke für eine Antwort.

  1. Der User soll mir seinen Gästebuch-Eintrag schicken, damit ich Ihn überprüfen kann. Nur irgendwie klappt das nicht.

    Stimmt der Pfad zu sendmail? Was steht im Errorlog?

    Siechfred

    --
    Ich bin strenggenommen auch nur interessierter Laie. (molily)
    1. Der Pfad stimmt.

  2. Nun wollte ich also einen Formmailer von Stefan Münz (http://aktuell.de.selfhtml.org/artikel/cgiperl/form-mail/) auf meine Website anwenden.

    Ehrlich, dieses Skript ist leider nicht auf der Höhe der Zeit (ob es das jemanls war ist auch zweifelhaft). Das Skript umzubauen dürfte langwierig sein, ein besseres zu finden könnte schneller gehen.

    #!/usr/bin/perl

    es fängt schon an, dass die Warnungen nicht eingeschaltet werden und kein use strict verwendet wird.

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

    Die Benennung der Variabeln ist zwar so erlaubt aber nicht üblich.

    Mehr dazu hier: http://perldoc.perl.org/perlstyle.html

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

    Das ist unnötig, so geht es einfacher
    foreach my $name (@names) {

    @values = "";

    Das ist falsch, aber ....

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

    sowieso nicht nötig.

    if($name ne "adresse" && $name ne "betreff" && $name ne "begrenzer") {
        foreach $value (@values) {
          $mailtext = $mailtext.$name;
          $mailtext = $mailtext.$begrenzer;
          $mailtext = $mailtext.$value."\n";

    sehr umständlich

    $mailtext .= "$name$begrenzer$value\n";

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

    Hast du mal in den Errorlog geschaut?
    Wenn du nicht die Möglichkeit dazu hast, nutze CGI::Carp

    Es ist aber u.U. einfacher zum versenden ein Modul zu verwenden (z.b. MIME::Lite) , da du noch eine Zeichenkodierung und gültige Header haben willst.

    Struppi.

    --
    Javascript ist toll (Perl auch!)
  3. hi,

    Unter http://www.abtsbessingen.de/gaestebuch.html

    Ahh, ein Thüringer! Was für einen Fehler bekommst Du denn?

    roro

    1. Das Skript läuft durch, aber es kommt keine Mail an.

      1. Das Skript läuft durch, aber es kommt keine Mail an.

        Wenn das Skript durchläuft, dann kann eigentlich nur die Empfängeradresse falsch sein. Nichts steht in den Errorlogs?

        Und wie gesagt, das Skript ist nicht zu empfehlen.

        Struppi.

        --
        Javascript ist toll (Perl auch!)
        1. Es läuft durch, da ja die "danke.html" angezeigt wird. Die Mail-Adresse ist definitiv richtig.

          In meinem Error-Logfile steht diese Meldung, wenn ich das Formular abschicke:

          "[Wed Mar 07 16:59:14 2007] [error] [client 217.230.208.216] 550: Sender must exist (1055402), referer: http://www.abtsbessingen.de/gaestebuch.html"

          1. Es läuft durch, da ja die "danke.html" angezeigt wird. Die Mail-Adresse ist definitiv richtig.

            Die Absender Adresse auch?

            "[Wed Mar 07 16:59:14 2007] [error] [client 217.230.208.216] 550: Sender must exist (1055402), referer: http://www.abtsbessingen.de/gaestebuch.html"

            Das ist edine Meldung von sendmail, es stimmt etwas mit der Mailadresse nicht.

            Struppi.

            --
            Javascript ist toll (Perl auch!)
            1. Ich weiß gerade nicht was Sie meinen. Wo kann ich das überprüfen bzw. ändern?

              1. Moin!

                Ich weiß gerade nicht was Sie meinen. Wo kann ich das überprüfen bzw. ändern?

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

                Wo bitte, steht da der Absender?

                Ohne den wird's laut Deiner Logdatei wohl nicht klappen. Noch ein

                  
                print MAIL "From: hans@wur.st\n";  
                
                

                Natürlich mit echter Absenderadresse, und es sollte gehen.

                -- Skeeve

                1. Folgender Fehler in der Errorlog-Datei:

                  [Wed Mar 07 23:49:21 2007] [error] [client 217.230.208.216] mod_rewrite: maximum number of internal redirects reached. Assuming configuration error. Use 'RewriteOptions MaxRedirects' to increase the limit if neccessary.
                  [Wed Mar 07 23:49:21 2007] [error] [client 217.230.208.216] Request exceeded the limit of 10 internal redirects due to probable configuration error. Use 'LimitInternalRecursion' to increase the limit if necessary. Use 'LogLevel debug' to get a backtrace.
                  [Wed Mar 07 23:49:37 2007] [error] [client 217.230.208.216] 550: Sender must exist (1055402), referer: http://www.abtsbessingen.de/gaestebuch.html

                  1. Folgender Fehler in der Errorlog-Datei:
                    [Wed Mar 07 23:49:21 2007] [error] [client 217.230.208.216] mod_rewrite: maximum number of internal redirects reached. Assuming configuration error. Use 'RewriteOptions MaxRedirects' to increase the limit if neccessary.
                    [Wed Mar 07 23:49:21 2007] [error] [client 217.230.208.216] Request exceeded the limit of 10 internal redirects due to probable configuration error. Use 'LimitInternalRecursion' to increase the limit if necessary. Use 'LogLevel debug' to get a backtrace.

                    Autsch, da läuft was mit mod_rewrite gründlich schief, sieht nach einer Endlosschleife aus.

                    [Wed Mar 07 23:49:37 2007] [error] [client 217.230.208.216] 550: Sender must exist (1055402), referer: http://www.abtsbessingen.de/gaestebuch.html

                    Die Sender-Prüfung ist schiefgegangen, schau dir mal http://nemesis.lonestar.org/site/mail_trouble.html (unter "Sender Verification") an.

                    Siechfred

                    --
                    Ich bin strenggenommen auch nur interessierter Laie. (molily)
                    1. Der mod_rewrite-Fehler ist behoben, doch an dem 550er werde ich wahrscheinlich scheitern. Ich habe die Seite (Sender Verification) durchgelesen, doch so richtig konnte mir das auch nicht.

                      Ich habe das Formular mit richtigen Adressen getestet. Trotzdem Fehler.

                      1. Der mod_rewrite-Fehler ist behoben, doch an dem 550er werde ich wahrscheinlich scheitern. Ich habe die Seite (Sender Verification) durchgelesen, doch so richtig konnte mir das auch nicht.

                        Welche E-Mail wird denn bei "From: " angegeben? Hast du eine andere E-Mail-Adresse vorrätig? Versuche, diese als Absender anzugeben.

                        Siechfred

                        --
                        Ich bin strenggenommen auch nur interessierter Laie. (molily)
                        1. Ich habe die E-Mail angegeben, die im Formular eingegeben wird.

                          Ich weiß bloß nicht wie das bei Hosteurope ist, weil man da für Skriptanwendungen eine Standard-E-Mail-Adresse eingibt.

                          1. Ich habe die E-Mail angegeben, die im Formular eingegeben wird.

                            Ich weiß bloß nicht wie das bei Hosteurope ist, weil man da für Skriptanwendungen eine Standard-E-Mail-Adresse eingibt.

                            die Absendeadresse also die im from steht muss bei dir existieren. Aber ich wiederhole mich, zum lernen von Perl ist das Skript nichts.

                            Struppi.

                            --
                            Javascript ist toll (Perl auch!)
                            1. Aber ich wiederhole mich, zum lernen von Perl ist das Skript nichts.

                              Gerade zum Lernen von Perl eignet sich das Script unter der Annahme, ein Beispiel zu sein, hervorragend :)

                              Siechfred

                              --
                              Ich bin strenggenommen auch nur interessierter Laie. (molily)
                          2. Ich habe die E-Mail angegeben, die im Formular eingegeben wird.

                            Und diese E-Mail wird von sendmail erfolglos verifiziert, deshalb der Fehler. Übernimm die E-Mail, die der User angibt, besser in den Textteil der Mail und schreibe in den From-Header (d)eine gültige E-Mail-Adresse rein, z.B.:

                            my $mailtext = "Name: $name\n";  
                            $mailtext .= "E-Mail: $mail\n";  
                            $mailtext .= "Eintrag: $eintrag\n";  
                              
                            open(MAIL,"|$Sendmail_Prog -t") || print STDERR "Mailprogramm konnte nicht gestartet werden\n";  
                            print MAIL "To: deine_zweitadresse\@example.org\n";  
                            print MAIL "From: webmaster\@abtsbessingen.de\n";  
                            print MAIL "Subject: Neuer GB-Eintrag\n\n";  
                            print MAIL "$mailtext\n";  
                            close(MAIL);
                            

                            Ich weiß bloß nicht wie das bei Hosteurope ist, weil man da für Skriptanwendungen eine Standard-E-Mail-Adresse eingibt.

                            Frage den Support.

                            Siechfred

                            --
                            Ich bin strenggenommen auch nur interessierter Laie. (molily)
                            1. Es geht. Ich ändere noch ein paar Kleinigkeiten und dann ist es perfekt.

                              Ich hoffe, dass Ihr alle euch nach der Quälerei durch mich noch in das Gästebuch eintragt. ;-)

                              Ciao.

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

    $mailto = 'ozzyka@gmail.com';

    Hallo Thüriner,

    nach meiner Erfahrung klappt die Abkürzung "@gmail.com" bei manchen Mailservern nicht versuchs mal mit:

    $mailto = 'ozzyka@googlemail.com';

    gruss mucki

    1. Keine Veränderung.