FormMailer - Formulare per Mail verschicken

Installation und Konfiguration von FormMailer




1. Allgemeines

1.1. Produktbeschreibung in Kürze

FormMailer ist ein kleines Script, welches es ermöglicht, Formulare per Mail zu versenden. Dabei werden auch Dateianhänge und einfache Checks wie gültige Mailadressen und Pflichtfelder unterstützt. UNIX, deutsch, kostenlos.

1.2. Was kann FormMailer?

Online-Formulare gibt es fast auf jeder Homepage: sei es für eine webbasierte Kontaktaufnahme, ein Feedback-Formular, ein Anmelde-/Bestellformular oder was auch immer. Genauso viele Formmailer-Scripts dürften auch im Umlauf sein. FormMailer besitzt einige zusätzliche Funktionen, welchen ihn von der grossen Masse der anderen Scripts anheben:

1.3. Voraussetzungen

Der Server muss natürlich CGI's verarbeiten können. Nebst CGI-Unterstützung gelten noch folgende Voraussetzungen:

1.4. Lizenzbestimmungen

Dieses Skript basiert auf den STANDARD-Lizenzbedinungen, die Sie unter http://www.cgicorner.ch/download/info.shtml oder in der Datei cgicorner.txt im ZIP-Archiv finden.

2. Installation

2.1. Dateien kopieren und Berechtigungen setzen

Folgende Dateien müssen kopiert und mit den entsprechenden Berechtigungen versehen werden:

 cgi-bin - Verzeichnis, z.B. /cgi-bin/formmailer/
. chmod 755/777 Verzeichnis
formmailer.cgi chmod 755 Hauptscript
*.template chmod 600 Mail-Templates
 Daten - Verzeichnis, z.B. /formulare/
. chmod 755/777 Verzeichnis
*.htm / *.php chmod 644 HTML-Formular (selbsterstellt)

3. Konfiguration

3.1. Script

In der Datei formmailer.cgi ist nur die Definition des Templates sowie der Pfad zu sendmail notwendig. Dazu müssen folgende Zeilen angepasst werden:
my $template="simple.template";
Name des Mail-Templates (zum Inhalt später mehr)
my $template2="";
Name des zweiten Mail-Templates (optional; nur bei zwei unterschiedlichen Mails pro Formular benötigt)
my $sendmail="/usr/sbin/sendmail";
Pfad zu sendmail gemäss Informationen des Providers. /usr/bin/sendmail ist auf den meisten Servern korrekt, ebenfalls weit verbreitet ist /usr/lib/sendmail. Ggf. sollten die Support-Seiten des Webhosting-Anbieters konsultiert werden.

3.2. Formular

Das Formular für den Formmailer kann natürlich nach belieben gestaltet werden. Im ZIP-Archiv befinden sich zwei Beispiele: simple.htm (einfaches Personalien-Formular) und mime.htm (Formular mit Möglichkeit zum Upload von zwei Bildern und einer beliebigen Datei). Um die Möglichkeiten von FormMailer komplett nutzen zu können sind jedoch trotzdem noch einige Informationen wichtig:
3.2.1. minimales Formular
Das Formular muss zwingend die zwei versteckten Felder "okurl" und "notokurl" beinhalten, welche die URL bei erfolgreicher Übermittlung (okurl) bzw. bei einem Fehler (notokurl) beinhalten. Die URL muss zwingend komplett inkl. Domainname angegeben werden. Ein minimales Formular sieht also wie folgt aus:
<form action="/cgi-bin/formmailer/formmailer.cgi" method="post">
<input type="hidden" name="okurl" value="http://www.server.ch/danke.htm"/>
<input type="hidden" name="notokurl" value="http://www.server.ch/fehler.htm"/>
<input type="submit" value="Absenden"/>
</form>
Übrigens: FormMailer ist es egal, ob Sie das Formular mittels method="get" oder method="post" übermitteln. Nehmen Sie, was Ihnen besser gefällt. Bei grösseren Texten sollten Sie post verwenden, da bei "get" die maximale Länge beschränkt ist (Länge browserabhängig).
3.2.2. Feldtypen
FormMailer entscheidet anhand des Feldnamens, um welchen Typ es sich handelt. Somit muss an keiner Stelle definiert werden, welche Felder existieren und welchen Typ sie haben. Folgende Möglichkeiten stehen zur Verfügung:
name Feld mit beliebigem Inhalt (auch mehrzeilig mit einer textarea)
NUM_name Nummerisches Feld. Es sind nur Zahlen sowie . , - und ´ erlaubt. Enthält das Feld andere Zeichen wird der Versand abgebrochen und es wird die notokurl angezeigt.
NNUL_name Pflichtfeld (auch mehrzeilig mit einer textarea). Ist das Feld leer wird der Versand abgebrochen und es wird die notokurl angezeigt.
1LINE_name Feld mit beliebigem Inhalt. Allfällige Zeilenumbrüche werden automatisch entfernt. Dieser Feldtyp (oder MAIL_ bzw. NMMAIL_) ist bei Header-Feldern dringend empfohlen, damit es nicht möglich ist, im Header-Bereich zusätzliche Informationen einzufügen.
MAIL_name Leeres Feld oder Feld mit einer Mailadresse. Enthält das Feld andere Werte wird der Versand abgebrochen und es wird die notokurl angezeigt.
NMMAIL_name Pflichtfeld für Mailadresse. Ist das Feld leer oder enthält das Feld andere Werte wird der Versand abgebrochen und es wird die notokurl angezeigt.
EMPTY_name Wenn das Feld "name" leer ist, wird stattdessen der Wert des Feldes "EMPTY_name" verwendet (in der Regel sind EMPTY_-Felder verstecktes Felder)
IMG_name Feld mit einem hochgeladenen Bild (GIF/JPG/PNG; Datei wird geprüft). Muss zwingend vom Typ file sein: <input type="file" name="IMG_meinbild">
FILE_name Feld mit einer beliebigen Datei. Muss zwingend vom Typ file sein: <input type="file" name="FILE_meinedatei">
3.2.3. Welcher Feldtyp für welchen Zweck?

