eMail über CGI/Perl-Script senden
P. Klein
- cgi
0 Björn Höhrmann0 FrankS0 Peter Klein0 CK1
Noch ein Versuch, da auf den ersten leider keiner geantwortet hat.
(Dies sind meine ersten Versuche mit CGI/Perl!) Ich verwende folgendes Script, um Formulardaten aufzubereiten und will diese dann an eine bestimmte eMail-Adresse schicken. Ich verwende WIN98 und Outlook Express. Es funktioniert so weit, daß die Daten zwar korrekt erzeugt und Outlook Express gestartet wird, aber die Daten nicht in die zu sendende eMail übernommen werden, geschweige denn, daß diese abgeschickt würde. Wahrscheinlich liegt es u.a. an fehlenden Aufrufparametern für Outlook Express - wenn ja, welche? Ein zweites Problem: Auch wenn ich bei $Mailprog= etwas völlig sinnloses eingebe, erscheint die Fehlermeldung "Mailprogramm kann nicht gestartet werden\n" nicht. Warum? Und wo müßte sie eigentlich erscheinen? Gibt es eine Möglichkeit, daß das ganze Geschehen im Hintergrund geschieht, daß der Nutzer gar nicht eingreifen muß und kann? Vielleicht gibt es ja auch eine völlig andere Lösung für die Aufgabe, Formulardaten aufzubereiten und automatisch an eine bestimmte Adresse zu verschicken?
PS: Falls das von Interesse ist: ich habe einen lokalen WWW-Server für die CGI-Schnittstelle installiert (OmniHTTPd).
Ich bin für jede Hilfe dankbar und darauf angewesen, da ich nicht so weiterkomme. Also: DANKE!
---------Anfang Script--------
#!/usr/bin/perl
read (STDIN,$Daten,$ENV{'CONTENT_LENGTH'});
print "Content-type: text/html\n\n";
print "<html><head><title>Test-Feedback</title></head>\n";
print "<body>\n";
@Formularfelder = split(/&/, $Daten);
foreach $Feld (@Formularfelder)
{
($name,$value) = split(/=/,$Feld);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;
$value =~ s/<!--(.\n)*-->//g;
push(@Formular,$name,$value);
}
$Mailprog = "C:\Programme\Outloo~1\msimn.exe";
%HFormular = @Formular; #Liste in Hash kopieren
open(MAIL,"$Mailprog") die "Mailprogramm kann nicht gestartet werden\n";
open(LOGF,">Feedback._log"); #parallel in Logfile ablegen
print MAIL "To: $HFormular{'recipient'}\n";
print LOGF "To: $HFormular{'recipient'}\n";
print MAIL "From: $HFormular{'eMail'} ($HFormular{'Name'})\n";
print LOGF "From: $HFormular{'eMail'} ($HFormular{'Name'})\n";
print MAIL "Subject: Feedback zu "$HFormular{'LE'}"\n\n";
print LOGF "Subject: Feedback zu "$HFormular{'LE'}"\n\n";
for($i=0;$i<=$#Formular;$i=$i+2)
{
print MAIL "$Formular[$i]: $Formular[$i+1]\n";
print LOGF "$Formular[$i]: $Formular[$i+1]\n";
}
print MAIL "---EOF---";
print LOGF "---EOF---";
close(MAIL);
close(LOGF);
print "<br><center><big>Ihre Daten wurden gesendet!</big><br>\n";
print "<br>(Dieses Fenster können Sie wieder schließen)</center>\n";
print "</body></html>\n";
---------Ende Script--------
Es funktioniert so weit, daß die Daten zwar korrekt erzeugt und Outlook Express gestartet wird, aber die Daten nicht in die zu sendende eMail übernommen werden, geschweige denn, daß diese abgeschickt würde.
OE liesst keine Daten über STDIN ein (es ist ja auch keine Kommandozeilenapplikation, also warum sollte es das auch), daher kannst du keine Daten übergeben (nicht ohne Win32::-Module). Benutze entweder Mail::Mailer oder http://www.ebu-net.de/arne/mirrors/jgaa/cgi-bin.htm oder http://gepasi.dbs.aber.ac.uk/softw/Blat.html statt sendmail.
Danke für den Tip! Ich versuchs mal mit der ebu-net-Geschichte und melde mich wieder, ob es funktioniert hat.
Peter.
Ich versuchs mal mit der ebu-net-Geschichte und melde mich wieder, ob es funktioniert hat.
Ich hab das jgaa-wSendmail installiert, es läßt sich auch aufrufen, bringt aber die Meldung ERROR 6 FAILED_TO_CONNECT. Wahrscheinlich liegt es noch an der Einstellung für den SMTP Host, da ich nicht so recht weiß, was ich da eintragen soll (kenne mich nicht besonders aus damit, weil ich erst anfange mit der ganzen Internetgeschichte). Da ich jetzt erstmal andere Aufgaben habe, muß ich weitere Versuche verschieben. Ich melde mich dann wieder.
Danke!
Peter Klein.
Hallo P. !
(Dies sind meine ersten Versuche mit CGI/Perl!) Ich verwende folgendes Script, um
Formulardaten aufzubereiten und will diese dann an eine bestimmte eMail-Adresse
schicken. Ich verwende WIN98 und Outlook Express. Es funktioniert so weit, daß die
Daten zwar korrekt erzeugt und Outlook Express gestartet wird, aber die Daten nicht
in die zu sendende eMail übernommen werden, geschweige denn, daß diese abgeschickt
würde. Wahrscheinlich liegt es u.a. an fehlenden Aufrufparametern für Outlook Express -
wenn ja, welche?
[...]
PS: Falls das von Interesse ist: ich habe einen lokalen WWW-Server für die
CGI-Schnittstelle installiert (OmniHTTPd).
Willst Du Dein CGI nur zum Testen auf Deinem lokalen WWW-Server laufen lassen, oder sollen die Formulardaten später mal auf einem im Netz stehenden Server verarbeitet und als Mail verschickt werden? Oder willst Du deinen PC als Server ins Netz stellen? Da CGI'S immer serverseitig laufen, musst Du das mailprogramm aufrufen, das auch auf dem Server läuft. Und das ist mit Sicherheit nicht Outlook E. unter Win98. Soll dieser PC in einem Intranet als Server stehen, dann musst Du andere Mail-Tools nutzten (siehe posting von Björn Höhrmann).
Ein zweites Problem: Auch wenn ich bei $Mailprog= etwas völlig
sinnloses eingebe, erscheint die Fehlermeldung "Mailprogramm kann nicht gestartet
werden\n" nicht. Warum?
Warum die Fehlermeldung erscheint, ist ganz einfach: Du hast es so gewollt, und zwar mit der folgenden Zeile:
open(MAIL,"$Mailprog") die "Mailprogramm kann nicht gestartet werden\n";
Schlägt das Öffnen des Programms fehlt, wird 'die' ausgeführt. Dieses beendete das Script, gibt aber vorher noch den angegebenen String aus.
Und wo müßte sie eigentlich erscheinen?
Genau dort. Denn das CGI schickt die Ausgabe zum Server und der schickts dann an den Client, der das CGI aufgerufen hat. Deshalb siehst Du's im Browser.
Auf http://cgi.xwolf.com/faq/cgitutor.shtml findest Du ein kurzes CGI-Tutorial. Dort kannst Du den Ablauf eines CGI-Aufrufs nachlesen.
Gruß Frank
Hallo Frank !
Vielen Dank für die Antwort!
Momentan will ich das Ganze nur auf dem lokalen Server testen, später sollen die Formulardaten schon mal auf einem im Netz stehenden Server verarbeitet und als Mail verschickt werden. Was da für ein Mailprog. drauf ist, weiß ich nicht, wollte es erst einmal prinzipiell testen - eben lokal. Und dafür hab ich erstmal nur Outlook Express.
Die 2. Frage hast Du scheinbar verkehrt verstanden, denn die Fehlermeldung erscheint eben NICHT, obwohl sie es sollte. Warum NICHT?
Vielleicht hast Du noch 'nen heißen Tip. DANKE!
Peter K.
Hi,
Momentan will ich das Ganze nur auf dem lokalen Server testen,
später sollen die Formulardaten schon mal auf einem im Netz
stehenden Server verarbeitet und als Mail verschickt werden. Was
da für ein Mailprog. drauf ist, weiß ich nicht, wollte es erst
einmal prinzipiell testen - eben lokal. Und dafür hab ich erstmal
nur Outlook Express.
Sorry, aber ich glaube NICHT, dass Outlook das kann ,)
Die 2. Frage hast Du scheinbar verkehrt verstanden, denn die
Fehlermeldung erscheint eben NICHT, obwohl sie es sollte. Warum
NICHT?
Die Fehlermeldung muss in den Error-Logfiles deines Webservers stehen.
Etwa so:
open(DAT,"test.dat") die("kann Datei nicht oeffnen");
gaebe bei Apache die Fehlermeldung
kann Datei nicht oeffnen at /usr/local/httpd/cgi-bin/test.pl line 6.
in der httpd.error_log
mfg
CK1
Momentan will ich das Ganze nur auf dem lokalen Server testen,
später sollen die Formulardaten schon mal auf einem im Netz
stehenden Server verarbeitet und als Mail verschickt werden. Was
da für ein Mailprog. drauf ist, weiß ich nicht, wollte es erst
einmal prinzipiell testen - eben lokal. Und dafür hab ich erstmal
nur Outlook Express.Sorry, aber ich glaube NICHT, dass Outlook das kann ,)
Kann es aber. Du kannst leicht eine Anwendung schreiben, die verschiedene Aktionen ausführt, die sonst nur der Benutzer mit Maus und Tastatur macht. Das ist sozusagen ein Feature der Windows-API.
Hi Björn!
Kann es aber. Du kannst leicht eine Anwendung schreiben, die verschiedene Aktionen
ausführt, die sonst nur der Benutzer mit Maus und Tastatur macht. Das ist sozusagen
ein Feature der Windows-API.
Bleibt nur die Frage, ob sich der Aufwand lohnt, in diesem CGI das API zu bedienen, wenn später mal ein "popliges" sendmail genutzt wird. Dann ists doch vielleicht einfacher, zum Test die Mail in ein File auf dem Server zu schreiben, z.B. so:
$mailprog = '/usr/lib/sendmail';
$mailpath = 'c:\temp\mail.txt';
#für lokalen Test auf 1 setzen
$local = 0;
[...]
if ($local =~ 0){
open (MAIL, "-") exec $mailprog,$MailTo die "Can't open $mailprog!\n";
}else{
open (MAIL,">>$mailpath");
print MAIL "To: $MailTo\n";
}
print MAIL "From: $MailFrom\n";
print MAIL "Subject: $Subject\n\n";
print MAIL "$Body";
Gruß Frank
Kann es aber. Du kannst leicht eine Anwendung schreiben, die verschiedene Aktionen ausführt, die sonst nur der Benutzer mit Maus und Tastatur macht. Das ist sozusagen ein Feature der Windows-API.
Echt?
Windows kann unbenannte pipes?
Das ist mir neu,
muss ich gleich mal M$ erzählen,
die freuen sich bestimmt auch,
das es jetzt endlich geht.
Spass beiseite,
ich denke nicht das das unter _so_ win geht.
mfg Heinz