ubuntuusers.de

cgi funktioniert nicht

Status: Ungelöst | Ubuntu-Version: Ubuntu 9.04 (Jaunty Jackalope)
Antworten |

Pat_Ubuntu_User

Avatar von Pat_Ubuntu_User

Anmeldungsdatum:
26. September 2009

Beiträge: 10

Hi Leute, ich bin kein absoluter Anfänger, aber auch kein Profi bei Linux.....Also, zu meinem Problem: ich habe mir auch meinem anderen Linux Rechner einen Server mit Xampp eingerichtet. Es funktioniert eigl alles gut, aber dann wollte ich mir werte eines Formulars per email senden. Ich weiß, dass es solche formmailer als Anbieter gibt, die kostenlos sind. Ich habe schon einen benutzt der funktioniert, aber auf dauer wollte ich dann eigl unabhängig sein. Also suchte ich im Web nach einen CGI script zum Versenden von mails an meine Adresse. Immer wenn diese datei dann aufgerufen wird, Steht da:

Software error:

Global symbol "$return" requires explicit package name at /opt/lampp/cgi-bin/sendmail line 41.
Missing right curly or square bracket at /opt/lampp/cgi-bin/sendmail line 43, at end of line
syntax error at /opt/lampp/cgi-bin/sendmail line 43, at EOF
Execution of /opt/lampp/cgi-bin/sendmail aborted due to compilation errors.

wenn ich aber eine cgi öffne, die bereits vorher da war, dann funktioniert alles sauber...muss ich meinen formmailer vllt. i-wie vorher kompilieren oder so? er ist in perl geschrieben.

Ich danke schonmal für Antworten

Dakuan

Avatar von Dakuan

Anmeldungsdatum:
2. November 2004

Beiträge: 6489

Wohnort: Hamburg

Eine direkte Idee habe ich jetzt auch nicht, aber einige zusätzliche Informationen wären nicht schlecht.

Was ist denn das für ein Script, also welche Sprache? CGI bezeichnet nur die Schnittstelle, wird aber oft als Perl-Script realisiert, wobei Phyton, PHP, Bash (lieber nicht) oder fertig compilierte Programme auch gehen.

Dann wäre auch noch der Inhalt der angemeckerten Zeilen interessant. Und überhaupt, über welchen Server, intern oder extern, sollen die Mails verschickt werden? Möglicherweise fehlt dir ein noch eigener Mailserver.

Pat_Ubuntu_User

(Themenstarter)
Avatar von Pat_Ubuntu_User

Anmeldungsdatum:
26. September 2009

Beiträge: 10

Dakuan schrieb:

Was ist denn das für ein Script, also welche Sprache? CGI bezeichnet nur die Schnittstelle, wird aber oft als Perl-Script realisiert, wobei Phyton, PHP, Bash (lieber nicht) oder fertig compilierte Programme auch gehen.

Es ist ein in Perl geschriebenes Script

Dann wäre auch noch der Inhalt der angemeckerten Zeilen interessant.

Und überhaupt, über welchen Server, intern oder extern, sollen die Mails verschickt werden?

Meinst, ob die Mail mithilfe des Scriptes oder über ein Externes Mailprogramm verschickt werden soll? Wäre eigl ganz schön, wenn man kein externes Programm dafür bräuchte.

Möglicherweise fehlt dir ein noch eigener Mailserver.

Kann man ja mal einrichten, der Server steht ja bei mir im Zimmer

sendmail.txt (962 Bytes)
Download sendmail.txt

Gwen-Dragon

Anmeldungsdatum:
4. August 2008

Beiträge: 189

Versuche doch mal das Skript in der Konsole perl -cw /opt/lampp/cgi-bin/sendmail zu testen. Du hast da einige arge Fehler reinprogrammiert.

Du solltest immer das Programm erst mal mit perl -c ... aufrufen um sicher zu sein, das es kompiliert.

Das Programm sagt dir doch was du falsch machst:

Global symbol "$return" requires explicit package name at /opt/lampp/cgi-bin/sendmail line 41.

Die Variable $return ist nicht richtig deklariert.

Missing right curly or square bracket at /opt/lampp/cgi-bin/sendmail line 43, at end of line

Irgendwo fehlt die schließende geschwungene Klammer

Ansonsten hilft dir in Fragen zu Perl auch Perl-Communityhttp://www.perl-community.de/bat/poard/start weiter.

Ich könnte dir ja zeigen wie du es richtig machst, aber lernst du dann was dabei?

Pat_Ubuntu_User

(Themenstarter)
Avatar von Pat_Ubuntu_User

Anmeldungsdatum:
26. September 2009

Beiträge: 10

Danke, Gwen-Dragon, ne, ich möchte es lieber alleine machen, dann lernt man es besser. Hast mir ja schon gute tipps gegeben sobald ich es getestet habe, poste ich es hier mal