Den richtigen Feldtyp zu wählen ziemlich einfach. Am besten eignen sich einige Kontrollfragen:

1. Handelt es sich um eine hochgeladene Datei?
Ja
2. Handelt es sich bei der Datei um ein Bild?
Ja
Es wird der Typ IMG_ empfohlen. Alternative wäre FILE_ wenn es auch Bilder ausser JPG/GIF/PNG (z.B. BMP etc.) sein können.
Nein
Es kommt nur der Typ FILE_ in Frage, alle anderen Feldtypen funktionieren nicht.
Nein
2. Handelt es sich um ein Pflichtfeld?
Ja
3. Handelt es sich um eine Mailadresse?
Ja
Es wird der Typ NMMAIL_ empfohlen. Alternative wäre NNUL_ es auch mehrere Mailadressen sein könnten.
Nein
Es wird der Typ MAIL_ empfohlen.
Nein
3. Handelt es sich um eine Mailadresse?
Ja
Es wird der Typ MAIL_ empfohlen.
Nein
4. Handelt es sich um ein Header-Feld?
Ja
Es wird DRINGEND der Typ 1LINE_ empfohlen! Bei anderen Feldtypen wäre Missbrauch des Formulars möglich. Eine Alternative wäre NUM_, falls es sich um ein nummerisches Feld handelt.
Nein
5. Handelt es sich um ein nummerisches Feld?
Ja
Es wird der Typ NUM_ empfohlen. Alternative wäre ein normales Feld, falls noch Währung, Landeskennzeichen oder anderer Text vorhanden sein könnte.
Nein
Es wird empfohlen, ein normales Feld zu verwenden.

3.3. Mail-Template

Das Mail-Template besteht aus dem kompletten Mail. Dabei sind Mail-Header und der eigentliche Text durch eine Leerzeile getrennt, welche zwingend vorhanden sein muss.

Das Verfahren mit dem Mail-Template ist simpel: Fix-Text kann einfach eingetragen werden. Dynamischer Text kann mit <!--feldname--> eingefügt werden, wobei feldname der Name des Feldes im HTML-Formular ist.

Der Wert des Feldes <input type="text" name="MAIL_email"/> (Mailadresse oder leer) kann also im Mail-Template mit <!--MAIL_email--> eingefügt werden.

Die Zeilen
Date: <!--date-->
Message-ID: <!--msgid-->
sollten in jedem Mail belassen werden, um es korrekt zu formatieren. Die Felder "date" und "msgid" werden vom Script generiert und müssen nicht im Formular vorhanden sein.

4. Beispiel

Nachfolgend wird anhand einigen Beispiel-Szenarien der Aufbau des Formulares sowie des Mail-Templates genauer beschrieben. Ebenfalls befinden sich noch zwei Beispiel-Templates im ZIP-Archiv: simple.htm/simple.template bzw. mime.htm/mime.template. Die hier aufgeführten Formulare enthalten keine Formatierung, um nicht die zentralen Elemente durch Formatierungen zu verstecken.

4.1. Beispiel 1: Homepage weiterempfehlen

In diesem Beispiel gestalten wir ein Weiterempfehlungsformular, mit dem Besucher andere Besucher auf Ihre Homepage aufmerksam machen können.. Dazu benötigen wir folgende Formularfelder:

Absender- und Empfängernamen definieren wir als normale Felder; natürlich sollten die Felder ausgefüllt sein, für die Funktion des Formulares ist es jedoch nicht zwingend notwendig, also wollen wir den Besucher nicht schikanieren. Wenn der Absendername nicht ausgefüllt ist, wollen wir aber einen Default-Wert verwenden.

Die Absendermailadresse soll optional sein, jedoch wenn ausgefüllt eine Mailadresse sein, auch hier nehmen wir bei leerem Feld eine Default-Mailadresse.

Die Empfängeradresse muss zwingend eine ausgefüllte Mailadresse sein, sonst kann das Mail nicht zugestellt werden.

Wir kreieren also folgendes Formular:

