1. Dashboard
  2. Artikel
  3. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  4. Forum
    1. Unerledigte Themen
  • Anmelden
  • Registrieren
  • Suche
Dieses Thema
  1. HTML - Webmaster Forum
  2. Programmierung - Entwickler Forum
  3. PHP Forum - Apache - CGI - Perl - JavaScript und Co.

Email Formular

  • sero79
  • 6. November 2008 um 16:41
  • sero79
    Schüler
    Beiträge
    71
    • 6. November 2008 um 16:41
    • #1

    Hallo,

    hier ist mein Versuch eines Email Formulars, Dabei benutze ich PHPMailer zum versenden von Email. Mit Hilfe des kleinen Tutorials funktioniert es schon recht gut. Aus meiner Html übergebe ich die Variablen an meine php, die ich dann in die Variablen vom PHPMailer übergeben werden.
    Nun möchte ich das Formular noch ein wenig benutzerfreundlicher machen und versuche Pflichtfelder einzubauen (Name und Absenderemail). Bei Nichteingabe (in php bedeuted das: empty string '' ), kommt eine Error message zurück. Das habe ich auch hinbekommen.
    Bei Eingabe der Pfichtfelder sollte die Email versendet werden. Dazu muss ich die if Schleife [ if(!$mail->Send()) ] vom PHPMailer in meine CheckForm Function einbauen. Allerdings liegt hier mein Problem. Ich hoffe ihr versteht meinen Ansatz zu den Pflichtfeldern.


    Hier mal die komplette Email Formular php:

    Code
    <?
     //include class
     require('phpmailer/class.phpmailer.php');
     
     //create instanz from PHPMailer  
     $mail = new PHPMailer();
     
     //variables from email_form.html 
     $name = $_POST['name']; 
     $email = $_POST['email'];
     $subject = $_POST['subject'];
     $message = $_POST['message'];
     
     $myEmail = 'meineEmail@xyz.com';
     
       //sender email
     $mail->From = $email;
     
     //sender name
     $mail->FromName = $name;
     
     //mail to address
     $mail->AddAddress($myEmail);
     
     //email subject
     $mail->Subject = $subject;
     
     //message text
     $mail->Body = $message;
     
     //send email and check if it was sent
     if(!$mail->Send())
     {
      //$mail->Send() returns FALSE: Error
      echo "The Email could not been sent";
      echo "Error: " . $mail->ErrorInfo;
     }
     else
     {
      //$mail->Send() returns TRUE: Success
      echo "The Email was sent.";
     }
     
     
     //testing for mandatory fields
     $strErrorMessage = CheckForm( $name, $email );
     
        if ($strErrorMessage > '')
        {
      echo $strErrorMessage; //this will retured when mandatory field are not filled in
        }
        else
        {
      echo "" Success; //this will returend when email has been sent successfully 
        }
    function CheckForm( $name, $email )
    {
     if ( $name == '' )   
     {
      $strErrorMessage = "Please enter your Name ... <br />";
     }
     if ( $email == '' )   
      {
       $strErrorMessage = $strErrorMessage . "Please enter your Email ... <br />";
      }
     if ( $name == '' AND $email == '' )   
      {
       $strErrorMessage = "You have to enter your Name and Email ... <br />";
      }
        if ($strErrorMessage == '') 
     {
      //if the error message is empty which means the mandatory field are filled in my email sould be ready to go!
     
     }
     
     return $strErrorMessage; 
    } 
     
    ?>
    Alles anzeigen



    Danke
    Seb

  • jojo87
    der/die Göttliche
    Reaktionen
    6
    Beiträge
    3.131
    • 6. November 2008 um 17:44
    • #2

    wo is dein Problem?

    PHP
    if(empty($strErrorMessage))
    {
    
     //send email and check if it was sent
     if(!$mail->Send())
     {
      //$mail->Send() returns FALSE: Error
      echo "The Email could not been sent";
      echo "Error: " . $mail->ErrorInfo;
     }
     else
     {
      //$mail->Send() returns TRUE: Success
      echo "The Email was sent.";
     }
    }
    else 
    {
      echo $strErrorMessage;
    }
    Alles anzeigen


  • sero79
    Schüler
    Beiträge
    71
    • 12. November 2008 um 21:48
    • #3

    Hallo,

    danke jojo, ich habe mal folgendes probiert:

    Code
    //Klasse einbinden
     require('phpmailer/class.phpmailer.php');
     
     $strErrorMessage = CheckForm( $name, $email );
     echo $strErrorMessage;
     include 'email_form.html';
     
    function CheckForm( $name, $email )
    {     
     if(empty($name) and empty($email))
     {
      $strErrorMessage = "Ich brauche Name und Email ... <br />";
     }
     elseif(empty($name))
     {
      $strErrorMessage = "Name bitte ... <br />";
     }
     elseif(empty($email))
     {
      $strErrorMessage = "Email bitte... <br />";
     }
     else 
     {
      $mail = new PHPMailer();
     
      $name = $_POST['name']; 
      $email = $_POST['email']; //Absender email
      $subject = $_POST['subject'];
      $message = $_POST['message'];
     
      $myEmail = 'meine@Email.de';
     
      //Absenderadresse der Email setzen
      $mail->From = $email;
     
      //Name des Abenders setzen
      $mail->FromName = $name;
     
      //Empfängeradresse setzen
      $mail->AddAddress($myEmail);
     
      //Betreff der Email setzen
      $mail->Subject = $subject;
     
      //Text der EMail setzen
      $mail->Body = $message;
     
      //send email and check if it was sent
      if(!$mail->Send())
      {
       //$mail->Send() returns FALSE: Error
       $strErrorMessage = "Die Mail konnte nicht gesendet werden! Error: " . $mail->ErrorInfo;
      }
      else
      {
       //$mail->Send() returns TRUE: Success
       $strErrorMessage = "Die Mail wurde gesendet.";
      }
     
     } 
     return $strErrorMessage; 
    }
    Alles anzeigen



    Testen kann man hier: http://www.sebastianrost.de/test/email_form.html

    Eine Sache stört mich aber, warum verlangt die if(!$mail->Send()) Schleife, dass ich alle Variablen in die CheckForm Funktion hineinbringen muss. Diese Variablen meine ich:

    Code
    $mail = new PHPMailer();
     
      $name = $_POST['name']; 
      $email = $_POST['email']; //Absender email
      $subject = $_POST['subject'];
      $message = $_POST['message'];
     
      $myEmail = [COLOR=#0066cc]'meine@Email.de'[/COLOR];
     
      //Absenderadresse der Email setzen
      $mail->From = $email;
     
      //Name des Abenders setzen
      $mail->FromName = $name;
     
      //Empfängeradresse setzen
      $mail->AddAddress($myEmail);
     
      //Betreff der Email setzen
      $mail->Subject = $subject;
     
      //Text der EMail setzen
      $mail->Body = $message;
    Alles anzeigen


    Wäre es nicht besser die stünden außerhalb der Funktion, so dass ich diese für weitere Funktionen nutzen könnte. Diese Variablen sind doch jetzt nur innerhalb der Funktion ansprechbar, oder?

    Danke
    Sero

  • Bandit
    Gast
    • 12. November 2008 um 21:59
    • #4

    Ich möchte dir jetzt keine fertige Lösung posten, sondern mal ein paar Denkanstöße geben.

    1. Du hast eine Funktion CheckForm, gut
    2. Was macht die Funktion?
    3. Überlege, was man bei CheckForm erwartet.

  • sero79
    Schüler
    Beiträge
    71
    • 13. November 2008 um 10:41
    • #5

    Also CheckForm überprüft ob die Pflichtfelder ausgefüllt sind oder nicht. Falls alle Pflichtangaben eingegeben wurden, wird die email versendet mit Hilfe des PHPMailer.
    Diese Variablen stehen innerhalb von CheckForm:

    Code
    $name = $_POST['name']; 
      $email = $_POST['email']; //Absender email
      $subject = $_POST['subject'];
      $message = $_POST['message'];
     
      $myEmail = 'meine@Email.de';


    Setze ich diesen Block an den Anfang meiner php (außerhalb von CheckForm) findet send() nicht die Variablen und die mail wird leer versendet.
    Schlecht ist jetzt, dass diese Variablen außerhalb von CheckForm nicht ansprechbar sind (z.B. über echo $email; etc.) und somit für weitere functionen unbrauchbar sind.
    Kannst du mir noch mal einen weiteren Tip geben.

  • Bandit
    Gast
    • 13. November 2008 um 10:57
    • #6
    Zitat von sero79

    Also CheckForm überprüft ob die Pflichtfelder ausgefüllt sind oder nicht.


    Genau richtig.

    Zitat von sero79


    Falls alle Pflichtangaben eingegeben wurden, wird die email versendet mit Hilfe des PHPMailer.


    Und das ist der Fehler! CheckForm sollte eben nicht die eMail senden, sondern nur prüfen. Wenn du diese Funktion mal ohne Mail-Versand brauchst, fängst du wieder an zu stricken. Also den ganzen Kram mit dem phpMailer aus der Funktion rausnehmen und in eine weitere Funktion packen.

  • sero79
    Schüler
    Beiträge
    71
    • 13. November 2008 um 11:36
    • #7

    Also habe folgendes gemacht:

    Code
    //Klasse einbinden
     require('phpmailer/class.phpmailer.php');
     
     $name = $_POST['name']; 
     $email = $_POST['email'];
     $subject = $_POST['subject'];
     $message = $_POST['message'];  
     
     echo "<br>". $name ."<br>". $email ."<br>". $subject ."<br>". $message ."<br>". $strErrorMessage ."<br>";
     
     
     $myEmail = 'meine@Email.de';
     
     //Absenderadresse der Email setzen
     $mail->From = $email;
     
     //Name des Abenders setzen
     $mail->FromName = $name;
     
     //Empfängeradresse setzen
     $mail->AddAddress($myEmail);
     
     //Betreff der Email setzen
     $mail->Subject = $subject;
     
     //Text der EMail setzen
     $mail->Body = $message;
     
     $strErrorMessage = CheckForm( $name, $email );
     echo $strErrorMessage;
     include 'email_form.html';
     
    function CheckForm( $name, $email )
    {     
     if(empty($name) and empty($email))
     {
      $strErrorMessage = "Ich brauche Name und Email ... <br />";
     }
     elseif(empty($name))
     {
      $strErrorMessage = "Name bitte ... <br />";
     }
     elseif(empty($email))
     {
      $strErrorMessage = "Email bitte... <br />";
     }
     else 
     {
      $strErrorMessage = SendEmail( $mail );  
     } 
     return $strErrorMessage; 
    }
    function SendEmail( $mail )
    {
     //send email and check if it was sent
     if(!$mail->Send())
     {
      //$mail->Send() returns FALSE: Error
      $strErrorMessage = "The Email could not been sent! Error: " . $mail->ErrorInfo;
     }
     else
     {
      //$mail->Send() returns TRUE: Success
      $strErrorMessage = "The Email was sent.";
     }
     return $strErrorMessage; 
    }
    Alles anzeigen



    Ich habe eine neue Function erstellt SendEmail und das Erbenis in die $strErrorMessage gepackt dann rufe ich $strErrorMessage = SendEmail( $mail ); in CheckForm wieder auf.
    Klappt aber wiederrum nicht da mail->Send() die Variablen nicht findet. Wenn ich alle Variablen in die SendEmail verschiebe gehts wieder, aber stehe ich ja wieder am Anfang! Hast du noch ne Idee wie ich die Variablen außerhalb der Funktionen belassen kann, aber trotzdem in die Funktionen überführen kann.
    Danke

  • Bandit
    Gast
    • 13. November 2008 um 12:04
    • #8

    Ein wenig mitdenken wäre nicht schlecht. Ungetestet:

    PHP
    <?php
    
      $strErrorMessage = CheckForm($_POST['name'], $_POST['email']);
     
     if (strlen($strErrorMessage))
     {
        echo $strErrorMessage;
     }
     else
     {
        $strErrorMessage = SendMail($_POST['name'], $_POST['email'], $_POST['subject'], $_POST['message']);
    
        if (strlen($strErrorMessage))
        {
           echo $strErrorMessage;
        }
        else
        {
           echo "Mail sent";
        }    
     } 
     
    //------------------------------------------------------------------ 
    function CheckForm( $name, $email )
    {
      $strErrorMessage = "";
    
      if(empty($name) and empty($email))
      {
         $strErrorMessage = "Ich brauche Name und Email ... <br />";
      }
      elseif(empty($name))
      {
         $strErrorMessage = "Name bitte ... <br />";
      }
      elseif(empty($email))
      {
        $strErrorMessage = "Email bitte... <br />";
      }
    
    
      return $strErrorMessage; 
    }
    
    
    //------------------------------------------------------------------
    function SendEmail($name, $mail, $subject, $message )
    {
       $strErrorMessage = "";
    
       //Klasse einbinden
       require('phpmailer/class.phpmailer.php');
    
       $mail = new phpMailer():
    
    
       $myEmail = 'meine@Email.de';
     
       //Absenderadresse der Email setzen
       $mail->From = $email;
     
       //Name des Abenders setzen
       $mail->FromName = $name;
     
       //Empfängeradresse setzen
       $mail->AddAddress($myEmail);
     
       //Betreff der Email setzen
       $mail->Subject = $subject;
     
       //Text der EMail setzen
       $mail->Body = $message;
     
       include 'email_form.html';
    
    
       //send email and check if it was sent
       if(!$mail->Send())
       {
         //$mail->Send() returns FALSE: Error
         $strErrorMessage = "The Email could not been sent! Error: " . $mail->ErrorInfo;
       }
    
    
       return $strErrorMessage; 
    }
    Alles anzeigen


    Ich würde allerdings auch noch die anderen Felder prüfen, sonst macht das keinen Sinn.

    Einmal editiert, zuletzt von bandit600 (13. November 2008 um 12:07)

  • sero79
    Schüler
    Beiträge
    71
    • 13. November 2008 um 15:21
    • #9

    vielen Dank, es funktioniert!
    Sorry, aber ich bin noch in der PHP Lernphase und mir ist noch nicht alles bekannt. Damit es aber beim nächsten mal besser klappt habe ich noch ein Paar Fragen (für den Lerneffekt :-)):

    • Warum übergibts du die Form varibles nicht in php varibles, wie z.B. so
      PHP
      $name = $_POST['name'];

      gibt es da einen bestimmten Grund?

    • Welche Rolle spielt dieser Ausdruck in beiden Functions.
      PHP
      $strErrorMessage = "";

      Ich weiss was es bedeutet aber wozu wird es benötigt?.

    • zur strlen function: wenn $strErrorMessage einen Wert besitzt (nicht leer ist), dann wird die Errormessage angezeigt (z.B. der Name fehlt). Eine leere Errormessage (empty string ist 0 / ist er auch False?) bewirkt, dass die else Schleife weiter ausgewertet wird. Ist das so richtig erklärt?

    Gruß Sero

  • Bandit
    Gast
    • 13. November 2008 um 21:57
    • #10

    Zu 1. Warum umschreiben? Den Wert hast du im Post-Array, das reicht doch.
    Zu 2. PHP ist relativ schlampig, was die Initialisierung von Variablen angeht. Es ist einfach besser, wenn man einen definierten Wert hat. Ich habe deine Variablennamen einfach übernommen, normalerweise heißt bei mir die Returnvariable $result. Es macht auch deshalb Sinn, wenn man ein true/false von einer Funktion erwartet. Dann initialisiere ich $result mit false und wenn alles OK ist, wird $result zu true. Das ist einfach saubereres Programmieren.
    Zu 3. Das ist auch so eine Sache. Wenn du mit "echten" Programmiersprachen arbeitest, dann gibt einen definierten Rückgabewert. Entweder bool, int, string, etc. PHP ist da leider nicht so pingelig, trotzdem meide ich solche Zwitter, das trägt auch zur Lesbarkeit bei.

  • sero79
    Schüler
    Beiträge
    71
    • 14. November 2008 um 18:53
    • #11

    noch mal vielen Dank für deine ausführliche Erklärung.

    Ich habe noch ein weiteres Problemchen:
    Mein Kontakt-Formular gibt es in 2 Sprachen und es liegen 2 Kontaktdateien vor. Beide Dateien rufen email_form.php, welche das Formular verabeitet und die email versendet.
    In der email_form.php müssten nun logischerweise die Fehlermeldungen 2 sprachig vorliegen.
    Wie wäre denn hier der Lösungsansatz?
    Ich würde denken, man müsste dem Formular eine id gebne (id=deutsch und id=englisch) und in der email_form.php müsste eine if Schleife auswerten wenn Id=deutsch/englisch dann verwende die Fehlermeldung in deutsch/englisch.
    Wie übergebe ich den die id?

    Danke und schönes WE
    Sero

  • Bandit
    Gast
    • 14. November 2008 um 20:47
    • #12

    Wie wird denn bei dir die Sprache festgelegt? Idealerweise hält man sich die Sprache in einem Cookie oder in einer Session, dann kommt man jederzeit an den Wert und muss keine Parameter weiterreichen.

  • sero79
    Schüler
    Beiträge
    71
    • 15. November 2008 um 12:29
    • #13

    Also die Sprachauswahl erfolgt über einen simplen Link auf meiner Website. Die html liegen dabei 2 fach vor, zum einen gibt es eine kontakt.html im html Ordner und zum anderen gibt es eine kontakt.html im html_eng Ordner. Beide rufen die kontakt_form.php zum verarbeiten des Formulars auf.
    Leider habe ich mit Cookies und Sessions noch keine Erfahrung? Kannst du mir vielleicht ein Tutorial diesbezüglich empfehlen.
    Danke

  • Bandit
    Gast
    • 15. November 2008 um 13:29
    • #14
    Zitat

    Die html liegen dabei 2 fach vor


    AUA!!! Wieso das denn? Sobald du eine Änderung am Layout machen willst, machst du dann ja alles doppelt.

    http://www.php.net/manual/de
    http://www.php-faq.de
    http://www.php-einfach.de
    http://www.schattenbaum.net/php/ (leider etwas veraltet)
    http://www.galileocomputing.de/openbook/php4 (leider etwas veraltet)
    http://tut.php-q.net/index.html
    http://dev.mysql.com/doc/refman/5.1/de/index.html
    http://ffm.junetz.de/members/reeg/DSP/
    http://www.phptutorials.de
    http://www.dynamic-webpages.de/05.tutorials.php
    http://de.selfhtml.org/
    http://www.css4you.de/index.html

  • sero79
    Schüler
    Beiträge
    71
    • 16. November 2008 um 10:50
    • #15

    Ich weiss, dass ist nicht besonders klug, aber mir fehlten bisweilen die php Kenntnisse. Beim nächsten Projekt wird das natürlich anders gemacht!

  • Unregistriert
    Gast
    • 1. Dezember 2008 um 16:44
    • #16

    Hab mal ne Frage kenn irgendeiner von euch eine Seite, in deren man Formular - Email senden kann! <nur HTML Bitte>

    Die auch das unterstützen:
    <input type="hidden" name="env_report" value="REMOTE_ADDR,HTTP_USER_AGENT,REMOTE_HOST,HTTP_REFERER">

    und

    <input type="hidden" name="subject" value="Betreff">

    nur ein Server also:
    <form method="POST" action="HIER DER SERVER">

Tags

  • hilfe
  • html
  • server
  • email
  • http
  • klasse
  • body
  • text
  • post
  • funktion
  • problem
  • input
  • php
  • fehler
  • formular
  • empty
  • report
  • include
  • action
  • variable
  • value
  • agent
  • referer
  • hidden
  • pflichtfelder
  • remote

Benutzer online in diesem Thema

  • 1 Besucher
  1. Datenschutzerklärung
  2. Impressum
Community-Software: WoltLab Suite™
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
Zitat speichern