• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Bitte um Durchsicht!

philogyn

Mitglied
Hallo!

Bin als Laie zum "Webmaster" meiner Schule "ernannt" worden und habe eigentlich soweit alles gut gemeistert.
Bis dato funktionierte auch das Kontaktformular ohne Probleme; gestern sprach mich mein Vorgesetzer darauf an, dass keine Mails mehr die Schule via dem Formular auf der HP erreichen.
Da ich das ganze Script aber auch nur aus anderen Scripten zusammen"gebaut" habe, bitte ich euch um Durchsicht und vielleicht Ver- bzw. Ausbesserungen im Code, so dass es dann auch wieder funktioniert!

Danke und LG
PHP:
<?php 

header( 'Content-Type: text/html; charset=utf-8' ); 

// Empfänger Email 
$empfaenger = '[email protected]'; 

// Prüfen ob das Formular abgeschickt wurde 
if (isset($_POST['senden'])) 
{ 
    // Funktionen einbinden 
    include( 'funktionen.inc.php' ); 
     
    // Benutzereingaben bereinigen und auf Injection prüfen 
    cleanInput(); 
     
    // Name prüfen 
    $name = checkName( $_POST['name'] ); 
    // Email prüfen 
    $email = checkEmail( $_POST['email'] ); 
    // Betreff und Nachricht prüfen 
    if ((strlen( $_POST['betreff'] ) < 5) || (strlen( $_POST['nachricht'] ) < 5)) 
    { 
        die( 'Bitte füllen Sie alle Felder aus!' ); 
    } 
    else 
    { 
        $betreff   = $_POST['betreff']; 
        $nachricht = $_POST['nachricht']; 
    } 
     
    // -------------------------------------------------------------------------------- 
    // Wurde das Script bisher nicht abgebrochen, wurde das Formular korrekt ausgefüllt 
    // -------------------------------------------------------------------------------- 
     
    // Template mit dem Mailbody laden und für den Versand vorbereiten 
    $mailbody = file_get_contents( 'mailbody.txt' ); 
    // Platzhalter mit den Benutzereingaben ersetzen 
    $mailbody = str_replace( '###NAME###', htmlspecialchars( $name ), $mailbody ); 
    $mailbody = str_replace( '###EMAIL###', $email, $mailbody ); 
    $mailbody = str_replace( '###NACHRICHT###', nl2br( htmlspecialchars( $nachricht ) ), $mailbody ); 
     
    // Mail Header erstellen 
    $mailheader  = "From: HP Kontaktformuar<noreply@" .$_SERVER['SERVER_NAME']. ">\r\n"; 
    $mailheader .= "Reply-To: " .$name. "<" .$email. ">\r\n"; 
    $mailheader .= "Return-Path: noreply@" .$_SERVER['SERVER_NAME']. "\r\n"; 
    $mailheader .= "MIME-Version: 1.0\r\n"; 
    $mailheader .= "Content-Type: text/html; charset=UTF-8\r\n"; 
    $mailheader .= "Content-Transfer-Encoding: 8bit\r\n"; 
    $mailheader .= "Message-ID: <" .time(). " noreply@" .$_SERVER['SERVER_NAME']. ">\r\n"; 
    $mailheader .= "X-Mailer: PHP v" .phpversion(). "\r\n\r\n"; 
     
    // Email versenden 
    if (@mail( $empfaenger , htmlspecialchars( $betreff ), $mailbody, $mailheader )) 
    { 
        // Bei erfolgreichem Versand Danke-Seite anzeigen 
        echo Danke, Ihre Nachricht wurde verschickt!rn Die Administration der ...; 
    } 
} 

?>

PHP:
<?php 

header( 'Content-Type: text/html; charset=utf-8' ); 

// Benutzereingabe bereinigen (trimmen, Slashes entfernen) 
function cleanInput() 
{ 
    checkInjection(); 
    if (get_magic_quotes_gpc()) $_POST = array_map( 'stripslashes', $_POST ); 
    $_POST = array_map( 'trim', $_POST ); 
} 


