Johnny: can´t close - wieso nur nicht?!?

Hallo!

Ich habe hier ein Perl-Problem, an dem ich nun schon drei Tage herumknabbere, komme aber nicht weiter. Die Ausgangssituation ist folgende:

Mein formmail.pl-script schickt dem Besucher ein Feedback abhaengig vom Input. Es gibt entweder ein Kontaktformular oder eine Newsletteranmeldung.

Das Ausgangsscript habe ich von nms heruntergeladen und dann entsprechend modifiziert. Um mit der Testerei schneller zu sein, habe ich jetzt Perl und einen eigenen Webserver installiert, damit ich offline testen kann. Dazu habe ich die Variable local_test eingebaut.
Wenn local_test auf "0" steht, schreibt das Script alle Daten in "debugmail.txt" - das funktioniert auch ohne Fehler. Wenn local_test auf "1" steht, dann bekomme ich immer die Fehlermeldung "can´t close mailprog" und das verstehe ich nicht...

$spnl steht entweder auf "sp" (Kontaktformular) oder auf "nl" (Newsletter) - Hier der relevante Ausschnitt (mit nachtraeglich eingefuegten Kommentaren):

if ($local_test) {
  open (MMAIL, "| $mailprog -t") || die "Can't open $mailprog!\n";
  }else{
  open(MMAIL,">debugmail.txt");
  }

^^^^^^^^^^^^
Hier wird abgefragt, ob online oder offline
^^^^^^^^^^^^

if ($spnl eq "sp") {print MMAIL <<INFOMAIL;

From: Absender <$Config{dsemail}>
To: $Config{email}
Subject: Informationen fuer $Config{vorname} $Config{nachname}

KURZINFORMATION

Sehr $Config{geehrt} $Config{anrede} $Config{nachname},

blablablablablablabla

INFOMAIL
}

^^^^^^^^^^^^
Das ist die Bestaetigungsmail fuer das Kontaktformular
^^^^^^^^^^^^

elsif ($spnl eq "nl") {print MMAIL <<NEWSLETTER;

From: Absender <$Config{dsemail}>
To: $Config{email}
Subject: $Config{anrede} $Config{nachname}, Ihre Newsletter-Anmeldung war erfolgreich!

Sehr $Config{geehrt} $Config{anrede} $Config{nachname},

blablablablablablabla

NEWSLETTER
}

^^^^^^^^^^^^
Das ist die Bestaetigungsmail fuer den Newsletter
^^^^^^^^^^^^

close (MMAIL) || die "Can't close $mailprog!\n";

Ergebnis ist die Fehlermeldung "can´t close mailprog"...?!?

Folgendes funktioniert einwandfrei (Mail wird geschickt, keine Fehlermeldung):

open (MAIL, "| $mailprog -t");
print MAIL 'From: absender@absender.com\n';
print MAIL 'To: recipient@recipient.com\n';
print MAIL "subject: Informationen fuer $Config{vorname} $Config{nachname}\n\n";
close (MAIL);

Also sendmail ist korrekt installiert und wird auch richtig angesprochen.

Das ist das eine - das zweite ist:

Wenn ich die ziemlich langen Mailtexte in eine Datei auslagere und dann die Datei aufrufe, etwa so:

if ($spnl eq "sp") {print MMAIL "infomail.txt";}

dann werden die in der Datei enthaltenen Variablen ( z.B. $Config{vorname} ) nicht richtig eingefuegt.

Weiss jemand vielleicht, wie ich den "can´t close"-Fehler wegbekommen und/oder wie ich die Mailtexte auslagern kann und so aufrufen, dass die Variablen trotzdem mit den Werten aus dem Formular ersetzt werden?

Muchas Gracias!
JOhnnY

  1. Hi,

    Um mit der Testerei schneller zu sein, habe ich jetzt Perl und einen eigenen Webserver installiert, damit ich offline testen kann.

    ein sendmail hast Du auch installiert? Ja? Schade, das solltest Du nicht. Verwende lieber Net::SMTP zum Mailversand - dafür ist es nämlich da.

    [...] dann bekomme ich immer die Fehlermeldung "can´t close mailprog" und das verstehe ich nicht...

    Das liegt daran, dass Du nur eigene Fehlermeldungen ausgeben lässt, nicht die echten, die in $! stehen. Erweitere Deine Fehlerausgaben entsprechend.

    Wenn ich die ziemlich langen Mailtexte in eine Datei auslagere und dann die Datei aufrufe, [...] dann werden die in der Datei enthaltenen Variablen ( z.B. $Config{vorname} ) nicht richtig eingefuegt.

    Selbstverständlich nicht - in der Datei stehen schließlich keine Variablennamen, sondern nur Zeichenketten, die für Dich (als Mensch) wie Variablennamen wirken mögen. Wenn Du willst, dass auch Perl dies erkennt, musst Du es dem Programm beibringen, indem Du den Inhalt der Datei analysierst. Hierfür eignen sich Tokens wie z.B. "~vorname~" deutlich besser als eine programmähnliche Notation; schon allein aus Sicherheitsgründen.

    Übrigens: Wenn Du Dein Script mit

    #!/usr/bin/perl -w
    use strict;

    beginnst, wird Dir bei dem Code "$Config{vorname}" auch gesagt werden, dass Du so etwas nicht tun solltest, anstatt dass stillschweigend versucht wird, das beste daraus zu machen. Schreibe "$Config{'vorname'}".

    Zur Groß- und Kleinschreibung von Variablennamen findest Du in

    perldoc perlstyle

    einige Informationen, die Du ebenfalls beachten solltest.

    Cheatah