Erfassung von Datum und Zeit
alex
- cgi
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?
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
Hi Cheatah!
Vielen Dank für die Antwort
- werde ich tun!
Gruß
alex
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
$Sendmail_Prog = "/usr/lib/sendmail";
use CGI;
$query = new CGI;
@names = $query->param;
$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
$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";
}
}
}
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);
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
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
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 perlfaq4What'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
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
Hab in mein wunderbar funktionierendes mailscript
^^^^
</selfaktuell/artikel/formmail.htm> ;-)