fastix®: FormMail 1.92 nicht von Matt Wright

Beitrag lesen

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