|
|
 |

|

 |

| Community » Perl: Allgemeines Forum |
|
Anfänger! Suche Hilfe für ein Cronjob Script (DB +eMail-Versand)
|
Seitenanfang |
Hallo an die Forum-Mitglieder, das ist mein erstes Thema und ich hoffe mir kann jemand helfen.Ich bin gerade dabei mir ein Script für einen Cronjob zu basteln, habe aber noch etwas wenig Ahnung von Perl. Was ich gerne per Script abrufen möchte: Ich möchte eine Tabellenspalte (Mysql-DB) auf neue Einträge hin kontrollieren (z.B. Spalte "Name") und mir die Ergebnisse per Mail zuschicken lassen. Kann mir jemand beim Zusammenbau des Scripts helfen? Oder weiß jemand, wo es so ein Script schon fertig gibt? Ich wäre für eine Hilfe sehr dankbar :-) Viele Grüße Tom
Datum: 13.07.2008-20:09

|
re: Anfänger! Suche Hilfe für ein Cronjob Script (DB +eMail-Versa
|
Seitenanfang |
| Was hast Du denn bisher versucht? Für die Arbeit mit der Datenbank empfehle ich DBI.
Datum: 14.07.2008-16:11

|
re: Anfänger! Suche Hilfe für ein Cronjob Script (DB +eMail-Versa
|
Seitenanfang |
Hallo Renee, Danke für deine Antwort!Bisher habe ich diesen Code zusammengesetzt, der einzeln..DB-Anbindung und Email auch funktioniert. Nur das Zusammenspiel geht noch nicht, also daß ich meine Daten zugeschickt bekomme.Kannst du mal drüberschauen? #!/usr/bin/perl#include the DBI module which handles the database connection use DBI; #connect to the mysql base named 'test' using the user and password $dbh = DBI->connect("dbi:mysql:xxxxx",'xxxxx','xxxxx'); #prepare and execute the query $sth=$dbh->prepare("SELECT name FROM meinetabelle'") || die "Error : $DBI::errstr"; $sth->execute; #close the connection $sth->finish; $dbh->disconnect; print "Content-type: text/html\n\n"; $title='Perl Mail demo'; $to='irgendwo@irgendwo.de'; $from= 'irgendwo@test.de'; $subject='Meine Testmail'; open(MAIL, "|/usr/sbin/sendmail -t"); ## Mail Header print MAIL "To: $to\n"; print MAIL "From: $from\n"; print MAIL "Subject: $subject\n\n"; ## Mail Body print MAIL "Diese Daten wurden eingefügt: $struct \n"; close(MAIL); print "<html><head><title>$title</title> </head>\n<body>\n\n"; ## HTML content let use know we sent an email print "<h1>$title</h1>\n"; print "<p>A message has been sent from to $to"; print "\n\n</body></html>"; Ich habe schon vieldran herumprobiert, kann sein daß einiges jetzt falsch ist. Ich glaube ab dem Mail-Header stimmt so einiges nicht mehr. Was ich nochmal möchte: Ich habe eine Anzeigen-Komponente installiert und würde gerne eine E-Mail bekommen, wenn z.B. eine neue Anzeige eingetragen wurde. Aber das dann eben NUR, WENN es eine neue Anzeige gibt. Ansonsten soll mir keine Mail zugeschickt werden!Ich denke auch,daß der Select-Befehl im Moment auch nicht mehr stimmt. Kannst du mir etwas helfen dabei?Wäre total nett. Grüße Tom
Datum: 14.07.2008-17:52

|
re: Anfänger! Suche Hilfe für ein Cronjob Script (DB +eMail-Versa
|
Seitenanfang |
| Als erstes solltest Du Dir angewöhnen, "use strict" zu verwenden (siehe auch http://wiki.perl-community.de/bin/view/Wissensbasis/UseStrict ). Das hätte Dich auch darauf hingewiesen, dass $struct nirgends initialisiert wird. Du solltest auc die Fehler bei "open(...)" abfangen:
open(MAIL, "|/usr/sbin/sendmail -t") or die $!; Im SQL-Statement hast Du am Ende noch ein einzelnes Anführungszeichen, das weg muss. Du führst das Statement aus und danach machst Du gleich ein "finish" - ohne, dass Du mit den Ergebnissen irgendwas machst. Ansonsten sieht es doch gar nicht schlecht aus.
Datum: 15.07.2008-09:02

|
re: Anfänger! Suche Hilfe für ein Cronjob Script (DB +eMail-Versa
|
Seitenanfang |
| Hallo Renee, ich weiß einfach nicht wie ich die Mail mit Inhalt abschicken soll. Ich habe jetzt diesen Code erstellt: #!/usr/bin/perl -wuse CGI; use DBI; use strict; my ($key, $href, $ishead); my $query = new CGI; print $query->header(); # das ist natuerlich kein realer connect, da d my $dbh = DBI->connect("dbi:mysql:xxxxxx",'xxxxx','xxxx') or exitWithError($ishead,'DB-Connect', $DBI::errstr); #hier sollte das richtige Selectstatement hin und mit einer passenden where-Klausel versehen werden, um die Suche zu realisieren my $sth = $dbh->prepare("SELECT userid, date_created, ad_headline, ad_zustand FROM meinetabelle WHERE ad_zustand = 'aktiv'") or exitWithError($ishead,'DB-prepare', $DBI::errstr); $sth->execute or exitWithError($ishead,'DB-execute', $DBI::errstr); my($userid, $date_created, $ad_headline, $ad_zustand); while (($userid, $date_created, $ad_headline, $ad_zustand) = $sth->fetchrow()) { print "$userid : $date_created : $ad_headline : $ad_zustand\n"; } #close the connection $sth->finish; $dbh->disconnect; # Der Pfad zu Ihrem Mailprogramm $mailprog = '/usr/sbin/sendmail'; open (MAIL, "|$mailprog -t") || die $!; print MAIL "To: 'test@test.de'\n"; print MAIL "From: 'test@test.de'\n"; print MAIL "Subject: Ihre Zugangsdaten\n"; print MAIL "Hier ihre Zugangsdaten\n"; #print MAIL "User: $user \n"; #print MAIL "Passwort: $passwort\n"; print MAIL "Viele Grüße\n"; print MAIL "Webmaster\n"; close(MAIL);
Wenn ich das Script bis zum Disconnect laufen lasse, bekomme ich meine Daten im Browser ausgegeben.Nur ab dem "Open_mail" gehts nicht mehr. Wie bekomme ich denn meine Tabellendaten in die Mail und in einer Tabelle ausgegeben? Im Browser sollte ja dementsprechend am End enicht sausgegeben werden, wenn ich das Script per Cronjob laufen lassen möchte. Grüße Tom
Datum: 16.07.2008-14:23

|
re: Anfänger! Suche Hilfe für ein Cronjob Script (DB +eMail-Versa
|
Seitenanfang |
| Hier mal ein etwas aufbereiteter Code: #!/usr/bin/perl -w use CGI; use DBI; use strict; my ($key, $href, $ishead); my $query = new CGI; print $query->header(); # das ist natuerlich kein realer connect, da d my $dbh = DBI->connect("dbi:mysql:xxxxxx",'xxxxx','xxxx') or exitWithError($ishead,'DB-Connect', $DBI::errstr); #hier sollte das richtige Selectstatement hin und mit einer passenden where-Klausel versehen werden, um die Suche zu realisieren my $sth = $dbh->prepare("SELECT userid, date_created, ad_headline, ad_zustand FROM meinetabelle WHERE ad_zustand = ?") or exitWithError($ishead,'DB-prepare', $DBI::errstr); $sth->execute('aktiv') or exitWithError($ishead,'DB-execute', $DBI::errstr); my $mailtext = ""; while (my ($userid, $date_created, $ad_headline, $ad_zustand) = $sth->fetchrow()) { my $row = "$userid : $date_created : $ad_headline : $ad_zustand\n"; $mail .= $row; print $row; } #close the connection $sth->finish; $dbh->disconnect; # Der Pfad zu Ihrem Mailprogramm $mailprog = '/usr/sbin/sendmail'; open (MAIL, "|$mailprog -t") || die $!; print MAIL <<'HEADER'; To: test@test.example From: test@test.example Subject: Ihre Zugangsdaten HEADER print MAIL <<"BODY"; Hier ihre Zugangsdaten User: $user Passwort: $passwort Die Daten aus der DB: $mailtext Viele Grüße, Webmaster BODY close(MAIL);
Datum: 16.07.2008-17:42

|
re: Anfänger! Suche Hilfe für ein Cronjob Script (DB +eMail-Versa
|
Seitenanfang |
Hallo Renee, vielen Dank für dein Beispiel-Script. Nur hat das nicht bei mir funktioniert. Das "use strict" nimmt er bei mir irgendwie garnicht. Ich habe mir mit Müh und Not ein funktionierendes Script zuammengebastelt. Das gibtmirmeine Daten in der Mail aus. Noch eine kleine Bitte! Kannst du mir nochmal schreiben, wie man diese 4 Variablen in eine dynamische Html-Tabelle schreiben kann, so das meine Daten leserlich (alle 4 in jeweils einer Zeile)in der Mail aufgeführt sind.Das wäre total cool, wenn ich meine Daten so per Mail bekommen würde.Mein aktueller Code: #!/usr/bin/perl -w#include the DBI module which handles the database connection use DBI; use CGI::Carp qw(fatalsToBrowser); $dbh = DBI->connect("dbi:mysql:xxxxxx",'xxxxxx','xxxxxx') or exitWithError($ishead,'DB-Connect', $DBI::errstr); my $sth = $dbh->prepare("SELECT userid, date_created, ad_headline, ad_zustand FROM meinetabelle WHERE ad_zustand = ?") or exitWithError($ishead,'DB-prepare', $DBI::errstr); $sth->execute('aktiv') or exitWithError($ishead,'DB-execute', $DBI::errstr); print "Content-type: text/html\n\n"; while (my ($userid, $date_created, $ad_headline, $ad_zustand) = $sth->fetchrow()) { my $row = "$userid : $date_created : $ad_headline : $ad_zustand \n"; $mail .= $row; } #close the connection $sth->finish; $dbh->disconnect; #print "Content-type: text/html\n\n"; $title='mail test'; $to='xxxxxxx@xxxxxx'; $from= 'xxxxxx@xxxxxxx'; $subject='Using Sendmail'; open(MAIL, "|/usr/sbin/sendmail -t"); ## Mail Header print MAIL "To: $to\n"; print MAIL "From: $from\n"; print MAIL "Subject: $subject\n\n"; ## Mail Body #print MAIL "Hier werden alle Anzeigen aufgelistet, die neu eingegangen sind:\n\n"; #print MAIL "$mail\n"; print MAIL <<"BODY"; Die Daten aus der DB: $mail close(MAIL);
Grüße Tom
Datum: 17.07.2008-18:30

|
re: Anfänger! Suche Hilfe für ein Cronjob Script (DB +eMail-Versa
|
Seitenanfang |
| Zum Thema use strict: Was meinst Du mit "nimmt er gar nicht"?? Gibt Perl jede Menge Fehlermeldungen aus? Dann schau Dir das mal an: http://wiki.perl-community.de/bin/view/Wissensbasis/UseStrict
Datum: 18.07.2008-11:01

|
re: Anfänger! Suche Hilfe für ein Cronjob Script (DB +eMail-Versa
|
Seitenanfang |
| Hi Renee, Danke für deine Antwort. Das mit dem.."nimmt er garnicht" war eben so gemeint, daß mein Script mit "strict" nicht funktioniert aber ohne schon.Aber das macht ja auch nichts, wenn mein Cronjob ohne "strict" funktioniert. Kannst du mir vielleicht noch kurz texten, wie ich meine Ausgabe in der Mail als HTML-Tabelle hinbekomme?Habe auch schon viel gegoogelt darüber, aber nichts genaues gefunden. Danke Grüße Tom PS: Bin ja in vielen Foren angemeldet (wegen Joomla) aber ich habe noch nie so schnelle und gute Hilfe bekommen :-)
Datum: 19.07.2008-15:20

|
|

|

|

|
 |

|

|
|