<form action="http://www.server.ch/cgi-bin/formmailer/formmailer.cgi" method="post"<
<input type="hidden" name="okurl" value="http://www.server.ch/danke.htm"<
<input type="hidden" name="notokurl" value="http://www.server.ch/fehler.htm"<
<input type="hidden" name="EMPTY_sendername" value="Ein Besucher"<
<input type="hidden" name="EMPTY_MAIL_sendermail" value="info@server.ch"<
Absendername: <input type="text" name="sendername"<
Absendermail: <input type="text" name="MAIL_sendermail"<
Empfängername: <input type="text" name="rcptname"<
Empfängermail: <input type="text" name="NMMAIL_rcptmail"<
Anmerkung <textarea name="addcomment"></textarea>
<input type="submit" value="Seite weiterempfehlen"<
</form>
Wir haben die Felder Das dazu passende Mail-Template könnte wie folgt aussehen:
From: <!--MAIL_sendermail-->
To: <!--NMMAIL_rcptmail-->
Date: <!--date-->
Message-ID: <!--msgid-->
Subject: Tolle Homepage gefunden: http://www.server.ch

Hallo <!--rcptname-->
<!--sendername--> möchte dich auf die Homepage http://www.server.ch aufmerksam machen.
server.ch bietet jede Menge ... sowie ... und ist damit die erste Anlaufsstelle rund um ...
Besuche doch auch du mal http://www.server.ch und überzeuge dich selbst!

<!--sendername--> hat zu dieser Homepage noch folgende Anmerkung:
<!--addcomment-->
Das wäre schon alles: das Weiterempfehlungsformular ist einsatzbereit!

4.2. Beispiel 2: Foto für Bildergalerie

In diesem Beispiel gestalten wir ein kleines Formular, mit dem der Besucher bis zu drei Fotos an den Webmaster senden kann. Der Besucher soll seinen Namen und seine Mailadresse (zwingend) angeben und kann noch einen kurzen Kommentar abgeben. Ebenfalls stellen wir mehrere Kategorien zur Verfügung, welche mittels Dropdown ausgewählt werden können. Dazu benötigen wir folgende Formularfelder:

Absendernamen definieren wir Pflichtfeld

Absendermail ist ebenfalls ein Pflichtfeld und muss eine Mailadresse sein.

Die Bilder sollen geprüft werden.

Kategorie ist ein Dropdown

<form action="http://www.server.ch/cgi-bin/formmailer/formmailer.cgi" method="post" enctype="multipart/form-data"<
<input type="hidden" name="okurl" value="http://www.server.ch/danke.htm"<
<input type="hidden" name="notokurl" value="http://www.server.ch/fehler.htm"<
Absendername: <input type="text" name="NNUL_sendername"<
Absendermail: <input type="text" name="NMMAIL_sendermail"<
Kategorie: <select name="1LINE_cat"<
<option value="Kategorie 1">Kategorie 1</option>
<option value="Kategorie 2">Kategorie 2</option>
</select>
Anmerkung <textarea name="addcomment"></textarea>
Foto1: <input type="file" name="IMG_bild1"<
Foto2: <input type="file" name="IMG_bild2"<
Foto3: <input type="file" name="IMG_bild3"<
<input type="submit" value="Fotos senden"<
</form>
Wir haben die Felder

Wichtig bei MIME-Mails ist unbedingt, dass der enctype gesetzt wird und die method=post ist: method="post" enctype="multipart/form-data"

Das dazu passende Mail-Template könnte wie folgt aussehen:
From: <!--NMMAIL_sendermail-->
To: fotos@server.ch
Date: <!--date-->
Message-ID: <!--msgid-->
Subject: Neue Fotos für <!--1LINE_cat-->
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="<!--boundary-->"

--<!--boundary-->
Content-Type: text/plain; charset=iso-8859-1
Content-Transfer-Encoding: 8bit

<!--NNUL_sendername--> (<!--NMMAIL_sendermail-->) hat die angehängten Fotos für die Kategorie
<!--1LINE_cat--> zugeschickt. Dabei wurde noch folgender Kommentar verfasst:
<!--addcomment-->

<!--IMG_bild1-->
<!--IMG_bild2-->
<!--IMG_bild3-->
--<!--boundary-->--

Die Zeilen mit Content-Type und Boundary müssen im Template stehen, damit die Dateianhänge korrekt gehandhabt werden.

Nun wollen wir es aber perfekt und erstellen noch ein zweites Template (tragen wir bei $template2 ein), welches sich beim Absender bedankt. Dieses Mail ist einfacher aufgebaut:
From: fotos@server.ch
To: <!--NMMAIL_sendermail-->
Date: <!--date-->
Message-ID: <!--msgid-->
Subject: Deine Fotos an server.ch

Hallo <!--NNUL_sendername-->

Vielen Dank für deine Fotos. Wir werden die Fotos so schnell wie möglich in unserer Gallerie veröffentlichen.
Bei allfälligen Fragen wende dich bitte an fotos@server.ch.

--
Dies ist ein automatisch generiertes Mail.
Nun hätten wir auch das geschafft!


Copyright © 2005 by Jürg Sommer, jsommer@cgicorner.ch
http://www.cgicorner.ch
Letzte Änderung: 20. August 2005