Thomas: FormMailer der mal geht und mal nicht

Hallo Wissende!

Ich habe hier einen FormMailer, der seit über einem Jahr im Einsatz ist und bisher wunderbar funktioniert hat. Ich habe dieses Script bei Anbietern gehostet. Bei einem der Anbieter wurde die php-Version geändert. Seitdem funktioniert das Script nur noch in 10% aller Versuche. Bei dem anderen Anbieter funktioniert das Script nur in 50% aller Versuche.

Woran kann das liegen???

Das Script wird von vielen verschiedenen Usern aus über Ihr Kontaktformular angesprochen. Dem Script wird dabei der Empfänger, der Absender und der Inhalt usw. übergeben.

Ich bin total verzweifelt und weis smir keinen Rat mehr. Hier im folgenden das Script:

<?
$datum=strftime("%d.%m.%Y");
$zeit=date("H:i");
$https=$HTTP_POST_VARS;
$rec2    = $_POST["email2"];
$copy    = $_POST["copy"];
$copyto  = $_POST["SenderMail"];

$text="Sie haben eine Mail am $datum um $zeit erhalten!\n
___________________________________________________
\n";

$text2="Sie haben ein Formular am $datum um $zeit ausgefüllt!\n
Dabei wurden folgende Angaben übermittelt:\n
___________________________________________________
\n";

foreach ($https as $key => $value) {
 $text = $text."".$key.": ".stripslashes($value)."\n\n";
        $text2= $text2."".$key.": ".stripslashes($value)."\n\n";
}
if(empty($_POST['betreff'])) {
 $_POST['betreff']="Formularübermittlung";
}
if(empty($_POST['absmail'])) {
 $_POST['absmail']=$_POST['email'];
}
if(empty($_POST['url'])) {
 $_POST['url']="http://www.css-maker.de";
}

$header="From: ".$_POST['absmail']."\n";

$senden=mail($_POST['email'],$_POST['betreff'],$text,$header) or die ("Fehler beim Übermitteln!");

if ($rec2 != "") mail($rec2,$_POST['betreff'],$text,$header) or die ("Fehler beim Übermitteln an den 2. Empfänger");

if ($copy != "") mail($copyto,$_POST['betreff'],$text2,$header) or die ("Fehler beim Übermitteln der Kopie");

Header("Location: ".$_POST['url']);

if($senden) {

include("countmegood.php");

} else {
 echo "Fehler beim Senden! Bitte <a href="mailto:webmaster@css-maker.de">webmaster@css-maker.de</a> kontaktieren!<br><a href="javascript:history.back()">Zurück zum Formular</a>";
}
?>

und hier ein Beispielformular:

<html>
<head>
<meta http-equiv="Content-Language" content="de">
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<meta name="generator" content="Formular-Maker">
<title>Kontakformular</title>

