Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Problem mit PHPMailer bzw. Kontaktformular

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [Erledigt] Problem mit PHPMailer bzw. Kontaktformular

    Liebe Community

    Ich habe für meine (private) Homepage ein Kontaktformular gebaut, d. h. ein Formular, wo Besucher mir direkt eine Mail schreiben können. Das funktioniert auch einwandfrei. So weit so gut. Es gibt aber seit einer Weile (ich kann leider nicht sagen seit wann genau, da das Formular ja sonst funktioniert, d. h. ich habe es erst kürzlich bemerkt) ein etwas skurriles Problem: Das Format "tut so", beim blossen Aufrufen (also ohne dass irgendetwas eingegeben worden wäre), als hätte bereits ein fehlerhafter Versuch stattgefunden, und klatscht die entsprechende Fehlerangabe mit der Detailbegründung Mailer error: Message body empty hin. Das ist natürlich unsinnig, weil der Besucher ja tatsächlich noch gar nichts eingegeben, geschweige denn Senden gedrückt hat. - Ich erwähne noch, dass die etwas veraltete PHPMailer-Version 5.2.6 aufgespielt ist und ich die natürlich durch die aktuelle 5.2.9 ersetzen werde; einen Zusammenhang zum Problem halte ich aber für nicht so wahrscheinlich (man weiss ja aber nie).

    Der Code:

    kontaktformular.php

    PHP-Code:
    <?php
    error_reporting
    (E_ALL E_NOTICE);
    ini_set("display_errors"true); 
    ?>
    <!DOCTYPE html>
    <html lang="de">
    <?php
    include ("head.php");
    ?>
    <body>
    <div id="wrapper">
    <?php
    include("header.php");
    ?>
    <div id="inhalt">
    <div id="inhalt2">
    <div id="links">
    <h1>
    Kontaktformular
    </h1>
    <p>
    Mit dem nachfolgenden Kontaktformular können Sie mir eine Nachricht hinterlassen. Technisch hat das Benutzen des Formulars denselben Effekt wie das Schreiben eines Mails an meine <a href="mailto:michael.ritter@sunrise.ch">Mailadresse</a>. Der Vorteil für Sie ist, dass Sie zum  Abschicken des Formulars kein Mailprogramm benutzen müssen.
    </p>
    <fieldset>
    <legend>
    Ihre Nachricht
    </legend>
    <form action="kontaktformular.php" method="post"><br>
    <input type="hidden" value="set" name="formular">
    Ihr Name:<br><input type="text" value="" placeholder="Name" name="name"><br><br>
    <span id="bot">Ihr Titel: <input type="text" name="titel"> </span>
    Ihre Mailadresse:<br><input type="text" value="" placeholder="Mail" name="mail"><br><br>
    Betreff:<br><input type="text" value="" placeholder="Betreff" name="betreff"><br><br>
    Ihr Text:<br><textarea name="inhalt" placeholder="Text" rows="10">
    </textarea><br><br>
    <input type="submit" value="Senden">
    <br>
    <br>
    <?php
    require("class.phpmailer.php");
    $mail = new PHPMailer();
    $mail->AddAddress("haha.hihi@huhu.ch");
    $mail->From $_POST['mail'];
    $mail->FromName $_POST['name'];
    $mail->Subject "Vom Homepage-Kontaktformular:" $_POST['betreff'];
    $mail->Body $_POST['inhalt'];
    $mail->WordWrap 50;

        if(!
    $mail->Send()) 
        {
        echo 
    'Das ist etwas schief gegangen. Ihre Nachricht wurde leider nicht abgeschickt.';
        echo 
    'Mailer error: ' $mail->ErrorInfo;
        } 
        else 
        {
        echo 
    "<h5>" 'Ihre Nachricht wurde abgeschickt.' "</h5>";
        }

    ?>
    </form>
    <p id="guestbook">
    <a href="index.php">Zurück zur Hauptseite</a>
    </p>
    </fieldset>
    <br>
    <br>
    </div>
    <?php
    include("rechts.php");
    include(
    "footer.php");
    ?>
    </div>
    </body>
    </html>
    Das Ganze kann in echt hier bewundert werden.

    Wie immer danke ich für jede Hilfe.

    Lg X.


  • #2
    Hallo,

    bau ein if ein, um zu prüfen ob das Formular abgeschickt wurde.
    Relax, you're doing fine.
    RTFM | php.de Wissenssammlung | Datenbankindizes | Dateien in der DB?

    Kommentar


    • #3
      Zitat von VPh Beitrag anzeigen
      Hallo,

      bau ein if ein, um zu prüfen ob das Formular abgeschickt wurde.
      Danke für diesen Ratschlag. Ich werde das angehen. Ich habe zunächst noch das Error-Reporting im Sinne Deiner Signatur auf voll aufgedreht und mehrere Notices vom Typ undefined index mit isset korrigiert. Der Übersicht halber der aktuellste Code:

      kontaktformular.php

      PHP-Code:
      <?php
      ini_set
      ('display_errors',1);
      error_reporting(-1);
      ?>
      <!DOCTYPE html>
      <html lang="de">
      <?php
      include ("head.php");
      ?>
      <body>
      <div id="wrapper">
      <?php
      include("header.php");
      ?>
      <div id="inhalt">
      <div id="inhalt2">
      <div id="links">
      <h1>
      Kontaktformular
      </h1>
      <p>
      Mit dem nachfolgenden Kontaktformular können Sie mir eine Nachricht hinterlassen. Technisch hat das Benutzen des Formulars denselben Effekt wie das Schreiben eines Mails an meine <a href="mailto:michael.ritter@sunrise.ch">Mailadresse</a>. Der Vorteil für Sie ist, dass Sie zum  Abschicken des Formulars kein Mailprogramm benutzen müssen.
      </p>
      <fieldset>
      <legend>
      Ihre Nachricht
      </legend>
      <form action="kontaktformular.php" method="post"><br>
      <input type="hidden" value="set" name="formular">
      Ihr Name:<br><input type="text" value="" placeholder="Name" name="name"><br><br>
      <span id="bot">Ihr Titel: <input type="text" name="titel"> </span>
      Ihre Mailadresse:<br><input type="text" value="" placeholder="Mail" name="mail"><br><br>
      Betreff:<br><input type="text" value="" placeholder="Betreff" name="betreff"><br><br>
      Ihr Text:<br><textarea name="inhalt" placeholder="Text" rows="10">
      </textarea><br><br>
      <input type="submit" value="Senden">
      <br>
      <br>
      <?php
      require("class.phpmailer.php");
      $mail = new PHPMailer();
      $mail->AddAddress("jojo.blabla@irgendeinmailprovider.ch");

          if(isset(
      $_POST['mail'])) 
          {
          
      $mail->From $_POST['mail'];
          }
          else if(isset(
      $_POST['name'])) 
          {
          
      $mail->FromName $_POST['name'];
          }
          else if(isset(
      $_POST['betreff'])) 
          {
          
      $mail->Subject "Vom Homepage-Kontaktformular:" $_POST['betreff'];
          }
          else if (isset(
      $_POST['inhalt'])) 
          {
          
      $mail->Body $_POST['inhalt'];
          }
          
      $mail->WordWrap 50;

          if(!
      $mail->Send()) 
          {
          echo 
      'Das ist etwas schief gegangen. Ihre Nachricht wurde leider nicht abgeschickt.';
          echo 
      'Mailer error: ' $mail->ErrorInfo;
          } 
          else 
          {
          echo 
      "<h5>" 'Ihre Nachricht wurde abgeschickt.' "</h5>";
          }

      ?>
      </form>
      <p id="guestbook">
      <a href="index.php">Zurück zur Hauptseite</a>
      </p>
      </fieldset>
      <br>
      <br>
      </div>
      <?php
      include("rechts.php");
      include(
      "footer.php");
      ?>
      </div>
      </body>
      </html>

      Lg X.

      Kommentar


      • #4
        Probiere es doch mit einer Variable, die du versteckt übermittelst beim Absenden.

        Sowas, in der Art:

        PHP-Code:
            //Übergabe der Kontrolle , ob es schon aufgerufen wurde
            
        echo'<input type="hidden" id="kontrolle" name="kontrolle" value="ja"/>'
        Wie schon vorgeschlagen dann per-if kontrollieren
        PHP-Code:
        //Schon einmal abgesendet?
                
        if ($_GET['kontrolle']== "ja"
        Wenn du dir die Anwender deiner Programme als Idioten vorstellst, werden auch nur Idioten deine Programme verwenden.
        - Linus Torvalds

        Kommentar


        • #5
          Ich habe jetzt mal folgenden Code eingefügt:

          PHP-Code:
          if(isset($_POST['abschicken'])) 
              {
              echo 
          "Das Formular wurde abgeschickt.";
              }
              else 
              {
              echo 
          "Das Formular ist noch nicht abgeschickt.";
              } 

          Der Code selber funktioniert einwandfrei , d. h. es wird korrekt gemeldet, ob das Formular noch nicht abgeschickt wurde, oder doch. Aber sonst macht das Formular immer wildere Bocksprünge:

          1) Es wird weiterhin (jetzt sogar immer, selbst wenn das Formular völlig korrekt ausgefüllt und abgeschickt wurde) gemeldet: Das ist etwas schief gegangen. Ihre Nachricht wurde leider nicht abgeschickt.Mailer error: Message body empty Dieser Text entspricht erstens dem, was passieren soll, wenn es tatsächlich schief ging gemäss der Anweisung

          PHP-Code:
          if(!$mail->Send()) 
              {
              echo 
          'Das ist etwas schief gegangen. Ihre Nachricht wurde leider nicht abgeschickt.';
              echo 
          'Mailer error: ' $mail->ErrorInfo;
              } 
          Noch kurioser ist, dass jetzt auch die Mails nicht mehr ankommen, auch nicht, wenn alles richtig ausgefüllt wurde...!



          Lg X.

          Kommentar


          • #6
            Wozu auch die ganzen else if's? Die Konstrukte sollen ja unabhängig voneinander funktionieren.
            PHP-Code:
                if(isset($_POST['mail']))  
                { 
                
            $mail->From $_POST['mail']; 
                } else{
                
            // Abbruch oder was auch immer in dem Fall passieren soll
                
            }
                if(isset(
            $_POST['name']))  
                { 
                
            $mail->FromName $_POST['name']; 
                } else
                {
                
            // Abbruch oder...
                
            }
            //... 
            Relax, you're doing fine.
            RTFM | php.de Wissenssammlung | Datenbankindizes | Dateien in der DB?

            Kommentar


            • #7
              Zitat von VPh Beitrag anzeigen
              Wozu auch die ganzen else if's? Die Konstrukte sollen ja unabhängig voneinander funktionieren.
              Ja, ich verstehe diesen Einwand zu diesem Nebenschauplatz. Der Punkt ist nur, dass ich eigentlich gar nichts bestimmen will bei Nichterfüllung der Bedingung, was ja dann heisst, dass der Skript einfach weiterläuft, oder? Oder ist das ungehörig, "darf" man das gar nicht?

              Ist denn also das hier besser?

              PHP-Code:
              if(isset($_POST['mail'])) 
                  {
                  
              $mail->From $_POST['mail'];
                  }
                  if(isset(
              $_POST['name'])) 
                  {
                  
              $mail->FromName $_POST['name'];
                  }
                  if(isset(
              $_POST['betreff'])) 
                  {
                  
              $mail->Subject "Vom Homepage-Kontaktformular:" $_POST['betreff'];
                  }
                  if (isset(
              $_POST['inhalt'])) 
                  {
                  
              $mail->Body $_POST['inhalt'];
                  } 
              Funktionieren tut es. Das beweist natürlich nicht, dass es "gut" ist, schon klar.

              Und jetzt noch etwas: Mit dem neuen Code funktioniert plötzlich (deswegen?) das Abschicken wieder, d. h. bei korrekt ausgefülltem Formular kommt das Mail an. Generell scheint für diesen Fall (korrekt ausgefülltes Formular) jetzt alles zu stimmen.

              Was ungelöst bleibt, ist das kuriose Ursprungsproblem, nämlich, dass bei nicht abgeschicktem Formular (bei blossem Aufruf des Formulars) weiterhin unten steht: Das ist etwas schief gegangen. Ihre Nachricht wurde leider nicht abgeschickt.Mailer error: Message body empty

              Lg X.

              P.S.: Schon mal danke für insbesondere Deine Unterstützung, geschätzter VPh.

              Kommentar


              • #8
                Der Punkt ist nur, dass ich eigentlich gar nichts bestimmen will bei Nichterfüllung der Bedingung
                Dann musst du natürlich auch nicht die einzelnen Inputs abfragen. Die Mail-Klasse scheint ja selbst drauf zu achten, ob alles nötige vorhanden ist, wenn dir das reicht, ists ja ok.

                Was ungelöst bleibt, ist das kuriose Ursprungsproblem, nämlich, dass bei nicht abgeschicktem Formular (bei blossem Aufruf des Formulars) weiterhin unten steht: Das ist etwas schief gegangen. Ihre Nachricht wurde leider nicht abgeschickt.Mailer error: Message body empty
                Du setzt ein if, das überprüft ob das Formular gesendet wurde. Im Anweisungsblock kommt dann dein Mailzeugs. Wenn das Formular nicht gesendet wurde, passiert auch nichts.
                PHP-Code:
                if(isset($_POST['abschicken'])) {
                require(
                "class.phpmailer.php"); 
                $mail = new PHPMailer(); 
                $mail->AddAddress("haha.hihi@huhu.ch"); 
                $mail->From $_POST['mail']; 
                $mail->FromName $_POST['name']; 
                $mail->Subject "Vom Homepage-Kontaktformular:" $_POST['betreff']; 
                $mail->Body $_POST['inhalt']; 
                $mail->WordWrap 50

                    if(!
                $mail->Send())  
                    { 
                    echo 
                'Das ist etwas schief gegangen. Ihre Nachricht wurde leider nicht abgeschickt.'
                    echo 
                'Mailer error: ' $mail->ErrorInfo
                    }  
                    else  
                    { 
                    echo 
                "<h5>" 'Ihre Nachricht wurde abgeschickt.' "</h5>"
                    }

                Relax, you're doing fine.
                RTFM | php.de Wissenssammlung | Datenbankindizes | Dateien in der DB?

                Kommentar


                • #9
                  Zitat von VPh Beitrag anzeigen
                  Dann musst du natürlich auch nicht die einzelnen Inputs abfragen. Die Mail-Klasse scheint ja selbst drauf zu achten, ob alles nötige vorhanden ist, wenn dir das reicht, ists ja ok.
                  Korrekt. Anlass, dass ich das gemacht habe, war der Auswurf der Notices nach Hochdrehen des Error-Reportings.

                  Du setzt ein if, das überprüft ob das Formular gesendet wurde. Im Anweisungsblock kommt dann dein Mailzeugs. Wenn das Formular nicht gesendet wurde, passiert auch nichts.
                  PHP-Code:
                  if(isset($_POST['abschicken'])) {
                  require(
                  "class.phpmailer.php"); 
                  $mail = new PHPMailer(); 
                  $mail->AddAddress("haha.hihi@huhu.ch"); 
                  $mail->From $_POST['mail']; 
                  $mail->FromName $_POST['name']; 
                  $mail->Subject "Vom Homepage-Kontaktformular:" $_POST['betreff']; 
                  $mail->Body $_POST['inhalt']; 
                  $mail->WordWrap 50

                      if(!
                  $mail->Send())  
                      { 
                      echo 
                  'Das ist etwas schief gegangen. Ihre Nachricht wurde leider nicht abgeschickt.'
                      echo 
                  'Mailer error: ' $mail->ErrorInfo
                      }  
                      else  
                      { 
                      echo 
                  "<h5>" 'Ihre Nachricht wurde abgeschickt.' "</h5>"
                      }

                  Genau, das war's! Der Witz besteht darin, die if-Anwesung um die Mail-Anweisungen "herum" zu machen! Ich kam nicht darauf!

                  Jetzt funktioniert alles!

                  Herzlichen Dank für Deine sehr zeitnahe Unterstützung! Schönen Sonntagabend noch.

                  Lg X.

                  Kommentar

                  Lädt...
                  X