alex: Erfassung von Datum und Zeit

Hallo!
Wollte in mein mailscript noch Datum und uhrzeit einfügen.

Hab folgendes Script aus der Anleitung:

#!/usr/bin/perl

$Jetztwert = time();
$Jetztzeit = localtime($Jetztwert);
&Deutschnamen;
@Zeit = split(/ +/,$Jetztzeit);
@Uhrzeit = split(/:/,$Zeit[3]);

print "Guten Tag!\n";
print "Heute ist ",$Zeit[0],", der ",$Zeit[2],". ",$Zeit[1]," ",$Zeit[4],"\n";
print "Es ist jetzt ",$Uhrzeit[0],":",$Uhrzeit[1]," Uhr\n";

sub Deutschnamen
{
 $Jetztzeit =~ s/Mon/Montag/;
 $Jetztzeit =~ s/Tue/Dienstag/;
 $Jetztzeit =~ s/Wed/Mittwoch/;
 $Jetztzeit =~ s/Thu/Donnerstag/;
 $Jetztzeit =~ s/Fri/Freitag/;
 $Jetztzeit =~ s/Sat/Samstag/;
 $Jetztzeit =~ s/Sun/Sonntag/;
 $Jetztzeit =~ s/Jan/Januar/;
 $Jetztzeit =~ s/Feb/Februar/;
 $Jetztzeit =~ s/Mar/Maerz/;
 $Jetztzeit =~ s/Apr/April/;
 $Jetztzeit =~ s/May/Mai/;
 $Jetztzeit =~ s/Jun/Juni/;
 $Jetztzeit =~ s/Jul/Juli/;
 $Jetztzeit =~ s/Aug/August/;
 $Jetztzeit =~ s/Sep/September/;
 $Jetztzeit =~ s/Oct/Oktober/;
 $Jetztzeit =~ s/Nov/November/;
 $Jetztzeit =~ s/Dec/Dezember/;
}

Wenn ich dieses aber so alleine hochlade, kommt internal error...
Wieso? Diesmal ist doch alles definiert, und bestimmt richtig, oder?
Noch eine andere Frage, wenn ich in mein mailscript daten per email versende, kann ich auch einen mailtext angeben. Wie erreiche ich es, dass in diesem Text Absätze sind?
Gruß
Alex

