alex: Sendmail aber als in html formatierte mail?!

Hallo!
Würde Formulardaten gerne etwas "ansprechender" versenden, als eine einfache Liste wie

Name: Peter
Stadt: Berlin
email: a@b.c
.
.
.

So funktioniert das schon in meinem Skript.
Problem ist nur, dass nicht alle Variablen einzeln aufgelistet werden, sondern automatisch immer die nächste in eine neue Zeile...
Dazu müßte ich dann doch wahrscheinlich jede Variable extra schreiben, so wie ich  mir das vorstelle, oder?

Folgendes Skript funktioniert bei mir schon wunderbar(eine mail an mich und eine zur Bestätigung an den Absender):

#!/usr/bin/perl

-------> SMTP-Programm zum Versenden der Mail:

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

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

use CGI;

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

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

MAIL AN MICH

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

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

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

my $mailtext = "Aufgegebene Bestellung:\n\n";
$mailtext .= "IP des Bestellers: $ENV{'REMOTE_ADDR'}\n";
foreach(@names) {
  $name = $_;
  @values = "";
  @values = $query->param($name);
  if($name ne "mailto" && $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);

BESTAETIGUNGSMAIL

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

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

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

my $mailtext = "Aufgegebene Bestellung:\n\n";
$mailtext .= "IP des Bestellers: $ENV{'REMOTE_ADDR'}\n";
foreach(@names) {
  $name = $_;
  @values = "";
  @values = $query->param($name);
  if($name ne "mailto" && $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";

So, ist das so überhaupt OK? Hab einfach den Teil der die email verarbeitet kpl. kopiert und nur die Variable maito(fester Wert im Formular) mit der Variable email(wird eingegeben) vertauscht, jedenfalls funktioniert es so:-)
Nur wie bekomme ich es jetzt hin, dass der mailtext in html formatiert werden kann?
So wie das hier gemacht ist, geht das ja nur mit einer Liste, ich würde diese Liste gerne in mehrere Bereiche aufteilen, muß ich dann alle Variablen einzeln in den mailtext schreiben?
Kann man hier nicht auch sowas machen, wie der Print Befehl mit EOF bei normalen html Seiten? Wie bekomme ich das dann in die mailtext-Variable???

Wäre für ein paar Hinweise sehr dankbar!

Nur kurz am Achluss noch, hat es überhaupt Sinn meiltext in html zu formatieren, eigentlich kann das doch jeder lesen, vielleicht außer das T-Online... aber da ist die Seite auch als Formular angehängt, was meint Ihr dazu?

Gruß
Alex

PS: Wie kann ich eigentlich eine andere Absenderadresse einfügen, so dass derjenige der die Bestätigung erhält auch direkt an diese Adresse antworten kann?

  1. Hi,

    Folgendes Skript funktioniert bei mir schon wunderbar(eine mail an mich und eine zur Bestätigung an den Absender):
    [Skript]
    So, ist das so überhaupt OK?

    Hab mir jetzt nicht das ganze Skript durchgelesen, aber ich glaube in "Programmieren mit Perl" steht "Ein Perl-Programm ist dann korrekt wenn es seinen Zweck erfüllt" (oder so ähnlich). ;-)

    Kann man hier nicht auch sowas machen, wie der Print Befehl mit EOF bei normalen html Seiten? Wie bekomme ich das dann in die mailtext-Variable???

    Kann man schon. Problem bei HTML-Mails ist, dass die in einem besonderen MIME-Format geschrieben werden müssen, damit Nur-Text-Mail-Programm dir nicht den HTML-Code anzeigen. Damit du nicht selber mit den ganzen MIME-Typen hantieren musst, gibt's (natürlich) ein Perl-Modul:

    http://search.cpan.org/search?dist=MIME-Lite-HTML

    Wenn du das Modul benutzt, erstellst du eine HTML-Seite in einer Variablen (z.B. $html = "<html><head>...." und übergibst das an das Modul. Das Modul erstellt daraus eine vollwertige HTML-Mail, wenn gewünscht mit eingebetteten Bilder usw.

    Nur kurz am Achluss noch, hat es überhaupt Sinn meiltext in html zu formatieren, eigentlich kann das doch jeder lesen, vielleicht außer das T-Online... aber da ist die Seite auch als Formular angehängt, was meint Ihr dazu?

    Uh-oh, schon mal in einen Flamewar von Lynx-Anhängern geraten? ;-)

    PS: Wie kann ich eigentlich eine andere Absenderadresse einfügen, so dass derjenige der die Bestätigung erhält auch direkt an diese Adresse antworten kann?

    Das müsste auch mit dem Modul gehen.

    Gruß
    Thorsten

    1. Hallo!
      Danke für die Antwort!

      Perl-Modul:

      http://search.cpan.org/search?dist=MIME-Lite-HTML

      Muß man das modul extra installieren?, bis jetzt konnte ich immer welche verwenden, die vorhanden waren!

      Uh-oh, schon mal in einen Flamewar von Lynx-Anhängern geraten? ;-)

      Nööö?!

      Geht das mit der Reply Adresse nicht einfacher?

      Gruß
      Alex

      1. Hi,

        Perl-Modul:

        http://search.cpan.org/search?dist=MIME-Lite-HTML

        Muß man das modul extra installieren?, bis jetzt konnte ich immer welche verwenden, die vorhanden waren!

        Ja, das muss man extra installieren, aber
        [x] du willst MIME-Mails nicht von Hand erstellen...

        Geht das mit der Reply Adresse nicht einfacher?

        Mmh, also in deinem Quelltext kann man folgende Änderung machen:

        vorher:

        -------> 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);

        nachher:

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

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

        Das Reply-To sollten eigentlich alle Email-Programme verstehen als "Antworten an eine Adresse die sich von der Absenderadresse unterscheidet". Vielleicht geht auch ein

        print MAIL "From: sender@domain.com\n";

        aber da kann es sein dass der SMTP-Server dich als Relayer (Versender einer Email über einen Server den du nicht benutzen darfst) abweist.

        Trotzdem: mit MIME::Lite::HTML hast du weniger Stress...

        Gruß
        Thorsten

        1. Hallo!
          Danke, ich glaub so könnte es gehen!

          Leider hab ich keinen eigenen Server sondern nur Webspace und kann sowas  leider nicht installieren:-(

          Aber wie gesagt, ich denke das es auch so geht. Das mit html muß ich dann wohl erst mal "auf Eis legen", probiere ich erstmal (wie oben beschrieben) die textmail "anständiger" zu formatieren.
          Gruß
          Alex

    2. Hallo,

      wie sähe das denn aus, wenn ich halt auf html verzichte, nur mit Absätzen und gleichen Abständen, also nicht

      name: Peter
      Adresse: Berlin
      ...

      sondern

      name:          Peter
      Adresse:       Berlin
      ...

      Ich hab halt für die Zwischenräume nur ": " eingesetzt, wie könnte ich dasd hinkriegen, dass das wie oben erscheint, sowas wie tab gibts da wahrscheinlöich nicht, oder?

      Außerdem steht bis jetzt alles direkt untereinander in einer Liste, da das knapp 20 Daten sind, hätte ich evtl gerne Absätze da drin, z.B.
      1. Absatz: Anschrift

      2. Absatz: Produkt

      3. Absatz Zahlungsweise

      ...

      Halt mit Absätzen und Überschriften.

      Wie sähe das im mailtext aus?

      Gruß
      Alex

      1. Hi,

        versuch's mal so:

        foreach(@names) {
          $name = $_;
          @values = "";
          @values = $query->param($name);
          if($name ne "mailto" && $name ne "return" && $name ne "subject" && $name ne "delimiter") {
            foreach $value (@values) {
              $mailtext .= sprintf "%-20.20s%s%s\m", $name, $delimiter, $value;
            }
          }
        }

        Hinweise zu sprintf oder printf: perldoc -f printf

        Außerdem steht bis jetzt alles direkt untereinander in einer Liste, da das knapp 20 Daten sind, hätte ich evtl gerne Absätze da drin, z.B.

        1. Absatz: Anschrift
        2. Absatz: Produkt
        3. Absatz Zahlungsweise

        Das kriegst du nur hin, wenn du die einzelnen Feldnamen testest und entscheidest "gehört das in den Absatz?". Ich würde es wahrscheinlich in einen Hash (für jeden Absatz ein Schlüssel) schreiben, um die foreach($name)-Schleife nur einmal durchzulaufen.

        Frage: Hast du die Bücher "Einführung in Perl" von Larry Wall? Gut ist auch das "Perl Kochbuch" von... mhhh... fällt mir jetzt nicht ein... Buch liegt zu Hause... Würde ich mir überlegen die zu kaufen wenn du in die Perl-Programmierung einsteigen willst.

        Gruß
        Thorsten