Pampel: FormMail 1.92 von Matt Wright

Hallo zusammen,

das Script von Matt Wright habe ich schon oft eingesetzt, ohne große Modifikationen vorzunehmen. Nun muss ich für einen Kunden doch eine größere Änderung machen und ich bin mit Perl nicht sooo fit.

Es gibt in dem Script eine Variable "email", zu finden in "# Define the configuration associative array." Diese Variable nimmt den Wert aus dem gleichlautenden Formularfeld auf. Wenn eine gültige E-Mail-Adresse dort eingetragen ist, wird sie als gültigen Absender in das "Von"-Feld der abgeschickten E-Mail geschrieben, so dass man dirket "antworten" kann.

Mein Kunde möchte nun das Feld auch in der Auflistung aller Felder im eigentlichen Text der E-Mail haben. Diese Auflistung wird über "foreach $field (@Field_Order)" geschrieben.

Ich möchten nun *vor* dieser Schleife gerne noch "  E-Mail: email@abc.de" schreiben und weiß aber nicht, wie ich dieses Feld und den Wert ausgeben muss.

Kann mir von Euch jemand da weiterhelfen?

Danke für Hinweise,

Pampel

  1. Moin!

    Hallo zusammen,

    das Script von Matt Wright habe ich schon oft eingesetzt ... für einen Kunden

    Um Gottes Willen!

    Du hast was?

    Du hast dieses Script bei KUNDEN verwendet? Um Gottes willen. Lerne: dieses Skript ist unsicher. Es trägt die Adresse des Empfängers und den Inhalt der Nachricht als (verstecktes) Formularfeld mit sich herum. Das Prüfen des Referers macht es nicht sicher. Der ist bei wget zum beispiel anzugeben und mit diesem Tool sende ich tausende Spam-mails an beliebige Personen. Deine Kunden können Ärger bekommen.

    MFFG (Mit freundlich- friedfertigem Grinsen)

    fastix®

    --
    Meinereinerselbst ist auf der Suche nach Aufträgen
    1. Moin!

      das Script von Matt Wright habe ich schon oft eingesetzt ... für einen Kunden

      Um Gottes Willen!

      Du hast was?

      Bevor du hier die Pferde scheu machst - erstmal mit der Ruhe.

      Ja, man kann das Script als ganz böses Skript einsetzen und zum unfreiwilligen Spammer werden. Mittlerweile wird auf Webservern absichtlich nach den Skripten "formmail.pl" oder "formmail.cgi" gescannt und getestet, ob diese an eine vom Spammer abfragbare Mailadresse Mails versenden - im Erfolgsfall erfolgt dann die Spamwelle über das Skript.

      Allerdings gilt genauso, dass in den aktuellen Versionen des Skriptes der Empfänger fest im Skript eingestellt werden _kann_.

      Das muß man natürlich machen, ansonsten hat man ein Problem. Nur: Das muß man bei _jedem_ Skript machen, was mailt.

      Der Vorwurf der Unsicherheit mag gegenüber alten Versionen, die die Ziel-Mailadresse zwingend als Formularwert übergeben kriegen mußten, zutreffen. Aber auch das Matt-Wright-Script hat dazugelernt.

      Dass man grundsätzlich keinerlei Mailservice-Dienste auf der eigenen Website anbieten sollte, die beliebigen Text an beliebige Mailadressen versenden, sollte aufgrund einiger Gerichtsurteile, in denen sowas verboten wurde, hoffentlich auch klar sein.

      Also, fastix: Bitte nicht gleich Panik machen, sondern erklären, wo genau das Problem liegt und wie man es beheben kann, sofern man es nicht ohnehin schon abgestellt hat.

      - Sven Rautenberg

      --
      ss:) zu:) ls:[ fo:} de:] va:) ch:] sh:) n4:# rl:| br:< js:| ie:( fl:( mo:|
    2. Hey,

      Um Gottes Willen! Du hast was? Du hast dieses Script bei KUNDEN verwendet? Um Gottes willen. Lerne: dieses Skript ist unsicher.

      Nachdem es mir der Provider, bei dem wir hosten, selbst empfohlen hat, sehe ich da nicht das Problem!!!

      Es trägt die Adresse des Empfängers und den Inhalt der Nachricht als (verstecktes) Formularfeld mit sich herum.

      Weiß ich :-[ !!!

      Deine Kunden können Ärger bekommen.

      Habe Sie aber nicht. Zum einen liegt das daran, dass der Autor auf alle erkannten (!) Sicherheitsmängel die entsprechenden Fehler beseitigt hat (siehe auch Antwort von Sven). Zum anderen prüft auch der Provider selbst das Script und hat ab einem bestimmten Zeitpunkt nur noch die Version 1.92 bei sich zugelassen.

      Wenn Du mir nun noch etwas zu meinem *eigentlichen* Problem sagen könntest, wäre ich Dir dafür noch viel dankbarer als ohnehin schon.

      Pampel

      1. Moin!

        Wenn Du mir nun noch etwas zu meinem *eigentlichen* Problem sagen könntest, wäre ich Dir dafür noch viel dankbarer als ohnehin schon.

        Ja, klar. Ich schreib Dir eben ein besseres Skript und mache das gleich mit brauchbaren Kommentaren :)

        ----------
        #! /usr/bin/perl -W

        Die Shebang ist bei Perl notwendig.

        use strict; # Alle Variablen müssen vereinbart werden

        ################## Konfiguration #########################
        #        Diese Werte müssen gesetzt werden:              #
        ##########################################################

        my $to_name[0] = "Kundendienst"; # Wir richten gleich mal mehrerer Empfänger ein, der Versender kann wählen
        my $to_email[0] = "kundendienst@server.tld"; # Emailadresse des selben.
                                                      # Man beachte den Backslash vor dem '@'

        my $to_name[1] = "Vertrieb";
        my $to_email[1] = "vertrieb@server.tld"; # Und so weiter und so fort

        Soll es nur einen Empfänger geben, einfach nur diesen stehen lassen!

        my $MailPgm = '/usr/sbin/sendmail'; # Hier den Pfad zum Mailprogramm eintragen!

        ################## / Konfiguration #######################

        Wir vereinbaren mal das folgende

        my %FORM;                        # ist ein Hash (assoziatives Array)
        $FORM{'send_to'}           = ''; # Das ist eine Zahl!
        $FORM{'senders_email'}     = ''; # Variable für die email Adresse des Versenders
        $FORM{'senders_name'}      = ''; # Variable für den Namen des
                                         # Versenders
        $FORM{'senders_firstname'} = ''; # Vorname
        $FORM{'senders_sexus'}     = ''; # Herr/Frau/Firma
        $FORM{'senders_phone'}     = '';
        $FORM{'senders_fax'}       = '';
        $FORM{'senders_subject'}   = ''; # Das Subject der Mail
        $FORM{'senders_text'}      = ''; # Der Nachrichteninhalt

        Das sind auch die Namen der Formularelemente

        Auslesen der Werte aus STDIN (Formular wir per POST gesendet):

        Zuerst die benötigten Variablen vereinbaren (wir haben use strict!)

        my $buffer;
        my $value;
        my $name
        my @pairs;   #Array
        my $pair;

        read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
        @pairs = split(/&/, $buffer);
        foreach $pair (@pairs) {
           ($name, $value) = split(/=/, $pair);
           $value =~ tr/+/ /;
           $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
           # Die Werte kommen URLcodiert. Die beiden Zeilen decodieren das.
           # Bei $name ist das nicht nötig.(Namenswahl...)
           $value =~ s/|/:/g; # Ersetzen der Pipe- Zeichen durch ':' (Sicher ist sicher...)
           $FORM{$name} = $value;
        }

        jetzt stehen, wenn das Formular abgesendet wurde, die Daten im assoziativen Array @Form

        Schauen wir nach, ob alles, was benötigt wird drinsteht:

        my $send=1; # Wir gehen davon aus, das wir senden, das können wir gleich negieren:

        if ($FORM{'senders_name'} eq "") AND ($FORM{'senders_firstname'} eq "") {
          $send=0;
        }

        if ($FORM{'senders_subject'} eq "") OR ($FORM{'senders_text'} eq "") {
          $send=0;
        }

        Richtig geraten. Wenn der Versender keinen (Name oder Vorname),

        kein Subjekt oder keinen Text eingegebene hat,

        dann wollen wir nicht senden...

        if ($send==1) {
          # Der Senden- Teil:
          # Zuerst den Text zusammenbauen:
          my $text=$FORM{'senders_text'}; # Vereinbarung der Variablen und
                                          # Zuweisen des Inhalts aus dem
                                          # Formular

        my $pre_text;                   # Hilfsvariable...
          $pre_text = "Name:     ".$FORM{'senders_name'}."\n";
          # Variable pre_text bekommt "Name:       Müller[Zeilenumbruch]"

        $pre_text = "Vorname:  ".$FORM{'senders_firstname'}."\n".$pre_text;
          # Man nennt das rekursive Zuweisung

        $pre_text = "Anrede:  ".$FORM{'senders_sexus'}."\n".$pre_text;
          $pre_text = "Tel:     ".$FORM{'senders_phone'}."\n".$pre_text;
          $pre_text = "Fax:     ".$FORM{'senders_fax'}."\n".$pre_text;

        $text=$pre_text."\n\n".$text; #zwei Zeilenumbrüche dazwischen...

        # Jetzt schauen wir uns mal das Subjekt an:
          $FORM{'senders_subject'}= ~ s/\n//g;
          # Wir löschen alle Zeilenumbrüche aus dem Subjekt

        # jetzt die mailadresse:
          # Wir verzichten auf eine Prüfung aber bauen diese zusammen aus Name, Vorname und email:

        $FORM{'senders_email'} = $FORM{'senders_firstname'}." ".$FORM{'senders_name'}." <".$FORM{'senders_name'}.">";
         # Das muss alles auf eine Zeile! heraus kommt:
         # "Vorname Name user@server.tld"

        # jetzt den Empfänger:
         $form{'send_to'} = s/([0-9])/$1/g;
         # hoho! Enthält nur Ziffern!
         $form{'send_to'} = $to_email[$form{'send_to'}];
         # Und jetzt die vorkonfigurierte Adresse...

        # So. Senden.

        my $Mail; # vereinbaren...
          open (MAIL, "|$MailPgm $Mail") || die "Fehler beim Zugriff auf $MailPgm!\n";
          # Dies öffnet einen "Kanal zum Mailprogramm, dass dann wie eine Datei behandelt wird:

        print MAIL "From: $FORM{'senders_name'}\n";
          print MAIL "Reply-To: $FORM{'senders_name'}\n";
          print MAIL "To: $form{'send_to'}\n";
          print MAIL "Subject: $FORM{'senders_subject'}\n\n";
          print MAIL "$text\n.";
          close MAIL;

        Wir nehmen mal an, das ging klar. Und senden eine Bestätigung:

        print << "__ENDE__";
        Content-type: Text/Html

        <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
                  "http://www.w3.org/TR/html4/loose.dtd">
        <html>
        <head>
          <title>Versandbestätigung</title>
          <link rel="stylesheet" href="dein.css" type="text/css">
        </head>
        <body>
          <h1>Ihre Nachricht wurde verschickt</h1>
          <p>Hier könnte Ihr Text stehen :)</p>
        <body>
        </html>
        __ENDE__

        # Wichtig: das __ENDE__ (Es geht auch mit anderem Text) muss   alleine
          # in einer Zeile und zwar am ANFANG stehen!
          exit;
          # Wir brechen einfach ab.
        }

        Senden des Formulars (das einzige, was uns übrigbleibt...) Wir sind auch so nett und tragen eventuell bereits eingetragenes auch ein...

        print << "__ENDE__";
        Content-type: Text/Html

        <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
                  "http://www.w3.org/TR/html4/loose.dtd">
        <html>
        <head>
          <title>Mailformular</title>
          <link rel="stylesheet" href="dein.css" type="text/css">
        </head>
        <body>
          <h1>Senden eines eMails</h1>
          <form action="mymail.pl" method="post">
        __ENDE__

        UPS! Wieso? Ach ja die Empfänger.

        if (@to_name == 1) {
          # ist nur ein Empfänger konfiguriert:
          print"<input type="hidden" name="send_to" value="0">";
        } else {
          # wenn mehrere die Auswahlliste:
          print "An: <select name="send_to">\n";
          for (my $i=0; $i<@to_name; $i++) {
            print "  <option value="$i">$to_name[$i]</option>\n";
          }
          print "</select><br>\n";
        }

        print << "__ENDE__";
          Anrede:<select name="">
                   <option value="Herr">Herr</option>
                   <option value="Frau">Frau</option>
                   <option value="Frau">Firma</option>
                 </select><br>
          Ihr Name:<input type="text" name="senders_name" value="$FORM{'senders_name'}"><br>

        Ihr Vorname:<input type="text" name="senders_name" value="$FORM{'senders_firstname'}"><br>

        Ihre Mailadresse:<input type="text" name="senders_email" value="$FORM{'senders_email'}"><br>

        Ihre Telefonnummer:<input type="text" name="senders_phone" value="$FORM{'senders_phone'}"><br>

        Ihre Telefaxnummer:<input type="text" name="senders_fax" value="$FORM{'senders_fax'}">

        <hr>
          Subjekt:<input type="text" name="senders_subject" value="$FORM{'senders_subject'}">
          <hr>
          Ihre Nachricht:<br>
          <textarea name="senders_text" cols=80 rows=10>$FORM{'senders_text'}</textarea>

        </form>
        <body>
        </html>
        __ENDE__

        Fertig!

        ---------
        So ist das besser. Es gibt die Möglichkeit einer Auswahl, keine Mailadresse im Formular, also sicher. Den ganzen Schiß mit dem Referer kann man sich getrost sparen.

        Ach ja. Dies ist blind programmiert und ich bin jetzt zu müde um es zu testen. Es können also kleine Faselfehler drin sein.

        ich denke mal, es ist jetzt auch einfach zu ändern, weil kommentiert oder selbsterklärend.

        MFFG (Mit freundlich- friedfertigem Grinsen)

        fastix®

        --
        Meinereinerselbst ist auf der Suche nach Aufträgen
        1. Hallo

          my $to_name[0] = "Kundendienst"; # Wir richten gleich mal mehrerer Empfänger ein, der Versender kann wählen
          my $to_email[0] = "kundendienst@server.tld"; # Emailadresse des selben.
                                                        # Man beachte den Backslash vor dem '@'

          my $to_name[1] = "Vertrieb";
          my $to_email[1] = "vertrieb@server.tld"; # Und so weiter und so fort

          Weil du am Ende des Postings auf eventuelle "Faselfehler" hinweist:
          Auch bei der zweiten evtl. verwendeten Emailadresse sollte der
          "beachtungswürdige Backslash vor dem @ nicht fehlen. :-)

          Tschö, Auge

          --
          Die Musik drückt aus, was nicht gesagt werden kann und worüber es unmöglich ist zu schweigen.
          (Victor Hugo)
          1. Moin!

            Ja, danke.

            Ich hab bei der morgendlichen Durchsicht noch was gefunden:

            # jetzt den Empfänger:
             $FORM{'send_to'} = s/([0-9])/$1/g;
             # hoho! Enthält nur Ziffern!
             $FORM{'send_to'} = $to_email[$form{'send_to'}];
             # Und jetzt die vorkonfigurierte Adresse...

            (am besten suchen: "$form" und ersetzen durch "$FORM")

            MFFG (Mit freundlich- friedfertigem Grinsen)

            fastix®

            --
            Meinereinerselbst ist auf der Suche nach Aufträgen
        2. *wennichnurwüßtewasichnunsagensoll*
          Hey,

          Ja, klar. Ich schreib Dir eben ein besseres Skript und mache das gleich mit brauchbaren Kommentaren :)


          #! /usr/bin/perl -W ....

          Zunächst mal vielen Dank für das Script. Bewundernswert, wie Du das so "... eben ..." mal aus dem Ärmel schütteln kannst. Einem solchen Genie mag man das "Meinereinerselbst ist auf der Suche nach Aufträgen" fast gar nicht abnehmen wollen.

          Ich bin ja durchaus geneigt, das Script zu testen. Über Sicherheit kann ich leider nichts sagen, da fehlt es mir am nötigen Know-How.

          Aber *wenn* ich Dich schon mal an der Strippe habe: kannst Du mir dann nicht doch noch bei meinem wirklich *eigentlichen* Problem [pref:t=56860&m=318005] helfen? Ich wüßte wirklich gerne, wie ich das hinbekommen kann.

          Danke!

          Pampel

          1. Moin!

            Aber *wenn* ich Dich schon mal an der Strippe habe: kannst Du mir dann nicht doch noch bei meinem wirklich *eigentlichen* Problem [pref:t=56860&m=318005] helfen? Ich wüßte wirklich gerne, wie ich das hinbekommen kann.

            Ups... habe ich das nicht? Nun: ich glaube, daß ich ein Skript hingeschrieben habe, (ich hab's) immer noch nicht getestet...) welches sehr leicht anpassbar ist. Wenn Du also irgendwas(hier: $FORM{'senders_mail'}) im emailtext unterbringen willst, dann schau Dir an, wie ich es gemacht habe: ($pre_text...). Dies Forum, soll Antrieb und Hilfe zum Selbstmachen und Lernen geben... deshalb ist das Skript auch recht ordentlich (und deutsch) kommentiert. Mit ein wenig lesen sollte man herausfinden, was es tut. Bitte aber auch die Korrekturen in den Folgebeiträgen mit lesen: und es ist immer noch ungetestet.

            Bewundernswert,... aus dem Ärmel schütteln kannst.

            Das ist leichter, als sich in das Unikum von Matt reinzudenken. Der hat sein ursprünglich einfaches Skript immer komplizierter gemacht, was nicht gleichbedeutend mit lesbarer ist. In Summa erscheint mir auch das "neu" machen eines relativ trivialen Mailskriptes einfacher als das Ändern des seinigen. Und ach ja: Programmieren selbst ist eigentlich eine eher langweilige Arbeit: eher ein "Verwalten".

            mag man das "Meinereinerselbst ist auf der Suche nach Aufträgen" fast gar nicht abnehmen wollen.

            Wir sind in Deutschland. Das ist nicht das Land der Dichter und Denker, sondern der Richter und Bedenkenträger... Mangels einer formellen Qualifikation (tatsächlich: Ich unterschreibe Zertifikate einer rennomierten Computerschule, habe aber selbst keines...) ist es für mich nicht gerade einfach Aufträge zu bekommen, wenngleich diejenigen, die bisher Ihre Bedenken übergehen konnten auch zufrieden waren...

            MFFG (Mit freundlich- friedfertigem Grinsen)

            fastix®

            --
            Meinereinerselbst ist auf der Suche nach Aufträgen
            1. Hallo,

              wirklich aufrichtigen Dank für Deine Mühen.

              Pampel

        3. Hallo fastix,

          ich hoffe, Du kannst auch dieses Problem noch lösen:

          Internal Server Error
          The server encountered an internal error or misconfiguration and was unable to complete your request.
          Please contact the server administrator, admin@server.tld 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.26 Server at server.tld Port 80

          Ich habe das Formaular an das CGI-Script geschickt und bekam diese Antwort. Rechte usw. sind alle OK, Fehlerkorrekturen in Deinem Script sind auch berücksichtigt.

          Danke für Hinweise.

          Pampel

    3. Hallo fastix,

      (..) und mit diesem Tool sende ich tausende Spam-mails an beliebige
      Personen.

      Du bist das also mit den Penis-Verlängerungs-Pillen. Schäm Dich!

      Tim

      --
      SCNR