PS: Muß das eigentlich so ein komplizierte Script sein, gibts da keinen einfachen Befehl aus ne Modul?

  1. Hi,

    Hab folgendes Script aus der Anleitung:

    welche "die" Anleitung?

    #!/usr/bin/perl

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

    $Jetztwert = time();

    Lies bitte perldoc perlstyle:

    my $jetztwert = time;

    $Jetztzeit = localtime($Jetztwert);

    Außerdem brauchst Du time nicht in eine Variable zu packen, wenn Du es später gar nicht wiederverwenden willst.

    my $jetzt = localtime;

    Unten dazu noch etwas mehr. Vergleiche auch

    perldoc -f time
    perldoc -f localtime

    Btw: _Das_ ist "die" Anleitung, nämlich die Perl-Dokumentation.

    &Deutschnamen;

    &deutschnamen;

    @Zeit = split(/ +/,$Jetztzeit);

    perldoc -f localtime:

    my @jetzt = localtime;

    Dieses Array kannst Du deutlich besser verwenden als Deine Splitterei.

    sub Deutschnamen
    {
    $Jetztzeit =~ s/Mon/Montag/;

    [...]

    Globale Variablen sollte man nicht in Subroutinen verändern. Lies einen Parameter aus, verändere ihn lokal, und liefere ihn mittels 'return' zurück. Nebenbei:

    perldoc perllocale

    Wenn ich dieses aber so alleine hochlade, kommt internal error...
    Wieso?

    Das kann Dir _nur_ das Error-Log Deines Servers sagen.

    Noch eine andere Frage, wenn ich in mein mailscript daten per email versende, kann ich auch einen mailtext angeben. Wie erreiche ich es, dass in diesem Text Absätze sind?

    Umbrüche mittels "\n".

    PS: Muß das eigentlich so ein komplizierte Script sein,

    Nein. Alles in allem ist das Perl-Kapitel von SelfHTML so (verzeih mir, Stefan) grottenschlecht, daß ich nicht genug empfehlen kann, bereits die Existenz desselben zu vergessen. Es steht im krassen Gegensatz zum Rest von SelfHTML.

    gibts da keinen einfachen Befehl aus ne Modul?

    Wie gesagt: Lies die Doku zu den entsprechenden Core-Befehlen und zu perllocale. Damit kannst Du im Grunde schon alles bequem abdecken.

    Cheatah

    1. Hi Cheatah!
      Vielen Dank für die Antwort

      - werde ich tun!

      Gruß
      alex

      1. Hallo!
        Doch nochmal eine Frage. Hab in mein wunderbar funktionierendes mailscript zusätzlichen Text eingegeben, ging noch, aber als ich den \n und noch die IP Adresse mitschicken wollte, funktinierte das alles nicht mehr richtig. Muß irgendwo bei mailtext ein Fehler sein, wahrscheinlich nur irgendwelche Zeichen falsch, naja, wenn jemand so gütig wäre un nur eben einen kurzen Blick riskieren könte:-)

        #!/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;

        -------> 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:

        $mailtext = "Aufgegebene Bestellung:\n";
        $mailtext = "$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";

        Also wie gesagt, wollte halt in der email einen Absatz einfügen und die IP adresse des Absenders, später nich das datum, aber soweit bin ich noch nicht, aber wenn ich weiß wie die IP da rein kommt, bekomme ich das datu auch hin!

        Danke im voraus
        Alex

        1. Hi,

          aber als ich den \n und noch die IP Adresse mitschicken wollte, funktinierte das alles nicht mehr richtig.

          und das heißt? Fehler und Probleme bitte immer mit Fehler- bzw. Problembeschreibung.

          #!/usr/bin/perl

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

          Du ahnst nicht, wie viele Fehler Dir das aufdecken wird.

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

          Ich hätte mal mitzählen sollen, wie oft ich in letzter Zeit auf

          perldoc perlstyle

          verwiesen habe. Außerdem:

          perldoc -f my
          perldoc perlfaq4 What's wrong with always quoting "$vars"?

          my $sendmail_prog = '/usr/lib/sendmail';

          Ich gehe mal nicht darauf ein, daß Net::SMTP die deutlich bessere Wahl wäre :-)

          use CGI;

          Gut!

          @names = $query->param;

          Nicht gut. param() liefert Dir bereits ein Array, das Du direkt verwenden kannst; es ist nicht nötig, es noch mal in den Speicher zu kopieren.

          $mailtext = "Aufgegebene Bestellung:\n";
          $mailtext = "$ENV{'REMOTE_ADDR'}\n";

          Du setzt hier eine Variable, und überschreibst ihren Inhalt sogleich wieder. Das ist vergleichbar damit, etwas auszudrucken, um es in den Schredder zu geben.

          my $mailtext = "Aufgegebene Bestellung:\n";
          $mailtext .= "$ENV{'REMOTE_ADDR'}\n";

          Siehe perldoc perlop

          foreach(@names) {

          next if ($_ eq 'mailto' || $name eq 'return' || $name eq 'subject' || $name eq 'delimiter');
          foreach my $value ($query->param($_)) {
            $mailtext .= $_.$delimiter.$value."\n";
          }

          }

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

          open(MAIL,"|$Sendmail_Prog -t") || print STDERR "Mailprogramm konnte nicht gestartet werden\n";

          Besser:

          open(...) or die "Mailprogramm konnte nicht gestartet werden: $!";

          print MAIL "To: $mailto\n";
          print MAIL "Subject: $subject\n\n";

          Kein From?

          close(MAIL);

          close(MAIL) or die "Mailprogramm konnte nicht geschlossen werden: $!";

          -------> Dankeseite an Browser senden:

          print "Location: $returnhtml\n\n";

          print $query->redirect($returnhtml);

          Also wie gesagt, wollte halt in der email einen Absatz einfügen

          Du hast erst einen Umbruch eingefügt. Zwei davon ergeben einen Absatz.

          Cheatah

          1. Hi,

            aber als ich den \n und noch die IP Adresse mitschicken wollte, funktinierte das alles nicht mehr richtig.

            und das heißt? Fehler und Probleme bitte immer mit Fehler- bzw. Problembeschreibung.

            #!/usr/bin/perl

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

            Du ahnst nicht, wie viele Fehler Dir das aufdecken wird.

            Wie denn aufdecken? Was hab ich davon, wenn es auch mit der obigne Version funktioniert?

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

            Ich hätte mal mitzählen sollen, wie oft ich in letzter Zeit auf

            perldoc perlstyle

            verwiesen habe. Außerdem:

            perldoc -f my
            perldoc perlfaq4 What's wrong with always quoting "$vars"?

            my $sendmail_prog = '/usr/lib/sendmail';

            Ich gehe mal nicht darauf ein, daß Net::SMTP die deutlich bessere Wahl wäre :-)

            Also meinst Du perldoc.com? Ist das auch ein Modul, auf welches ich einfach zugreifen kann?
            Also Net::SMTP hate ich irgendwann mal probiert, hat aber nicht geklappt, aber wie Du siehst mache ich noch viele blöde Fehler:-) Was wäre der Vorteil?

            use CGI;

            Gut!

            @names = $query->param;

            Nicht gut. param() liefert Dir bereits ein Array, das Du direkt verwenden kannst; es ist nicht nötig, es noch mal in den Speicher zu kopieren.

            Also weglassen?

            $mailtext = "Aufgegebene Bestellung:\n";
            $mailtext = "$ENV{'REMOTE_ADDR'}\n";

            Du setzt hier eine Variable, und überschreibst ihren Inhalt sogleich wieder. Das ist vergleichbar damit, etwas auszudrucken, um es in den Schredder zu geben.

            my $mailtext = "Aufgegebene Bestellung:\n";
            $mailtext .= "$ENV{'REMOTE_ADDR'}\n";

            Siehe perldoc perlop

            OK, Danke! Wie müßte ich dann das Datum mit deiner variante einfügen?

            foreach(@names) {

            next if ($_ eq 'mailto' || $name eq 'return' || $name eq 'subject' || $name eq 'delimiter');
            foreach my $value ($query->param($_)) {
              $mailtext .= $_.$delimiter.$value."\n";
            }

            einfach statt dessen einfügen?

            }

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

            open(MAIL,"|$Sendmail_Prog -t") || print STDERR "Mailprogramm konnte nicht gestartet werden\n";

            Besser:

            open(...) or die "Mailprogramm konnte nicht gestartet werden: $!";

            Und das reicht???

            print MAIL "To: $mailto\n";
            print MAIL "Subject: $subject\n\n";

            Kein From?

            Warum Form? Wegen früherer Postings oder warum? Soll halt am Ende per mail zu mir geschickt werden.

            close(MAIL);

            close(MAIL) or die "Mailprogramm konnte nicht geschlossen werden: $!";

            auch ersetzten?

            -------> Dankeseite an Browser senden:

            print "Location: $returnhtml\n\n";

            print $query->redirect($returnhtml);

            OK!

            Also wie gesagt, wollte halt in der email einen Absatz einfügen

            Du hast erst einen Umbruch eingefügt. Zwei davon ergeben einen Absatz.

            Cheatah

            VIELEN DANK, HAT MIR SCHON SEHR GEHOLFEN!!!

            Gruß
            Alex

            1. Hi,

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

              Du ahnst nicht, wie viele Fehler Dir das aufdecken wird.

              Wie denn aufdecken?

              das erfährst Du in

              perldoc perlrun
              perldoc strict

              ;-)

              Was hab ich davon, wenn es auch mit der obigne Version funktioniert?

              Sofern Du nicht den w-Switch und strict benutzt (oder _sehr_ genau weißt, was Du tust), ist es eher Zufall, daß es funktioniert. Irgendwann wird sich einer dieser kleinen, versteckten Fehlerchen bemerkbar machen - und zwar meist gravierend.

              Also meinst Du perldoc.com? Ist das auch ein Modul, auf welches ich einfach zugreifen kann?

              Nein, ich meine die Perl Documentation, die mit jeder (mir bekannten) Perl-Distribution geliefert wird und sich daher auch auf Deiner Festplatte befinden sollte. Dabei wird neben der eigentlichen Doku auch ein Programm namens "perldoc" installiert.

              Also Net::SMTP hate ich irgendwann mal probiert, hat aber nicht geklappt, aber wie Du siehst mache ich noch viele blöde Fehler:-) Was wäre der Vorteil?

              Der Vorteil ist, daß es auf jedem (ordentlich konfigurierten) System funktioniert, die sendmail-Variante jedoch nur, wenn dieses Programm installiert ist - _und_ das System ordentlich konfiguriert.

              Nicht gut. param() liefert Dir bereits ein Array, das Du direkt verwenden kannst; es ist nicht nötig, es noch mal in den Speicher zu kopieren.

              Also weglassen?

              Ja. Sofern Du keine Gründe hast, ein Array statt der Methode param zu verwenden, gibt es, nun, keinen Grund dafür.

              OK, Danke! Wie müßte ich dann das Datum mit deiner variante einfügen?

              Einfach localtime im Listenkontext verwenden und mit locale für die richtige Sprache sorgen. Siehe

              perldoc -f localtime
              perldoc perllocale

              foreach(@names) {

              next if ($_ eq 'mailto' || $name eq 'return' || $name eq 'subject' || $name eq 'delimiter');
              foreach my $value ($query->param($_)) {
                $mailtext .= $_.$delimiter.$value."\n";
              }

              einfach statt dessen einfügen?

              Jupp.

              open(MAIL,"|$Sendmail_Prog -t") || print STDERR "Mailprogramm konnte nicht gestartet werden\n";

              open(...) or die "Mailprogramm konnte nicht gestartet werden: $!";

              Und das reicht???

              Die drei Punkte sind natürlich nur ein Platzhalter :-)

              Kein From?

              Warum Form? Wegen früherer Postings oder warum?

              Weil wegen Absender. Besser isses. Wenn Du keinen setzt, wird gewöhnlich ein Dummy reingeschrieben.

              close(MAIL) or die "Mailprogramm konnte nicht geschlossen werden: $!";

              auch ersetzten?

              Was ich Dir sagen wollte: Du solltest bei _allen_ kritischen Operationen (oft ist auch close eine solche) unbedingt den Fehlerfall abfangen.

              Cheatah

        2. Hab in mein wunderbar funktionierendes mailscript

          ^^^^
          </selfaktuell/artikel/formmail.htm> ;-)