Pat_Ubuntu_User

(Themenstarter)
Avatar von Pat_Ubuntu_User

Anmeldungsdatum:
26. September 2009

Beiträge: 10

Also, ich habe jetzt das script etwas verändert, mit perl- cw /opt/lampp/cgi-bin/sendmail getestet und der sagt mir jetzt:

Syntax ok

Wenn ich das script nun über meine Seite aufrufe, kommt keine Fehlermeldung mehr, aber er lädt lange, bevor er eine mail sendet. Und die Mails, die dann bei mir ankommen, haben keinen inhalt. Also eine leere mail....ob immer noch was am script falsch ist?

Danke schonmal für die Vorherigen raschen antworten.

sendmail (Verändert).txt (932 Bytes)
Download sendmail (Verändert).txt

Dakuan

Avatar von Dakuan

Anmeldungsdatum:
2. November 2004

Beiträge: 6489

Wohnort: Hamburg

Ich habe von Perl Null Ahnung, deshalb kann ich aus dem Script nicht herauslesen wie die Werte an das Script übergeben werden, aber hier würde ich erstmal den Fehler vermuten.

Normalerweise macht es einen Unterschied, ob die Übertragung der Daten per GET oder POST erfolgt, da heirfür jeweils eigene Umgebungsvariablen für das Script generiert werden. Jedenfalls muste ich bei PHP immer darauf achten.

Pat_Ubuntu_User

(Themenstarter)
Avatar von Pat_Ubuntu_User

Anmeldungsdatum:
26. September 2009

Beiträge: 10

Also ich habe es über den befehl

method="POST"

laufen, dann kommt halt die leere mail an. Wenn ich den befehl dann auf

method="GET"

ändere, kommt gar keine mail mehr...also wird es sicherlich was mit dem script zu tun haben...

Pat_Ubuntu_User

(Themenstarter)
Avatar von Pat_Ubuntu_User

Anmeldungsdatum:
26. September 2009

Beiträge: 10

Wo du du schon sagts, du müsstest immer bei php drauf achten....dann sollte es damit doch auch gehen, oder?

Dakuan

Avatar von Dakuan

Anmeldungsdatum:
2. November 2004

Beiträge: 6489

Wohnort: Hamburg

Ich wollte nur darauf hinweisen, das beides aufeinander abgestimmt sein muss. Aber da ich von Perl keine Ahnung habe, kann ich da auch nicht wirklich weiterhelfen.

Es könnte natürlich auch noch an der "Formatierung" einiger Variablen liegen. Also wer schonmal versucht hat mit einem Telnet Client manuell eine E-Mail bei einem Server abzuliefern weiss was ich meine. Das hatte ich gestern gerade wieder probiert und bin dann nach einigen Minuten wegen Timeout rausgeflogen (Mail war weg).

Ausserdem möchte ich mal wissen was in dem Script delimiter ist. Ist das einfach nur ein Text oder eine irgendwo definierte Konstante? Ich frage das desshalb, weil der Mailserver (bei mir postfix) als Endekennzeichen des Nachrichtentextes die Zeichenfolge "<CR><LF>.<CR><LF>" erwartet (in C Schreibweise "\r\n.\r\n").

Das einzige, was mir da mangels Perl Kenntnisse noch einfällt ist, mal mit einem Sniffer wie Wireshark nachzusehen was überhaupt gesendet wird. Geht natürlich nicht, wenn der Server keine GUI hat.

Aber mal eine andere Frage, warum muss das ein Perl Script sein?

Pat_Ubuntu_User

(Themenstarter)
Avatar von Pat_Ubuntu_User

Anmeldungsdatum:
26. September 2009

Beiträge: 10

Also, mein Server hat eine grafische benutzeroberfläche, ich verwende standardgemäß gnome.

es muss nicht perl sein, ich nehme an, mit php, python und c geht es genauso gut

Dakuan

Avatar von Dakuan

Anmeldungsdatum:
2. November 2004

Beiträge: 6489

Wohnort: Hamburg

Der Vorschlag vorhin mit Wireshark war mist, bitte vergessen.

es muss nicht perl sein, ich nehme an, mit php, python und c geht es genauso gut

Na ja, C ist wohl nicht so gut geeignet, es sei denn, man kann auf fertige Bibliotheken zurückgreifen. Ansonsten ist die Sprache am besten geeignet, mit der man sich am besten auskennt, deshalb mache ich das mit PHP. Das Netz ist wahrscheinlich voll mit Beispielen in PHP und wahrscheinlich auch in Python.

Leider ist mein Mailscript in den letzten Jahren ziemlich stark angewachsen und ist für sich alleine auch nicht wirklich verständlich, da es in ein System von Layout Schablonen eingebunden ist. Die wichtigsten Teile davon sehen etwa so aus:

<?php // Version: 20090228
 ...
require_once( $config_path."/mail.cfg"); // Konfigurationsdatei !
$lang=0;
if ( isset( $v ) )
  $sub = $v; // import default subject

// import POST variables (Formularinhalt)
if ( !empty( $_POST ) ){
  if ( isset($_POST["submit"]) )     $submit = $_POST["submit"]; // Formularbuttons
  if ( isset($_POST["clear"]) )      $clear = $_POST["clear"];
  if ( isset($_POST["from_name"]) )  $from_name = $_POST["from_name"];
  if ( isset($_POST["from_mail"]) )  $from_mail = $_POST["from_mail"];
  if ( isset($_POST["sub"]) )        $sub = $_POST["sub"];
  if ( isset($_POST["message"]) )    $message = $_POST["message"];
  if ( isset($_POST["l"]) )          $l = $_POST["l"];  // Sprache
}
 ...
 (Sprachauswahl, Textaufbereitung fuer Formular ...)
 ...
if( isset( $submit ) ){ // Mail absenden
  $header = "From:$from_name<$from_mail>\n";
  $header.= "Cc: $email_to_cc\n";
  if( @mail( $email_to, $sub, $message, $header ))
    $res=$e_none; // OK, no error
  else
    $res="<span  style=\"color:red\">$e_reject</span>";
  include( $config["template"].$g_layout."/".$mtpl_out );
  return;
}

if( !isset( $submit ) ){ // Eingabeformular anbieten
  include( $config["template"].$g_layout."/".$mtpl_in );
}
?>

Das sieht jetzt etwas unübersichtlich aus, weil das Script sowohl für die Anzeige des Formulars als auch für die Ergebnisauswertung zuständig ist und die HTML Daten in den Includedateien sind. Eigentlich ist nur

  ...
  if( @mail( $email_to, $sub, $message, $header ))
    ...

erforderlich, aber da siht man dann nicht wie die Formulardaten da reinkommen.

Gwen-Dragon

Anmeldungsdatum:
4. August 2008

Beiträge: 189

1. Verwende sinnvollerweise sendmail -toi als Aufruf oder gleoch das Modul Mail::Send aus MailTools (schau halt auf CPAN unter http://search.cpan.org/~markov/MailTools/ nach).

2. Braucht dein sendmail wirklich kein From:-Header!?

3. Vor deinem Mailtext muss unbeding eine Leerzeile. Damit Header und Mailbody getrennt sind!

4. Verwende keien Barewords als Filehandles, sondern eine Variable; also open($mail, ...) anstatt open(MAIL, ...)

5. Prüfe beim close der Sendmail pipe, was schief ging; also nicht nur das open!

6. Wer garantiert dir, dass in $params{'subject'} nicht das folgende steht:

"BCC: blhablha<test@example.com>\nBCC: blhablha<test1@example.com>\nBCC: blhablha<test12@example.com>\nBCC: blhablha<test12@example.com>\n\nDU WOLL SEX MIT ....\nBESUCHE sxxxxxx.example\n.\0";

Da ließe sich fein spammen. 😉 Entweder du testest dein Subject auf gültige Inhalte oder du lädtst zum Spammen in.

Ich kann mir schon vorstellen, wie so machen SQL-XSS-Injections bei PHP-Anwendungen zustanden kommen.

Programmieren PHPler immer alles gern per Hand? Warum werden denn keine Perl-Module benutzt?

Vielleicht helfen dir ja die Tipps, ansonsten komm doch mal auf www.perl-community.de vorbei, da gibt es im Forum mehr Perl-Anwender. Du kannst dort auch als Gast posten. 😉 Ich schaue hier einfach zu wenig rein, außer mein Privat-Ubuntu spinnt mal, was selten ist.

Pat_Ubuntu_User

(Themenstarter)
Avatar von Pat_Ubuntu_User

Anmeldungsdatum:
26. September 2009

Beiträge: 10

Ok, Gwen-Gragon. ich werde mich auf der seite mal umschauen. an dakuan: also ich habe es jetzt mit php hinbekommen, aber es dauert unendlcih lange...liegt es am php oder weil der server "privat" ist und nicht so eine superschnelle internetanbindung hat?

Dakuan

Avatar von Dakuan

Anmeldungsdatum:
2. November 2004

Beiträge: 6489

Wohnort: Hamburg

Bei mir funktioniert das fast sofort. Ich versende die Mails vom lokalen Server über t-online an einen 1und1 Account und wenn ich danach meine Konten abfrage ist die Mail schon da, also unter 1 Minute.

Vielleicht solltest du doch mal mit Wireshark kontrollieren, wann dein Server die Mail weiterleitet.

Antworten |