// Name auf Gültigkeit prüfen 
function checkName( $name ) 
{ 
    $muster_name = '/^([a-zA-ZäÄöÖüÜß\xc0-\xc2\xc8-\xcf\xd2-\xd4\xd9-\xdb\xe0-\xe2\xe8-\xef\xf2-\xf4\xf9-\xfb\x9f\xff\.\'\-_]?(\s)?)+$/'; 
    if (preg_match( $muster_name, $name )) 
    { 
        return $name; 
    } 
    else 
    { 
        die( 'Der eingegebene Name enthält nicht erlaubte Zeichen!' ); 
    } 
} 


// Email auf korrektes Format prüfen 
function checkEmail( $email ) 
{ 
    $nonascii      = "\x80-\xff";     
    $nqtext        = "[^\\\\$nonascii\015\012\"]"; 
    $qchar         = "\\\\[^$nonascii]"; 
    $normuser      = '[a-zA-Z0-9][a-zA-Z0-9_.-]*'; 
    $quotedstring  = "\"(?:$nqtext|$qchar)+\""; 
    $user_part     = "(?:$normuser|$quotedstring)"; 
    $dom_mainpart  = '[a-zA-Z0-9][a-zA-Z0-9._-]*\\.'; 
    $dom_subpart   = '(?:[a-zA-Z0-9][a-zA-Z0-9._-]*\\.)*'; 
    $dom_tldpart   = '[a-zA-Z]{2,5}'; 
    $domain_part   = "$dom_subpart$dom_mainpart$dom_tldpart"; 
    $pattern       = "$user_part\@$domain_part"; 
    $muster_email  = "/^{$pattern}$/"; 
    if (preg_match( $muster_email, $email )) 
    { 
        return $email; 
    } 
    else 
    { 
        die( 'Die eingegebene Email-Adresse hat kein gültiges Format!' ); 
    } 
} 


// Benutzereingaben auf mögliche Injection prüfen 
function checkInjection() 
{ 
    $email_injection = array( 'bcc:', 'boundary', 'cc:', 'content-transfer-encoding:', 'content-type:', 'mime-version:', 'subject:' ); 

    // Auf potentielle Email Injections prüfen 
    foreach ($email_injection as $injection) 
    { 
        foreach ($_POST as $feld => $inhalt) 
        { 
            if (preg_match( "/{$injection}/i", $inhalt )) 
            { 
                header( 'location: http://www.google.com/search?hl=en&q=how+to+become+a+better+hacker' ); 
                exit; 
            } 
        } 
    } 
    return true; 
} 

?>
 
Werbung:
Das ganze kann viele Ursachen haben, muss noch nicht mal am Script liegen. Um mal komplett auszuschließen das die mail Funktion fehlschlägt, mache mal folgendes:

Entferne mal bei
PHP:
if (@mail( $empfaenger , htmlspecialchars( $betreff ), $mailbody, $mailheader ))

das '@' vor mail. Somit werden Fehler angezeigt die beim Mailversand auftreten. Anschließend schreib mal eine Testmail und schau ob Fehler angezeigt werden, wird die Mail korrekt versendet, liegts entweder am restlichen Script (was etwas merkwürdig wäre wenn es bisher funktioniert hat) oder am Server bzw. den Serverkonfigurationen.
 
Werbung:
Hallo Philogyn,
dein PHP Code sieht gut aus, allerdings fehlt mir da noch der else{} Zweig zum Anzeigen des Formulars.

PHP:
if (isset($_POST['senden'])) 
{ ... }

else{
   //  Formular Anzeigen
}
Weiterhin ist es gut zu prüfen ob die Datei mit den Prüffunktionen richtig eingebunden wird. Allgemein bevorzuge ich die Dateien über die include_once(); einzubinden, da diese Funktion prüft ob die Datei bereits eingebunden wurde oder nicht, also keine Doppeleinbindungen.

Und als letztes, wie Rayse schon gesagt hat, einfach nur deine mail(); Funktion mit statischen Daten futtern und den Versand checken. Es kann ja sein das der Empfänger Probleme mit Mails hat, dan liegt es gar nicht an dir.
Ah ja, und Konstanten wie:
PHP:
// Empfänger Email 
$empfaenger = '[email protected]';
Sollten als Konstanten definiert werden, damit die im weiteren Codeverlauf nicht zufälligerweise irgendwo überschrieben werden, also:
PHP:
// Empfänger Email
define('EMPFAENGER','[email protected]');
...
// Email versenden 
    if (@mail(EMPFAENGER, htmlspecialchars( $betreff ), $mailbody, $mailheader )) 
    { 
        // Bei erfolgreichem Versand Danke-Seite anzeigen 
        echo Danke, Ihre Nachricht wurde verschickt!rn Die Administration der ...; 
    }