<style type="text/css">
body {background-color:#FFFFFF; font-family:"Arial";}
h1.farbig {color:#000000; font-family:"Arial"; font-size:20px;}
td.farbig {font-family:"Arial"; font-size:12px;}
p.farbig {color:#000000; font-family:"Arial"; font-size:12px;}
p.anno {color:#000000; font-family:"Arial"; font-size:12px;}
</style>
</head>
<body >
<div align="center">
<h1 class="farbig">Kontaktformular</h1>
<p class="anno">Mit diesem Formular können Sie uns erreichen.</p>
<form name="Kontakt" action="http://www.CSS-Maker.de/scripts/formmailer/formmailer.php" method=POST >

<input type="hidden" name="copy" value="">
<input type="hidden" name="url" value="http://www.css-maker.de">
<input type="hidden" name="email" value="webmaster@css-maker.de" >
<input type="hidden" name="betreff" value="Formular" >

<table cellpadding="3" cellspacing="2">
<tr valign="top" height="25">
<td class="farbig" align="right">E-Mail</td>
<td class="farbig"><input type="text" name="SenderMail" value="" size="20" MaxLength="20"></td>
</tr>
<tr valign="top" height="25">
<td class="farbig" align="right">Name</td>
<td class="farbig"><input type="text" name="Name" value="" size="20" MaxLength="20"></td>
</tr>
<tr valign="top" height="25">
<td class="farbig" align="right">Ihr Text</td>
<td class="farbig"><textarea  wrap=physical name="Text" cols="15" rows="5"></textarea></td>
</tr>
<tr>
<td align="right"><input type="submit" name="next" value="Abschicken"></td>
<td><input type="reset" name="next" value="Zurücksetzen"></td>
</tr>
</table>
</form>
</div>
</body>
</html>

Sollte jemand einen oder mehrere Fehler finden können, würde ich mich wirklich freuen, wenn ich einen guten Hinweis bekommen würde.

Ich danke Euch schon im voraus sehr für Eure Bemühungen
Thomas

  1. Huhu Thomas

    Ich habe hier einen FormMailer, der seit über einem Jahr im Einsatz ist und bisher wunderbar funktioniert hat.

    Die Empfänger-Email per POST zu übergeben ist keine gute Idee.
    Damit kann man Deinen FormMailer leicht zur Spam-Schleuder umfunktionieren!

    <?

    verzichte auf diese "short tag"-Schreibweise.
    Schreibe immer

    <?php

    $https=$HTTP_POST_VARS;

    das ist veraltet.

    Das Script wird von vielen verschiedenen Usern aus über Ihr Kontaktformular angesprochen. Dem Script wird dabei der Empfänger, der Absender und der Inhalt usw. übergeben.

    Wie gesagt, das ist weniger gut, da der Mißbrauch leicht möglich ist.

    Schicke keine Empfänger-Adresse im Klartext, sondern z.B. eine ID welche von Deinem Skript dann dem Mail-Empfänger zugeordnet wird.

    Viele Grüße

    lulu

    --
    bythewaythewebsuxgoofflineandenjoytheday
    1. Hallo Lulu!

      Danke erstmal!

      War denn aber ein gravierender Fehler zu finden?

      Es kommt nämlich entweder internal Serverror500 oder Fehler beim Übermitteln, welches aus diesem Befehler resultieren muss...

      Die Empfänger-Email per POST zu übergeben ist keine gute Idee.
      Damit kann man Deinen FormMailer leicht zur Spam-Schleuder umfunktionieren!

      was soll ich dann statt POST schreiben, oder kann ich das komplett weglassen?

      verzichte auf diese "short tag"-Schreibweise.
      Schreibe immer

      <?php

      ok, werde ich machen! danke für den tipp.

      $https=$HTTP_POST_VARS;

      das ist veraltet.

      Was soll ich stattdessen verwenden?
      Kann daraus vielleicht das Problem entstanden sein? denn es gibt ja die Probleme erst seitdem auf einem der Server eine neue php-Version installiert wurde.

      Wie gesagt, das ist weniger gut, da der Mißbrauch leicht möglich ist.

      Schicke keine Empfänger-Adresse im Klartext, sondern z.B. eine ID welche von Deinem Skript dann dem Mail-Empfänger zugeordnet wird.

      OK, das würde ich gern tun, aber da fehlt mir leider das wissen, um dies sauber zu realisieren.

      1. Hi Thomas!

        $https=$HTTP_POST_VARS;

        das ist veraltet.

        Was soll ich stattdessen verwenden?
        Kann daraus vielleicht das Problem entstanden sein? denn es gibt ja die Probleme erst seitdem auf einem der Server eine neue php-Version installiert wurde.

        Die "neue" (seit PHP 4.1.0) Schreibweise ist einfach $_POST. Siehe hierzu auch die betreffenden Seiten im PHP-Manual: http://www.php.net/en/language.variables.predefined

        Grüße,
        Fabian St.

        --
        Meine Website: http://fabis-site.net
        --> XHTML, CSS, PHP-Formmailer, Linux
        ---------------------
        fabi@erde ~# whatis spam
        spam: nothing appropriate
        ---------------------
        Selfcode: ie:% fl:|  br:^ va:) ls:& fo:) rl:( n4:° ss:| de:> js:| ch:| mo:) zu:)
        1. Hallo Fabian!

          Die "neue" (seit PHP 4.1.0) Schreibweise ist einfach $_POST. Siehe hierzu auch die betreffenden Seiten im PHP-Manual: http://www.php.net/en/language.variables.predefined

          habs mir durchgelesen und auch angepasst. Leider wird es nicht besser, auch nachdem ich das Beispielscript von dieser Seite getestet habe, scheint es mir immer wahrscheinlicher, dass das Problem beim Provider liegt, da auch dieses nicht versendet wird.

          Hier der Code:
          <?php

          Konfiguration

          Bitte passen Sie die folgenden Werte an, bevor Sie das Script benutzen!

          An welche Adresse sollen die Mails gesendet werden?

          $strEmpfaenger = $_POST['email'];

          Welche Adresse soll als Absender angegeben werden?

          (Manche Hoster lassen diese Angabe vor dem Versenden der Mail ueberschreiben)

          $strFrom       = $_POST['email'];

          Welchen Betreff sollen die Mails erhalten?

          $strSubject    = $_POST['betreff'];

          Zu welcher Seite soll als "Danke-Seite" weitergeleitet werden?

          Wichtig: Sie muessen hier eine gueltige HTTP-Adresse angeben!

          $strReturnhtml = $_POST['url'];

          Welche(s) Zeichen soll(en) zwischen dem Feldnamen und dem angegebenen Wert stehen?

          $strDelimiter  = ":\t";

          Ende Konfiguration

          if($_POST)
          {
           $strMailtext = "";

          while(list($strName,$value) = each($_POST))
           {
            if(is_array($value))
            {
             foreach($value as $value_array)
             {
              $strMailtext .= $strName.$strDelimiter.$value_array."\n";
             }
            }
            else
            {
             $strMailtext .= $strName.$strDelimiter.$value."\n";
            }
           }

          if(get_magic_quotes_gpc())
           {
            $strMailtext = stripslashes($strMailtext);
           }

          mail($strEmpfaenger, $strSubject, $strMailtext, "From: ".$strFrom)
            or die("Die Mail konnte nicht versendet werden.");
           header("Location: $strReturnhtml");
           exit;
          }

          ?>

          1. scheint es mir immer wahrscheinlicher, dass das Problem beim Provider liegt

            Wenn du deinen Code an den PHP-Interpreter gibst, dann funktioniert das entweder oder es gibt einen Fehler. Es kann aber nicht sein, daß ein Script mal nach Lust und Laune funktioniert.
            Wenn es also ab und zu funktioniert, muß dein Code ja korrekt sein (wenn auch teilweise ein wenig unschön).
            Kannst du dein Script auf einen anderen Server laden? Dann könntest du dort ggf. noch mal testen.
            Bei sowas schreibe ich immer recht schnell den Provider an. Vor kurzem hatte ich einen  Formmailer, der bereits seit fast zwei Jahren auf einem Server läuft. Plötzlich klappte nichts mehr. Da seit zwei Jahren nichts am Script verändert wurde, konnte es nur am Provider liegen. Der meinte zwar erst, daß sie nichts verändert hätten, aber nach einigen Telefonaten stellten sie fest, daß man den MTA ausgetauscht hatte und zu blöd zum Rechte verteilen war...

            Gruß, rob

            1. Hallo Rob,

              genau das ist mir ja nun auch passiert. Das Script lief über ein Jahr. Ich habe es immer wieder etwas erweitert, und es gab NIE Probleme.

              Ich habe den Support-Bereich schon kontaktiert. Die weigern sich aber mein Script anzusehen und schreiben, dass der Fehler nicht bei Ihnen liegen kann. Die sind echt das allerletzte.

              Ich habe das Gleiche Script bei Strato gehostet und es funzt.

              ABER: komischerweise kam gerade eben bei einem Test eine InternalServerError-Meldung. Ich weiss nicht, was da los ist...

              Was auch komisch ist, ist dass ich das Beispielscript auf den Server geschoben habe und dass es IMMER funzt, wenn ich die Variablen für Empfänger, Absebder, Betreff und Header fix ins Script schreibe, es aber bockt, wenn ich diese aus $_POST['str_email'];....usw auslese. Ich verstehe das einfach nicht...

              Was mache ich denn nur falsch?
              Und, was kann denn beim Provider falsch gelaufen sein???

              Danke
              Thomas

    2. Moin,

      <?
      verzichte auf diese "short tag"-Schreibweise.

      Warum sollte er? Das ist korrekter PHP-Code.

      Grüße aus Hamburg
      Michel

      --
      Ein Problem ist halb gelöst, wenn es klar formuliert ist. (John Dewey)
      1. Hi!

        <?
        verzichte auf diese "short tag"-Schreibweise.

        Warum sollte er? Das ist korrekter PHP-Code.

        Das schon, aber PHP könnte das mit möglichen xml-Tags verwechseln und gibt eine Fehlermeldung aus.

        Grüße,
        Fabian St.

        --
        Meine Website: http://fabis-site.net
        --> XHTML, CSS, PHP-Formmailer, Linux
        ---------------------
        fabi@erde ~# whatis spam
        spam: nothing appropriate
        ---------------------
        Selfcode: ie:% fl:|  br:^ va:) ls:& fo:) rl:( n4:° ss:| de:> js:| ch:| mo:) zu:)
        1. Internal Server Error
          The server encountered an internal error or misconfiguration and was unable to complete your request.
          Please contact the server administrator, service@webmailer.de and inform them of the time the error occurred, and anything you might have done that may have caused the error.

          More information about this error may be available in the server error log.

          brachte mir der letzte Test!
          Was ist denn da nur los???

  2. Woran kann das liegen???

    Das weiß ich nicht, aber ich würde erstmal zusehen, daß ich alle Fehler und unschönen Code entferne. Dann bist du dein Problem mit etwas Glück schon los. Ansonsten wird's leichter, daß Problem einzugrenzen und valider Code ist ja ohnehin nicht verkehrt...
    Beim ersten kurzen Überfliegen des Codes sehe ich gleich so einige Fehler(chen)...

    $https=$HTTP_POST_VARS;

    ist je nach Einstellung der php.ini ein Problem. Ich würde mit $_POST arbeiten.

    Header("Location: ".$_POST['url']);

    Wo stellst du sicher, daß $_POST['url'] einen vollständigen URL (mit http://) enthält? Wieso übergibst du diesen Wert per hidden-Feld (problemlos zu erkennen; problemlos zu faken) anstatt das direkt in deinen PHP-Code zu schreiben?
    Wieso setzt du kein exit(); hinter diese Funktion? Nur so kannst du sicherstellen, daß nachfolgender Code nicht doch noch mal ausgeführt wird (hab da schon merkwürdige Sachen gesehen).
    Und dir ist klar, daß dein Script am Ende ist, wenn es eine Mail nicht verschickt werden kann..? Sobald eine Ausgabe mit die() erfolgt, funktioniert das nachfolgende header() nicht mehr, weil bereits Header an den Browser gesendet wurden.

    Gruß, rob

    1. $https=$HTTP_POST_VARS;
      ist je nach Einstellung der php.ini ein Problem. Ich würde mit $_POST arbeiten.

      ok, wenn ich dann genauso, wie mit der anderen variable auf die inhalte zugreigfen kann, werde ich das sofort ändern.

      Header("Location: ".$_POST['url']);
      Wo stellst du sicher, daß $_POST['url'] einen vollständigen URL (mit http://) enthält?

      Ich generiere mit einer Software Formulare für die User. In dieser Software müssen die User diese URL angeben.

      »»Wieso übergibst du diesen Wert per hidden-Feld (problemlos zu erkennen; problemlos zu faken) anstatt das direkt in deinen PHP-Code zu schreiben?

      Weil ja nix statisch ist und jeder User etwas anderes übergeben können soll.

      Wieso setzt du kein exit(); hinter diese Funktion? Nur so kannst du sicherstellen, daß nachfolgender Code nicht doch noch mal ausgeführt wird (hab da schon merkwürdige Sachen gesehen).

      Weil ich es nicht besser weiss und vielleicht ist dies ja hier die Chance das Script sauber zu verbessern.

      Und dir ist klar, daß dein Script am Ende ist, wenn es eine Mail nicht verschickt werden kann..? Sobald eine Ausgabe mit die() erfolgt, funktioniert das nachfolgende header() nicht mehr, weil bereits Header an den Browser gesendet wurden.

      nein, leider war und ist mir das nicht klar, aber ich werde anfangen die Tipps umzusetzen

      Danke Thomas

      1. nein, leider war und ist mir das nicht klar, aber ich werde anfangen die Tipps umzusetzen

        Äh, nein. Setzt diesen Tipp mal lieber nicht um... Hab schneller getippt als gedacht. Natürlich funktioniert header() nicht mehr, sobald schon Ausgaben an den Client gesendet wurden. In deinem Fall ist das aber egal, weil die() ja das Script beendet und header() ja in keinem Fall mehr ausgeführt wird...

        1. ok, danke für deinen tipp.
          habe da auch schon etwas drüber gegrübelt und mich ein wenig gewundert. aber nun usts ja klar. trotzdem funzt es nicht stabil.

          ich dreh noch durch...

          cu
          thomas

  3. Hallo Nochmal!

    Ich habe nun also mal das BeispielScript, welches hier zu finden ist.

    <?php

    Konfiguration

    Bitte passen Sie die folgenden Werte an, bevor Sie das Script benutzen!

    An welche Adresse sollen die Mails gesendet werden?

    $strEmpfaenger = $_POST['email'];

    Welche Adresse soll als Absender angegeben werden?

    (Manche Hoster lassen diese Angabe vor dem Versenden der Mail ueberschreiben)

    $strFrom       = $_POST['email'];

    Welchen Betreff sollen die Mails erhalten?

    $strSubject    = $_POST['betreff'];

    Zu welcher Seite soll als "Danke-Seite" weitergeleitet werden?

    Wichtig: Sie muessen hier eine gueltige HTTP-Adresse angeben!

    $strReturnhtml = $_POST['url'];

    Welche(s) Zeichen soll(en) zwischen dem Feldnamen und dem angegebenen Wert stehen?

    $strDelimiter  = ":\t";

    Ende Konfiguration

    if($_POST)
    {
     $strMailtext = "";

    while(list($strName,$value) = each($_POST))
     {
      if(is_array($value))
      {
       foreach($value as $value_array)
       {
        $strMailtext .= $strName.$strDelimiter.$value_array."\n";
       }
      }
      else
      {
       $strMailtext .= $strName.$strDelimiter.$value."\n";
      }
     }

    if(get_magic_quotes_gpc())
     {
      $strMailtext = stripslashes($strMailtext);
     }

    mail($strEmpfaenger, $strSubject, $strMailtext, "From: ".$strFrom)
      or die("Die Mail konnte nicht versendet werden.");
     header("Location: $strReturnhtml");
     exit;
    }

    ?>

    Das tolle daran ist, dass es trotzdem bei einem der hoster nicht funktioniert. Es kommt immer die Fehlermeldung: Die Mail konnte nicht versendet werden.

    Komisch nur, dass die Formularinhalte aber versendet werden. Es kommt die Fehlermeldung und die Folgeseite wird nicht aufgerufen.

    Wer hat noch einen Tipp???

    Danke Thomas