Formailer aus selfhtml
Chräcker Heller
- cgi
Hallo zusammen,
auf der Suche nach dem Grund, warum ich es nicht schaffe, einen Formmailer in Gang zu bekommen, habe ich letztendlich zu Testzwecken die selfhtml-Version,
http://aktuell.de.selfhtml.org/artikel/cgiperl/form-mail/index.htm
instaliert. Perl und Sendmail-Ort eingegeben (ein anderes meiner Scripte funktioniert mit beiden identischen Adressen....), per ascii ins cgi-bin kopiert (habs selfhtml.pl genannt, Kreativität war ja nicht gefragt), chmod auf 755 gesetzt und dann eine Demoseite geklebt. http://www.stempelgeheimnis.de/formular2.html - und bekomme, wie bei allen anderen Versuchen mit anderen Formmailer einen 500er fehler mit dem Text:
malformed header from script. Bad header=No valid From Header
Nun habe ich mich schon etwas rundgelesen, und dachte herausgelesen zu haben, daß ein nicht valider header dann reklamiert wird, wenn bei einer Ausgabe "zum browser" (print) selbiger nicht richtig geschickt wird. Aber dieses Script schreibt ja nichts raus "ausser" die E-Mail. und auch sonst gehe ich ja eher von einem funktionieren des scrptes aus ,-) Wo muß ich weiter suchen? (da ich ja nur atmosphärisch suchen konnte, argwöhnte ich einen Fehler in der sendmail-Adresse oder ähnliches, aber ein anderes Script meiner Seite bedient sich dieses Moduls(?) ohne Schwierigkeiten....)
Chräcker
Hallo!
Probiers´mal hier:
http://nms-cgi.sourceforge.net/
da findest Du eien wunderbaren Formmailer.
Bei allgemeinen CGI-Problemen solltest Du vielleicht damit:
http://aktuell.de.selfhtml.org/artikel/cgiperl/inbetriebnahme/index.htm
anfangen.
gruesse georg
Hallo,
Probiers´mal hier: (...)
oh Danke, ich hatte schon 4 ausprobiert, bis ich dann dachte, ich sollte meinem scheinbares Unvermögen doch mal auf den Grund gehen und gerade deswegen das selfhtml-Script genommen habe. Wenn ich das nicht ans laufen bekomme, dann "welches" ,-)
Bei allgemeinen CGI-Problemen solltest Du vielleicht damit: (...)
Danke auch hier, aber wie oben erwähnt, habe ich das script in ascii rübergeschaufelt, es ist auf 755 gesetzt worden (was zugegebenrmassen nur indirekt aussagt, daß ich diese Rechte vergeben darf ,-)), die sendmail und per-pfade gesetzt und habe meine error-log ausgelesen ;-) (oder für mich besser ;-/)...
trotzdem Danke ,-)
Chräcker
Hallo Chraecker,
1. hast du das Formular richtig mit hidden-Feldern versorgt, so wie in dem Feature-Artikel angegeben? Besonders auch an
<input type="hidden" name="return" value="http://www.ihreadresse.de/irgendeine_return.html">?
2. die "Shebang-Zeile" richtig?
#!/usr/bin/perl stimmt normalerweise - aber eben nur normalerweise.
3. ist das Verzeichnis auch wirklich ein echtes CGI-Verzeichnis? Liegen dort vielleicht andere Perlscripts, die funktionieren? Zur Not mal ein einfaches Helloworld-Script hochladen und gucken ob das funktioniert, z.B.:
#!/usr/bin/perl
print "Content-type: text/plain\n\n";
print "Hello World"
4. ist sicher gestellt, dass sendmail auf dem Server installiert und fuer einen Webserver-Prozess ausfuehrbar ist?
Kleine Story noch fuer all jene, die den Formmailer hier im Feature-Artikel fuer Schrott halten, weil der nicht mit Net::SMTP oder Mail::Sendmail arbeitet: ich bin gerade zwei Tage lang daran verzweifelt, dass es mir mit beiden Moeglichkeiten nicht gelang, externe Mails zu versenden. Erst als ich es auf einen Tipp hin mit dem guten alten open(MAIL,"|$Sendmail_Prog -t") probierte, klappte es ... kommt also immer auf die Mailserverkonfig an. Jedenfalls sehe ich jetzt nicht mehr ein, warum ich diese Variante aus dem Formmailer rausnehmen soll ;-)
viele Gruesse
Stefan Muenz
Hallo,
ich "fürchte", daß alles eigendlich richtig ist, aber ich hake mal ab ,-)
- hast du das Formular richtig mit hidden-Feldern versorgt,
denke ja:
<input type="hidden" name="mailto" value="test@chraecker.de">
<input type="hidden" name="return" value="http://www.stempelgeheimnis.de/formular2.html">
<input type="hidden" name="delimiter" value=": ">
<input type="hidden" name="subject" value="Feedback-Formular">
- die "Shebang-Zeile" richtig?
Ja, gerade noch mal nachgeschaut, ist auch bei mir /usr/bin/perl
- ist das Verzeichnis auch wirklich ein echtes CGI-Verzeichnis?
defintiv ja ,-) Postkarten und Statistikscripte funktionieren. Ein "davor getester" formmailer versah auch seinen Dienst bis es ans erstellen der mail ging.
- ist sicher gestellt, dass sendmail auf dem Server installiert
und fuer einen Webserver-Prozess ausfuehrbar ist?
ja. mein Postkartenscript verwendet sendmail, mit gleicher Ortsangabe.
________
ich habe "trotzdem" sendmail in Verdacht. Denn eigendlich ist das doch die einzigste Stelle Deines Scripts, "wo" ein Header (angeblich) falsch oder gar nicht geschrieben werden kann, oder? (fange gerade durch dieses Probieren erst mit der materie an....) Aber: gibt es eine Möglichkeit, sendmail "so falsch zu haben", daß ein Script damit tadellos arbeiten kann, während ein recht schlichtes wie Deins (das ich ja sogar fast verstehe) stolpert? Ich suche "konkret" neben natürlich der Lösung ;-) eine Richtung in der ich weiter suchen kann oder eine Richtung, in der ich meinen Hoster suchen lassen kann...
Ich hatte Dein Script auch zurechtgekürzt, um den fehler ein zu kreisen. "verheimliche" ich dem Script den Ort von sendmail, dann gibts eine entsprechende andere fehlermeldung. So bleibts beim monieren des Headers.... "Was erwartet sendmail" denn da nur?
Danke bisher....
Chräcker
Moin!
ich habe "trotzdem" sendmail in Verdacht. Denn eigendlich ist das doch die einzigste Stelle Deines Scripts, "wo" ein Header (angeblich) falsch oder gar nicht geschrieben werden kann, oder?
Nicht wirklich. Wenn der Server Fehler 500 ausgibt, dann ist mit dem Skript etwas grundsätzlich falsch - aber nicht auf der Sendmail-Seite, sondern bei der Ausgabe von Daten zurück an den Browser.
Um sicherzugehen kannst du ja einfach mal die Sendmail-Bereiche auskommentieren, bzw. stattdessen in den Browser "drucken".
(fange gerade durch dieses Probieren erst mit der materie an....) Aber: gibt es eine Möglichkeit, sendmail "so falsch zu haben", daß ein Script damit tadellos arbeiten kann, während ein recht schlichtes wie Deins (das ich ja sogar fast verstehe) stolpert? Ich suche "konkret" neben natürlich der Lösung ;-) eine Richtung in der ich weiter suchen kann oder eine Richtung, in der ich meinen Hoster suchen lassen kann...
Irgendwas ist an deinem Skript verkehrt, davon bin ich ziemlich überzeugt. Und es hat vermutlich auch nichts mit Sendmail zu tun.
Wie gesagt: Geht das simple Hello World-Skript von Stefan bei dir? Wenn ja, ist deine Vorgehensweise zum Hochladen des Skripts in Ordnung - wenn nein, liegts vielleicht schon daran.
Ich hatte Dein Script auch zurechtgekürzt, um den fehler ein zu kreisen. "verheimliche" ich dem Script den Ort von sendmail, dann gibts eine entsprechende andere fehlermeldung. So bleibts beim monieren des Headers.... "Was erwartet sendmail" denn da nur?
Das deutet darauf hin, daß nicht Sendmail Schuld ist, sondern das Skript selbst - irgendwie. :)
- Sven Rautenberg
Hallo,
erst einmal auch Dir Danke. Ich hatte "in der Zwischenzeit" am Script rumgekürzt und wieder aufgebaut was das ftp-Programm so hergab ;-) und siehe da, ich habe "eine version" von Stefans Script, die (bei mir) funktioniert. Und zwar lautet es im Originalscript:
print MAIL "To: $mailto\n";
print MAIL "Subject: $subject\n\n";
print MAIL "$mailtext\n";
close(MAIL);
nach zahlreichen versuchen läufts so: (bitte, über Uneleganz eines Anfängers wegsehen....)
print MAIL "To: $mailto\n";
print MAIL "From: mir@Chraecker.de\n";
print MAIL "Subject: $subjekt\n\n";
print MAIL "$mailtext\n";
close(MAIL);
Es fehlte also "meinem" sendmail das from, was ich auch irgendwie logisch finde (ohne jetzt neunmalklug wirken zu wollen: deswegen meine frage: warum "sollte" es ohne gehen?)
UND verträgt "mein" System (oder wer jetzt auch immer) den Variabelnamen subject nicht. Nachdem ich es "überall" (also auch im hidden-feld) in subjekt änderte, lief das Script....
Jetzt würde ich es nur gerne verstehen, oder anders gesagt. Meins sieht so nett logisch aus, aber da ist bestimmt ein Gedankenhaken ;-) bin nur froh, daß "mein System" dann genauso denkt wie ich ;-)))
gespannt auf Antworten, (und etwas entspannter dazu....)
Chräcker
Hi Chräcker,
Es fehlte also "meinem" sendmail das from, was ich auch irgendwie
logisch finde (ohne jetzt neunmalklug wirken zu wollen: deswegen
meine frage: warum "sollte" es ohne gehen?)
Weil verschiedene Versionen von Sendmail unterschiedlich mißtrauisch sind.
(Mist, mein Solaris hier hat kein Sendmail ... wie ging doch gleich noch das Anzeigen der Sendmail-Versionsnummer?)
Viele Grüße
Michael
Hi Chräcker,
fangen wir mal damit an, daß Du in Deinem Skript gleich als allererstes (!) einen eigenen HTTP-Header ausgibst. Dann kracht nämlich nicht das Skript zusammen, wenn irgendwas innerhalb des Skripts schief geht.
Denn genau das passiert im Moment:
malformed header from script. Bad header=No valid From Header
Wer könnte das denn wohl sein, der einen "From"-Header vermißt?
Sendmail, denke ich - wer auch sonst?
Dein Skript läuft also bis zum Versenden tadellos. An dieser Stelle rufst Du sendmail aber erstens nicht so auf, wie der das haben will, zweitens aber so, daß Du seine Ausgaben gnadenlos nach stdout leitest.
Dort jedoch muß die Ausgabe des CGI-Skripts hin - und die hat gefälligst mit einem korrekten HTTP-Header anzufangen!
Ein solcher ist diese Fehlermeldung von Sendmail jedoch nicht - knirsch(500).
Also:
print "Content-type: text/html\n\n"
ganz oben (Zeile 2 oder so) rein, und die Sendmail-Fehlermeldung wird danach immerhin schon mal keinen internen Server-Fehler mehr auslösen (sondern einfach nur im Browser-Fenster landen, als "Dokument").
Als nächstes könntest Du versuchen, sendmail so aufzurufen, daß Du seine Ausgaben nicht mehr nach stdout durchreichst, sondern sie auffängst. Schau Dir mal die "backticks" in Perl an, damit könntest Du die Ausgabe eines Programms in eine Perl-Variable umnleiten. Was Du dann damit anfängst, ist Deine Sache. (Das ist aber "Kür", nicht "Pflicht".)
Außerdem: SelfHTML 8.0 ist in zwischen voll von
use strict;
use CGI::Carp qw(fatalsToBrowser);
Denn Du willst es eigentlich nicht - Du willst statt dessen einen HTTP-Header mit einer Weiterleitung zum "hat geklappt"-Dokument ausgeben (ganz am Ende). Die Diagnose-Ausgaben mit der primitiven, "hart codierten" Variante behindern das Skript also an einer späteren Stelle - "Carp" würde das automatisch richtig machen.
Aber dieses Script schreibt ja nichts raus "ausser" die E-Mail.
Äh, das sollte es aber. Ein CGI-Skript hat eine HTTP-Response zu produzieren. Das muß kein Dokument sein (eine Weiterleitung oder gar ein Header "no data" würde auch tun), aber es wird sinnvollerweise eine Seite der Art "Ihre Mail wurde erfolgreich versandt" sein.
Der Form-Mailer macht das, glaube ich, über eine Weiterleitung - aber nur deshalb, weil er die Zieladresse derselben als CGI-Parameter bekommt und damit von vielen verschiedenen Anwendern in unterschiedlichste Sites eingebunden werden kann.
Da Du ihn aber lokal installiert hast, brauchst Du dieses Feature nicht - Du kannst Deine Antwort-Seite auch direkt von diesem Skript ausgeben lassen.
(Das würde die Mit-Benutzung Deines Skripts durch irgendwelche Spammer übrigens beträchtlich erschweren - außerdem solltest Du Deine Mail-Adresse dort fest einbrennen und sie nicht als CGI-Parameter übernehmen.)
und auch sonst gehe ich ja eher von einem funktionieren des scrptes
aus ,-)
Das ist leider nicht der Weg, einen Fehler zu finden. ;-)
Wo muß ich weiter suchen? (da ich ja nur atmosphärisch suchen konnte,
argwöhnte ich einen Fehler in der sendmail-Adresse oder ähnliches,
aber ein anderes Script meiner Seite bedient sich dieses Moduls(?)
ohne Schwierigkeiten....)
Mehr Debug-Ausgaben, bitte.
_Nachdem_ Du ganz vorne im Skript erst mal einen richtigen HTTP-Header erzeugt hast, kannst Du es im Verlauf der Verarbeitung mit "print"-Statements pflastern, wie Du willst.
Insbesondere die Inhalte derjenigen Variablen, welche in irgend einer Form an das Sendmail durchgereicht werden, wären hier von Interesse.
Die Fehlermeldung scheint ja auszusagen, daß die Zeile, an der Du
print "From:"
ausführst, ein Format erzeugt, das Deinem Sendmail nicht paßt.
Was genau wird also an dieser Stelle ausgegeben?
Viele Grüße
Michael
Hallo Michael,
1000 Dank. Denn jetzt kann ich mit viel Ruhe (weil ich ja immerhin ein inzwischen laufendes Script habe) noch mal mit Deinen Hinweisen das Script "von vorne" durchtesten. Meine Testmethoden waren natürlich eher "bodenständiger" Natur, aber es ist hier so, wie es wahrscheinlich vielen Laien im Web geht. Sie wollen irgendeinen Effekt haben, haben aber keine Ahnung von der dahinterliegenden "Sprache" bzw System. Dann habe ich mir schon immer ohne Reue vorgefertigte Scripte genommen und die dann versucht, mit der "brutalen Methode" zu verstehen. (indem ich einfach hier und da eine Schraube lockerte bzw anzog und zusah, was passiert).... jetzt hast Du mir geschrieben, warum ich was gesehen habe, und ich kann alles noch mal für mich verfolgen. Wer weiß, nacher werde ich noch ein Profi ;-)
und auch sonst gehe ich ja eher von einem funktionieren des
scrptes aus ,-)
Das ist leider nicht der Weg, einen Fehler zu finden. ;-)
jaja, stimmt natürlich. Aber beim versuch, ein cgi-script ans laufen zu bringen, kann man ja doch eine Menge falsch machen. (Wer hat da noch diesen tollen Artikel hier geschrieben? ;-)) und als Dau wie ich, glaubt man ja, daß es sogar noch mehr Möglichkeiten gibt, als man bisher gelesen hat. Da wollte ich erst mal eine Fehlerquelle (ein kaputes Script) ausschliessen und nahm eins von Stefan, daß ja schon durch seine Schlichtheit, der Quelle (selfhtml) und sein Alter eine gewisse Sicherheit ausströmte ;-) Immerhin war es auch so knackig, daß ich selber "rumlöschen" konnte, ohne Angst zu haben, allzuviele neue Fehler reinzuhauen. (was mir freilich trotzdem gelang....)
Die Fehlermeldung scheint ja auszusagen, daß die Zeile, an der Du
print "From:"
ausführst, ein Format erzeugt, das Deinem Sendmail nicht paßt.
und, wie Du ja weiter unten gelesen hast, war das ja genau das Problem mit dem Ursprungsscript: es wurde gar kein From "geprintet", und das störte sendmail wohl.( <= bin imme noch vorsichtig mit meinen behaubtungen ;-)) - Gab bzw gibt es denn sendmail-versionen, die kein from brauchen?
Naja, freu mich, mit Deinen Beitrag nun noch mal am Script nachzuvollziehen zu können....
Chräcker
PS. sollte ich das Script wirklich einsetzen, werde ich natürlich die ganzen Spamlöcher versuchen zu füllen, es ging mir nur darum, mein cgi-bin und sendmail zu verstehen.... eigendlich habe ich hier ein nett aussehendes Form-Mail-Script, daß ich erst einsetzen wollte, aber jetzt reizt es mich natürlich schon, selber weiter zu stricken. Mal sehen, was der terminplan hergibt ;-)
Außerdem: SelfHTML 8.0 ist in zwischen voll von
use strict;
use CGI::Carp qw(fatalsToBrowser);
- nur dieser olle Form-Mailer weiß davon noch nichts.
Das sollte man vielleicht mal langsam ändern.
Da muss ich dir mal recht geben. skripte, die nicht "use strict"-fest programmiert wurden, will man nicht wirklich einsetzen.
Hallo,
nur fürs Archiv und die für Leute, die den thread dann hier lesen, die Fortsetzung: mein hoster teilte mir mit, daß er kein sendmail einsetzt, sondern "MTA Qmail", mit einem (ich kopiere wörtlich) "SendMail Parser,der 100% kompatibel zu dem Original ist"....
Füge ich in ein beliebiges bisher nicht funktionierendes Script in den E-Mail-headeraufbau ein "From: mir@domain.de" ein, läufts. Ob da mta-qmail nun doch pingeliger ist (und der parser nun nicht 100% kompatibel ist) oder nicht, sei dahin gestellt. (Vielleicht ist auch sendmail pingeliger geworden, Thema "sicherheit")
Aber noch was zur Dau-blindheit ;-) Wenn man keine Ahnung hat, und nicht ahnt, wohin es gehen könnte, dann überliest man Hinweise auch gerne, obwohl sie da auf einem noch so großen Monitor einen anstrahlen. Nicht aus schluderigkeit, sondern weil man aus Unwissenheit eine andere "Betonung" drauf hat....Stand in der Fehlermeldung doch
Bad header=No valid From Header:
und selbst ich konnte zwar erkennen, das durch dieses "From" sich der Satz irgendwie komisch liest, aber lags an meinem Englisch? An der späten Stunde? ,-) "kommt irgendwie kein richtiges Deutsch raus" meinte noch meine frau....) ich hätte es einfach mal wörtlich lesen sollen ;-)
Danke allen,
Chräcker
Oh nein,
Hallo,
sendmail die letzte: mein Hoster, den ich von Anfang an fragte, antwortete nun erst auf meine "Lösung" hin, daß er ganz vergessen habe, daß er selber "hinter dem sendmail-Parser" noch einen drangehangen habe, der dieses from-feld verlangt...............
no comments bitte ;-))))
Chräcker
Hi Chräcker,
mein hoster teilte mir mit, daß er kein sendmail einsetzt,
sondern "MTA Qmail", mit einem (ich kopiere wörtlich)
"SendMail Parser,der 100% kompatibel zu dem Original
ist"....
... und an der Stelle, wo Du '/usr/lib/sendmail' aufrufst, einen symbolic link auf sein qmail gesetzt hat.
Das kommt mir bekannt vor - der vorige (kleine) Self-Server hatte auch qmail über sendmail drüber installiert.
Stand in der Fehlermeldung doch
Bad header=No valid From Header:
Yep. Das ist der Grund, weshalb ich in Artikeln, die konkrete Zeichenketten erwähnen, diese immer auszeichne - etwa in der Art
Bad header=<code>No valid 'From:' header</code>
Viele Grüße
Michael