Die Konstanten werden ohne $-Zeichen definiert, und üblicherweise in Großbuchstaben geschrieben.
Viel Erfolg!
PORTAL
 
Hallo!

Hab mir nun von WebDesign - Tips und Tricks: universeller Formmailer das Script zum Kontaktformular kopiert und meinen Ansprüchen angepasst, leider ohne Erhalt einer Testnachricht...

Kennt sich damit wer aus? Brauch ja wirklich nur dieses eine Kontaktformular, jede weitere Verwendung von php schließ ich aus *ggg*

PHP:
<?php
define ('MAILTO', "[email protected]"); // Empfänger hier eintragen
define ('MAILFROM', "Kontaktformular der Schulhomepage"); // ggfls. Absender hier eintragen
define ('CHARSET', "ISO-8859-15"); // Zeichenkodierung ggfls. anpassen
$Pflichtfelder = array('Nachricht', 'eMail'); // ggfls. weitere Pflichtfelder angeben


$AddHeader = 'Content-Type: text/plain; charset='.CHARSET;
if(MAILFROM) $AddHeader .= chr(13).chr(10).'From: '.MAILFROM;

if($Formular_abgeschickt = !empty($_POST)) {
  $Formular_leer = true; set_magic_quotes_runtime(0);
  $_POST = array_map('Formular_Daten', $_POST);
}

function Formular_Daten($val) {
  global $Formular_leer;
  if(is_array($val)) return array_map('Formular_Daten', $val);
  if(get_magic_quotes_gpc()) $val = stripslashes($val);
  if($val = trim($val)) $Formular_leer = false;
  return $val;
}

function Formular_Pflichtfelder() {
  global $Pflichtfelder;
  $Fehler = '';
  foreach ($Pflichtfelder as $Feld) {
    $key = str_replace(' ','_',$Feld);
    if(!(isset($_POST[$key]) && trim($_POST[$key])!=='')) {
      if($Fehler) $Fehler .= '<br />';
      $Fehler .= 'Sie haben das Pflichtfeld "' . $Feld . '" nicht ausgefüllt!';
    }
  }
  return $Fehler;
}

function Formular_neu($log='.htPOSTdata.txt') {
  if(file_exists($log) && is_readable($log)
   && file_get_contents($log) == print_r($_POST,true))
  return false;
  if($handle=@fopen($log, 'w')) {
    fwrite($handle, print_r($_POST,true)); fclose($handle);
  }
  return true;
}

function Formular_Check() {
  global $Formular_leer;
  if($Formular_leer) $Fehler = 'Sie haben keine Daten eingetragen. Bitte f&uuml;llen Sie das Formular aus!';
  elseif(!$Fehler = Formular_Pflichtfelder()) {
      if(!checkEmail($_POST['eMail'])) $Fehler = 'Ihre E-Mail Eingabe war leider fehlerhaft. Bitte &uuml;berpr&uuml;fen!';
    else
    if(!Formular_neu()) $Fehler = 'Ihre Nachricht ist bereits verschickt worden!';
  }
  return $Fehler;
}


function checkEmail($adr) {
  $regEx = '^([^\s@,:"<>]+)@([^\s@,:"<>]+\.[^\s@,:"<>.\d]{2,}|(\d{1,3}\.){3}\d{1,3})$';
  return (preg_match("/$regEx/",$adr,$part)) ? $part : false;
}


function Formular_Eingabe($Feldname, $def='') {
  if(isset($_POST[$Feldname]) && $_POST[$Feldname]!=='')
    echo htmlspecialchars($_POST[$Feldname]);
  else echo $def;
}

?>


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<link type="text/css" href="formate.css" rel="stylesheet" media="screen" />

<title>Hasnerschule</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />


</head>
<body>
<div id="container">

    <!-- anfang banner -->
    <div id="banner" >
        <table width="auto" border="0" cellpadding="0" cellspacing="0">
            <tr><td><img src="pics/logo _nms_ ohne_kleiner.jpg" width="120" height="120" alt="logo" /></td>
            <td><object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase=
                        "http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=7,0,19,0" width="750" height="120" title="FlashBanner">
                        <param name="movie" value="flash/banner.swf" />
                        <param name="quality" value="high" />
                        <embed src="flash/banner.swf" quality="high" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" 
                        width="750" height="120"></embed>
                        </object></td>
            <td><img src="pics/logo-moodle1.jpg" width="119" height="120" alt="logomoodle" /></td></tr>

    </table>
    </div>
    
    <!-- ende banner -->
    
        <div id="mainnavi" >
        <a href="index.php">Home </a>| <a href="schulprofil.php">Schulprofil</a> |  <a href="direktion.php">Direktion</a> |  <a href="aktuelles.php">Termine</a> | 
        <a href="lehrerinnen.php">LehrerInnen</a> | <a href="klassen.php">Klassen</a> | <a href="kontakt.php">Kontakt </a>
    </div>
    
    <!-- ende mainnavi -->
    
    <div id="left">
    <h2>Navigation</h2>
        <?php include("navi.php"); ?>
        
    </div> 
    
    <!-- ende linkes menü -->

    
    <div id="right">

        <div id="news">News:</div>
            <?php include("news.php"); ?>
    </div> 
    
    <!-- ende rechtes men&uuml; -->
    
    <div id="content">

        <h1>Kontaktformular</h1>
        <div id="text">
<!--            <span style="font-size:12x">Wenn Sie mit unserer Schule Kontakt aufnehmen wollen, nutzen Sie bitte hierf&uuml;r das folgende Kontaktformular! &nbsp;<i style="font-size:10px">(Es m&uuml;ssen ALLE Felder ausgef&uuml;llt werden!)</i>
            </span>    
    -->        
            <?php
if($Formular_abgeschickt) {
  if($Formular_Fehler = Formular_Check())
    echo '<p class="Meldung" id="Fehler">',$Formular_Fehler,'</p>';
  elseif(@mail(MAILTO, "Nachricht", print_r($_POST,true), $AddHeader))
    echo '<p class="Meldung" id="OK">Herzlichen Dank, Ihre Nachricht wurde verschickt.</p>';
  else echo '<p class="Meldung" id="Fehler">Server-Fehler !</p>';
}
?>
<p>
<form action="<?php echo $_SERVER['SCRIPT_NAME']; ?>" method="post"
 enctype="multipart/form-data" accept-charset="<?php echo CHARSET; ?>">
 
    <p>
      <label for="Name">Ihr Name:</label><br />
      <input name="Name" id="Name" size="50"
       value="<?php Formular_Eingabe('Name'); ?>" />
    </p>
    <p>
      <label for="eMail">Ihre E-Mail:</label><br />
      <input name="eMail" id="eMail" size="50"
      value="<?php Formular_Eingabe('eMail'); ?>" />
    </p>
    <p>
      <label for="Nachricht">Ihre Nachricht:</label><br />
      <textarea name="Nachricht" id="Nachricht" rows="5" cols="50"><?php
       Formular_Eingabe('Nachricht'); ?></textarea>
    </p>
    
    <p><input type="submit" value="Absenden" /></p>
 
</form>
</p>

</body>
</html>

Danke und LG
 
Hast Du es lokal bei dir auf dem Rechner versucht? Gab es Fehlermeldungen? Wenn nein, lass mal das @ in "elseif(@mail(" weg. Was sagt der error-Log vom Server?
 
Werbung:
Guten Morgen!

Nein, das Script wurde bereits vom vorhandenen Server aus getestet, KEINE Fehlermeldungen! Werde heut Nachmittag mal das ganze ohne dem "@" Zeichen versuchen, vielleicht wird das Problem dadurch gefunden?!

LG und Danke

P.S.: Hoffe dass das Script sonst soweit in Ordnung ist?
 
Hängt von deiner Definition von „in Ordnung“ ab. Die Funktionsnamen ergeben keinen besonders großen Sinn, die Einrückung/den Stil allgemein finde ich unübersichtlich, globale Variablen sollten nach Möglichkeit nicht genutzt werden, generell ist statt der mail-Funktion der Einsatz spezieller Mailerklassen (Zend_Mail, Swift, PHPMailer) zu empfehlen. Aber rein „funktional” scheint es mir okay zu sein.

Tipps zum Auffinden von Fehlern:

- Debugging:Leitfaden - PHP.de Wiki
 
Zurück
Oben