+ Antworten
Seite 1 von 5 1 2 3 4 ... LetzteLetzte
Ergebnis 1 bis 15 von 65

Thema: Emails mit PHP verschicken

  1. #1
    TP-Specialist phpBuddy ist einer der Eckpfeiler des TP - ohne ihn geht nichts phpBuddy ist einer der Eckpfeiler des TP - ohne ihn geht nichts phpBuddy ist einer der Eckpfeiler des TP - ohne ihn geht nichts phpBuddy ist einer der Eckpfeiler des TP - ohne ihn geht nichts phpBuddy ist einer der Eckpfeiler des TP - ohne ihn geht nichts phpBuddy ist einer der Eckpfeiler des TP - ohne ihn geht nichts phpBuddy ist einer der Eckpfeiler des TP - ohne ihn geht nichts phpBuddy ist einer der Eckpfeiler des TP - ohne ihn geht nichts phpBuddy ist einer der Eckpfeiler des TP - ohne ihn geht nichts phpBuddy ist einer der Eckpfeiler des TP - ohne ihn geht nichts phpBuddy ist einer der Eckpfeiler des TP - ohne ihn geht nichts Avatar von phpBuddy
    Registriert seit
    Aug 2004
    Ort
    Kaiserslautern
    Beiträge
    4.678

    Emails mit PHP verschicken

    Vorwort
    Nach kaum einem Thema wird so häufig gefragt, wie nach dem versenden von Formularinhalte via Email. Und weil es ja erst sooo wenige Tutorials dazu gibt, möchte ich hiermit Tutorial "Email via PHP" Nummer 382.744 auf den Markt werfen.

    Im Gegensatz zu vielen anderen Tutorials dieser Art möchte ich aber nicht jede grundlegende PHP-Funktion bis in's Kleinste erklären, sondern ich möchte viel eher zeigen, wie man verschiedene Arten von Emails mit PHP verschicken kann.



    Inhalt dieses Tutorials
    Vorgestellt wird die Funktionsweise verschiedener, einfacher Möglichkeiten. Im einzelnen sind das:
    • Templatebasierte Email als reiner Text
    • Templatebasierte Email als HTML
    • Templatebasierte Email als HTML mit Dateianhang
    • Bei erfolgreichem Versand eine zusätzliche Email an den Absender als Empfangsbestätigung
    Um es einfach und übersichtlich zu halten, wurden die verschiedenen Formmailer in mehrere Dateien aufgeteilt. Ebenso wird nicht auf eine ausgetüftelte Art auf Fehleingaben reagiert, sondern es wird schlicht die Ausführung des Scripts abgebrochen. Schließlich geht es bei dem Tutorial um's Email senden und nicht um "Wie reagiere ich richtig auf Fehler". Ebenso sind keine Reloadsperren oder ähnliches eingebaut.

    Wichtig:
    Wie üblich wird das ohnehin wieder ignoriert, aber so kann ich wenigstens ruhigen Gewissens nachts schlafen. Das Nachfolgende ist ein Tutorial, dass einem die Funktionsweise eines Formmailers näher bringen soll. Es ist kein fertiges Script das man 1:1 so auf seine Seite übernehmen sollte. Wie im letzten Absatz erwähnt, wurden aus Gründen der Übersichtlichkeit wichtige Schutzmechanismen nicht eingebaut. Wer sich das Script also unverändert auf seine Seite lädt, handelt auf eigenes Riskio! Der Autor ist für eventuell entstehende Schäden/Probleme nicht haftbar zu machen!



    Voraussetzungen
    Da ich in diesem Tutorial nicht ausführlich auf alle Bereiche eingehen werde, sind folgende Voraussetzungen unabdingbar:
    • PHP Grundkenntnisse
      • Fundierte Kenntnisse im Umgang mit Formulare
      • Grundkenntnisse bis fundierte Kenntnisse beim validieren von Benutzereingaben (RegEx)
    • HTML Grundkenntnisse
    • Lernbereitschaft und "common sense"

    Wer Probleme beim Umgang mit Formulare hat, sollte sich zunächst dieses Wissen mit diesem 3-teiligen Tutorial aneignen. (Teil 1, Teil 2, Teil 3)


    ... Los geht's


    Gemeinsam benutzte Funktionen
    Da die verschiedenen Formmailer viele Gemeinsamkeiten aufweisen, werde ich zunächst einmal auf diese eingehen. Sobald abweichende oder zusätzliche Funktionen für einen Mailer benötigt werden, werde ich diese im entsprechenden Abschnitt erwähnen.
    Was alle vorgestellten Formmailer gemeinsam haben sind:
    Das HTML Formular (*) und die Validierungen der Benutzereingaben. Ebenso sind große Abschnitte des PHP Code und des Mail-Headers von Text-Mail und HTML-Mail identisch.

    (*) = Der Mailer mit dem Anhang erfordert natürlich ein Upload-Feld und einen anderen enctype. Auf das Listing dazu verzichte ich aus Platzgründen, weil das jedem klar sein sollte. Das Listing ist aber im Download zum Tutorial enthalten.


    Das Listing der Datei formular.htm:
    HTML-Code:
    <!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" xml:lang="de" lang="de">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>Text Email</title>
    </head>
    
    <body>
    <form action="mail.php" method="post" name="textmail">
    Name: <input type="text" name="name" id="name" /><br />
    Email: <input type="text" name="email" id="email" /><br />
    Betreff: <input type="text" name="betreff" id="betreff" /><br />
    Nachricht: <textarea name="nachricht" id="nachricht" cols="20" rows="2"></textarea><br />
    <input name="senden" id="senden" type="submit" value="Formular senden" />
    </form>
    </body>
    </html>
    Dazu gibt es nichts zu sagen. Es ist ein simples Formular, bestehend aus 4 Feldern, ohne Formatierungen oder sonstiges.


    Das Listing der Datei funktionen.inc.php:
    PHP-Code:
    <?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;
    }

    ?>
    Auch hier ist nichts spektakuläres auszumachen. Diese Funktionen werden später von jedem Mail Script aufgerufen und dienen dem validieren der Benutzereingaben.
    Die Funktion cleanInput() entfernt eventuelle Maskierungen, die durch Magic Quotes vom Server hinzugefügt worden sind. Ebenso werden unnötige Leerzeichen entfernt. Desweiteren wird die Funktion checkInjection() aufgerufen. Diese Prüft alle Felder auf potentiell gefährliche Eingaben, die zum versenden von Massenmail (Spam) missbraucht werden könnten.
    Die Funktion checkName() prüft, ob nur erlaubte Zeichen eingegeben wurden, die einem Namen entsprechen. Das sind in unserem Fall alle deutschen und französichen Buchstaben, sowie einige Zeichen die in einem Namen vorkommen könnten, wie etwa dem Bindestrich bei Doppelnamen. Neben dem Namen wird auch die eingegebene Email auf ein gültiges Format geprüft, was in checkEmail() statt findet.

    Der Code sollte jedem, der die oben erwähnten Voraussetzungen erfüllt, keine Schwierigkeiten bereiten. Damit sind die gemeinsamen Funktionen geklärt und somit können wir zu den einzelnen Mailern kommen. Auch dort wiederholen sich Code-Abschnitte, die aber zumeinst nur das aufrufen der eben erwähnten Funktionen beinhaltet.



    Einfache Text Email
    Zuerst das Listing unserer Template Datei mailbody.txt:
    Code:
    Soeben ist eine Nachricht von ###NAME### eingetroffen.
    Als Antwortadresse wurde ###EMAIL### angegeben.
    Die Nachricht die gesendet wurde:
    ###NACHRICHT###
    Wie man unschwer erkennt, ist das ganz normaler und schlichter Text. Lediglich die Platzhalter darin fallen auf. Diese Platzhalter korrespondieren in unserem Script mit den Benutzereingaben und werden in unserem Script durch diese ersetzt.
    Dadurch das wir den Text, der später per Email an uns geschickt wird, in einer eigenen Datei ablegen, können wir den Text schnell und flexibel beliebig verändern und erweitern. Da es sich hierbei um einen Mailer handelt der nur reinen Text verschickt, müssen wir auf jegliche Art von Formatierungen verzichten.

    Bisher haben wir das HTML-Formular, die Funktionen und das Mail Template kennengelernt, fehlt nur noch das Hauptscript, dass wir uns gleich mal vorknöpfen.

    Listing der Datei mail.php:
    PHP-Code:
    <?php

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

    // Empfänger Email
    $empfaenger 'max.mustermann@domain.tld';

    // 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###'htmlspecialchars$nachricht ), $mailbody );
        
        
    // Mail Header erstellen
        
    $mailheader  "From: PHP Email Tutorial<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/plain; charset=UTF-8\r\n";
        
    $mailheader .= "Content-Transfer-Encoding: 7bit\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$empfaengerhtmlspecialchars$betreff ), $mailbody$mailheader ))
        {
            
    // Bei erfolgreichem Versand Danke-Seite anzeigen
            
    echo 'Danke, die Email wurde verschickt!';
        }
    }

    ?>
    Das sieht im ersten Moment mehr und wilder aus, als es das eigentlich ist.
    Der obere Teil ist schnell erklärt. Zunächst setzen wir die Email des Empfängers, der idR wir selbst sind. Dann wird geprüft ob das Formular überhaupt abgeschickt wurde und wenn dem so ist, binden wir die benötigten Funktionen ein und überprüfen die Benutzereingaben.

    Mit den Zeilen ...
    PHP-Code:
        // 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###'htmlspecialchars$nachricht ), $mailbody ); 
    ... laden wir das Mail Template (file_get_contents) und ersetzen mit einfachen str_replace Funktionen die Platzhalter. Auch wenn wir bereits auf mögliche Injections geprüft haben, entschärfen wir dennoch die Eingaben mit htmlspecialchars, damit uns niemand etwas unterschiebt. Bei der Email ist das nicht nötig, da diese sonst nicht durch den Filter gekommen wäre.

    Jetzt kommen wir zu dem wichtigsten Teil, der ein erfolgreiches Versenden überhaupt erst möglich macht: dem Mail Header.
    Der Mail Header ist der Kopf der Email, der alle relevanten und wichtigen Informationen über unsere Email enthält. Sehr sehr häufig sieht man in Scripts und Tutorials, dass hier lediglich das "From:" angegeben ist. Wenn nur diese Information angegeben ist, bleibt die Mail sehr häufig in einem Spamfilter hängen. Kein Mensch würde auf die Idee kommen einen echten Brief zu verschicken und als Beschreibung auf dem Brief nur einen Name angeben, ohne komplette Anschrift und Absenderadresse. Wieso dann bei einer Email?!

    Schauen wir uns also an wie ein Header aussieht, der die wichtigsten Angaben enthält:
    PHP-Code:
        $mailheader  "From: PHP Email Tutorial<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/plain; charset=UTF-8\r\n";
        
    $mailheader .= "Content-Transfer-Encoding: 7bit\r\n";
        
    $mailheader .= "Message-ID: <" .time(). " noreply@" .$_SERVER['SERVER_NAME']. ">\r\n";
        
    $mailheader .= "X-Mailer: PHP v" .phpversion(). "\r\n\r\n"
    Die Steuerungzeichen "\r\n" entsprechen einen Wagenrücklauf und Zeilenvorschub oder anders ausgedrückt, ein Zeilenumbruch. Diese Steuerungzeichen sind betriebssystemabhängig und müssen ggfs. angepasst werden. Auf Linux würde man z.B. nur "\n" verwenden. Schauen wir uns nun die anderen angaben an:
    • From - Das ist die Absendeadresse und der dazugehörige Name. Es ist üblich diesen in der Form Name<Email> anzugeben. Das ist die absolute Minimumangabe für inen Mailheader. Fehlt das From, wird der Versand der Mail fehlschlagen.
    • Reply-To - Das Format kann entweder nur eine Email Adresse sein, oder man wählt das Format wir bei From. Dieses Feld ist die Antwortadresse an die die Mail geschickt wird, wenn wir im Mail Client auf antworten klicken.
    • Return-Path - Konnte die Mail nicht zugestellt werden, wird dies an diese Adresse gemeldet.
    • MIME-Version - Entspricht dem MIME Typ der Mail.
    • Content-Type - Das ist die Information die dem Mail Client mitteilt, um welche Art Mail es sich handelt und welcher Zeichensatz zur Darstellung benutzt werden soll.
    • Content-Transfer-Encoding - Dies beschreibt die Art der Übertragung und wie sowohl Mailserver, als auch Email Clients diese Mail interpretieren. 7bit ist die kleinste Form, die maximal mögliche Kompatibilität ermöglicht. Beim 7bit ASCII Zeichensatz können die ersten 128 zeichen der ASCII Tabelle dargestellt werden. Zeichen wie deutsche Umlaute sind darin nicht vorgesehen. Bei der 8bit Übertragung können bis zu 256 zeichen dargestellt werden. Ältere Mailerver, so liest man, verstehen nur 7bit und verwerfen Anfragen die mit 8bit übertragen werden sollen. Anders ausgedrückt, es kann passieren das die Mail nicht ankommt. Ich persönlich hatte damit allerdings noch nie Probleme und die 7bit "Zwangsangabe" scheint veraltet zu sein.
    • Message-ID - Die Message ID ist einmalig, bzw. sollte es sein, wodurch die Mail eindeutig zugeordnet werden kann.
    • X-Mailer - Beschreibt den Client der die Mail versendet hat. In unserem Fall geben wir die PHP Version an, damit Mailserver auf der Route wissen, dass diese Mail mit PHP verschickt wurde.
    Es gibt noch weitere Felder und Varianten, die uns aber im moment nicht kümmern. Im Abschnitt Mail mit Anhang werden wir noch einen etwas anderen Header kennen lernen.
    Speziell die letzten beiden Angaben (Message ID und X_Mailer) im Header oben sind sehr wichtige Informationen. Fehlen diese Angaben, ist die Wahrscheinlichkeit sehr hoch, dass die Mail niemals beim Empfänger ankommen wird, weil die Mail irgendwo unterwegs in einem Spamfilter hängen bleibt und nicht weitergeleitet wird!

    Falls also eine Mail nicht ankommt, liegt das in den aller meisten Fällen entweder am Transfer-Encoding (7bit oder 8bit) oder an fehlenden Absendeangaben!

    Der Rest des Scripts ist sehr einfach, weil hier einfach nur noch die Mail verschickt wird.
    PHP-Code:
        if (@mail$empfaengerhtmlspecialchars$betreff ), $mailbody$mailheader ))
        {
            
    // Bei erfolgreichem Versand Danke-Seite anzeigen
            
    echo 'Danke, die Email wurde verschickt!';
        } 
    Die mail-Funktion kennt noch einen 5. Parameter auf den ich jetzt nicht eingehen werde, weil dieser nur in den seltensten Fällen unterstützt wird. Wer mehr darüber erfahren möchte kann sich darüber in der Online-Doku informieren. Die mail-Funktion selbst liefert entweder TRUE oder FALSE zurück. Bei einem FALSE konnte die Mail nicht für den Versand übergeben werden und wir können entsprechend darauf reagieren. Im Falle von TRUE heisst das zwar das die Mail für den Versand angenommen wurde, aber es ist nicht prüfbar ob die Mail auch tatsächlich beim Empfänger ankam! Einige Gründe dafür stehen weiter oben. Wurde die Mail für den Versand akzeptiert, können wir darauf angemessen reagieren, indem wir den Besucher zu einer Danke-Seite weiterleiten oder, was weiter unter gezeigt wird, dem Benutzer eine Empfangsbestätigung, respektive Kopie der Mail an seine Adresse schicken.


    Soweit so gut. Dieser Abschnitt fiel etwas länger aus, weil ich die prinzipielle Funktionsweise und den Header beschrieben habe. Die nachfolgenden Beispiele sind über große Strecken identisch, deswegen spare ich mir dort die Erklärungen und gehe nur auf die abweichenden Passagen ein.


    Das Ergebnis im Mail Client:




    HTML Email mit CSS Formatierung
    Eine Email im HTML Format zu senden ist im Grunde genommen nichts anderes, als eine einzelne Webseite per Email zu verschicken. Wir haben also mehr oder weniger freie Hand was die Gestaltung angeht, solange wir uns an die HTML und CSS Richtlinien halten. Das wird sofort ersichtlicht, wenn man das Template für die Email sieht.

    Listing der Datei mailbody.txt:
    HTML-Code:
    <!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" xml:lang="de" lang="de">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>Email als HTML</title>
    <style type="text/css">
    body { font: normal 12px Verdana, Arial, Helvetica, sans-serif; }
    a { color: blue; text-decoration: none; }
    h2 { font-size: 16px; font-weight: bold; }
    .gruen { color: green; }
    </style>
    </head>
    
    <body>
    <h2>Soeben ist eine Nachricht von <span class="gruen">###NAME###</span> eingetroffen.</h2>
    <p>Als Antwortadresse wurde <a href="mailto:###EMAIL###">###EMAIL###</a> angegeben.</p>
    <p>Die Nachricht die gesendet wurde lautet:<br />
    ###NACHRICHT###</p>
    </body>
    </html>
    Das Template besteht aus einer normalen HTML Datei mit etwas CSS. Auch hier treffen wir wieder unsere Platzhalter, die durch die Benutzereingaben ersetzt werden.

    Die Datei funktionen.inc.php ist identisch mit wie beim vorherigen Beispiel. Auch die mail.php weicht nur minimal vom letzten Beispiel ab - das aber mit großer Wirkung!
    Die erste Abweichung findet in der Zeile zum ersetzen des Platzhalters für die Nachricht statt.
    PHP-Code:
    $mailbody str_replace'###NACHRICHT###'nl2brhtmlspecialchars$nachricht ) ), $mailbody ); 
    Ergänzt wurde hier die Funktion nl2br. Diese Funktion bewirkt, dass das Steuerungzeichen für einen Zeilenumbruch (\n) in ein HTML-konformes Break (<br />) umgewandelt wird. Ohne diese Funktion hätten wir bei der Ausgabe nur eine laaaange Zeile Text ohne neue Absätze und Umbrüche.

    Die nächsten beiden Veränderungen finden im Mail Header statt. Da wird nun ja keinen reinen Text, sondern HTML verschicken, muß natürlich der Content-Type angepasst werden. Ebenso ändern wir das Transfer-Encoding auf 8bit. Hier die beiden geänderten Zeilen:
    PHP-Code:
        $mailheader .= "Content-Type: text/html; charset=UTF-8\r\n";
        
    $mailheader .= "Content-Transfer-Encoding: 8bit\r\n"
    That's it!
    Diese kleinen Veränderungen haben eine solch große Auswirkung auf die Art der Darstellung!


    Das Ergebnis im Mail Client:

    (Deutlich zu sehen das die H2-Überschrift sich absetzt und auch der Name durch das CSS farblich hervorgehoben wird)



    Vermutlich stand jeder angehende Programmierer schon mal an dieser Stelle. Voller Stolz blickt man in sein Postfach, wo die erste Mail vom eigenen Formmailer eingetroffen ist. Dann denkt man sich: "Das war ja einfach, mit nur so wenigen Zeilen Code so ein Ergebnis zu erzielen. Wie schwer kann es da schon sein auch eine Datei mitzuschicken?!".
    Angesichts der oben gezeigten Beispiele, und wie minimal der Unterschied zwischen Text Mail und HTML Mail ist, neigt man dazu zu denken, dass dies mit einem Dateianhang ebenso einfach ist.
    Tja, leider ist dem nicht so. Das senden von Dateianhänge ist erheblich aufwändiger als das senden einer Text/HTML Mail. Das Formular ist abweichend, der Mail Header ist abweichend, der Mail Body muß in einzelne Teilbereiche getrennt werden, Dateianhänge müssen Richtlinien beachten, was die Zeilenlänge und die Art der Zeichen innerhalb der Mail angeht.
    Glücklicherweise hilft uns PHP bei den meisten Sachen und deshalb werden wir auch dieses Problem meistern.
    Angehängte Dateien

  2. #2
    TP-Specialist phpBuddy ist einer der Eckpfeiler des TP - ohne ihn geht nichts phpBuddy ist einer der Eckpfeiler des TP - ohne ihn geht nichts phpBuddy ist einer der Eckpfeiler des TP - ohne ihn geht nichts phpBuddy ist einer der Eckpfeiler des TP - ohne ihn geht nichts phpBuddy ist einer der Eckpfeiler des TP - ohne ihn geht nichts phpBuddy ist einer der Eckpfeiler des TP - ohne ihn geht nichts phpBuddy ist einer der Eckpfeiler des TP - ohne ihn geht nichts phpBuddy ist einer der Eckpfeiler des TP - ohne ihn geht nichts phpBuddy ist einer der Eckpfeiler des TP - ohne ihn geht nichts phpBuddy ist einer der Eckpfeiler des TP - ohne ihn geht nichts phpBuddy ist einer der Eckpfeiler des TP - ohne ihn geht nichts Avatar von phpBuddy
    Registriert seit
    Aug 2004
    Ort
    Kaiserslautern
    Beiträge
    4.678
    HTML Email mit CSS Formatierung und Dateianhang
    Da wir eine Datei mit der Mail verschicken möchten, muß das Formular natürlich dahingehend erweitert werden, dass ein Upload auch möglich ist. In unserem Beispiel möchten wir eine JPG datei anhängen und erlauben auch nur das hochladen dieses Bildtyps.
    Die Template Datei ist identisch zum vorherigen HTML Beispiel. In der Datei funktionen.inc.php fügen wir aber eine weitere Funktion hinzu, die für uns prüft, ob eine Datei hochgeladen wurde und ob es sich dabei um eine JPG Datei handelt.
    PHP-Code:
    function checkFile()
    {
        if (
    $_FILES['datei']['error'] == &&
            
    $_FILES['datei']['type'] == 'image/jpeg')
        {
            return 
    $_FILES['datei']['name'];
        }
        else
        {
            die( 
    'Bitte eine gültige JPG Datei anhängen!' );
        }

    In der Datei mail.php wird sich nun einiges ändern. Zunächst erweitern wir die einleitende Abfrage dahingehend, dass wir feststellen ob auch eine Datei angehängt wurde ...
    PHP-Code:
    if (isset($_POST['senden']) && $_FILES['datei']['size'] > 0
    ... und fügen ebenso den Aufruf für die neue Funktion hinzu, die prüft ob ein JPG hochgeladen wurde:
    PHP-Code:
    $uploadname checkFile(); 
    Das weitere Listing der Datei mail.php sieht wie folgt aus:
    PHP-Code:
        // Template mit dem Mailbody laden
        
    $template file_get_contents'mailbody.txt' );
        
    // Trenner für den Anhang
        
    $trenner md5time() );

        
    // Platzhalter mit den Benutzereingaben ersetzen
        
    $template str_replace'###NAME###'htmlspecialchars$name ), $template );
        
    $template str_replace'###EMAIL###'$email$template );
        
    $template str_replace'###NACHRICHT###'nl2brhtmlspecialchars$nachricht ) ), $template );
        
        
    // Mail Header erstellen
        
    $mailheader .= "Reply-To: " .$name"<" .$email">\r\n";
        
    $mailheader .= "Return-Path: noreply@" .$_SERVER['SERVER_NAME']. "\r\n";
        
    $mailheader .= "Message-ID: <" .time(). " noreply@" .$_SERVER['SERVER_NAME']. ">\r\n";
        
    $mailheader .= "X-Mailer: PHP v" .phpversion(). "\r\n";
        
    $mailheader .= "From: PHP Email Tutorial<noreply@" .$_SERVER['SERVER_NAME']. ">\r\n";
        
    $mailheader .= "MIME-Version: 1.0\r\n";
        
    $mailheader .= "Content-Type: multipart/mixed;\r\n";
        
    $mailheader .= " boundary = " .$trenner;
        
    $mailheader .= "\r\n\r\n";
        
        
    // Mailbody vorbereiten
        
    $mailbody  "This is a multi-part message in MIME format\r\n";
        
    $mailbody .= "--" .$trenner"\r\n";
        
    $mailbody .= "Content-Type: text/html; charset=UTF-8\r\n";
        
    $mailbody .= "Content-Transfer-Encoding: 8bit\r\n\r\n";
        
    $mailbody .= $template"\r\n\r\n";
        
        
    // Anhang anfügen
        
    $mailbody .= "--" .$trenner"\r\n";
        
    $mailbody .= "Content-Type: image/jpeg; name=\"" .$uploadname"\"\r\n";
        
    $mailbody .= "Content-Transfer-Encoding: base64\r\n";
        
    $mailbody .= "Content-Disposition: attachment; filename=\"" .$uploadname"\"\r\n\r\n";
        
    $mailbody .= chunk_splitbase64_encodefile_get_contents$_FILES['datei']['tmp_name'] ) ) );
        
    $mailbody .= "\n";

        
    // Email versenden
        
    if (@mail$empfaengerhtmlspecialchars$betreff ), $mailbody$mailheader ))
        {
            
    // Bei erfolgreichem Versand Danke-Seite anzeigen
            
    echo 'Danke, die Email wurde verschickt!';
        } 
    Wir sehen auf den ersten Blick, dass dieser Code ganz anders aussieht als das vorherige Beispiel. Gehen wir den Code mal der Reihe nach durch, um etwas Licht in's Dunkel zu bringen.

    Im oberen Bereich erzeugen wir einen eindeutigen String, den wir zum trennen der verschiedenen Teilbereiche der Mail verwenden werden:
    PHP-Code:
    $trenner md5time() ); 
    Der erste Teil des Mail Header ist uns bereits bekannt, aber beim Content-Type benötigen wir nun eine andere Angabe.
    PHP-Code:
    $mailheader .= "Content-Type: multipart/mixed;\r\n"
    Dieser Content-Type ähnelt der Angabe "multipart/form-data" in einem HTML Formular, wenn wir dort ebenfalls gemischte Inhalte haben, nämlich Text und Dateien. Damit der Mail Client nun weiß an welchen Stellen im gesendeten Quellcode er Inhalte trennen muß, teilen wir im Header den boundary-String mit.

    An dieser Stelle möchte ich noch auf 2 wichtige Dinge hinweisen. Das Leerzeichen vor dem "boundary" im Header ist kein Versehen! Es kann tatsächlich dazu führen das eine Mail nicht korrekt dargestellt wird, wenn dieses Leerzeichen fehlt. Ebenso ist es wichtig, dass die "From"-Angabe unmittelbar vor der "MIME-Version" und dem "Content-Type" steht. Vertauscht man die Reihenfolge der Header Angabe, führt das z.B. bei mir dazu, dass ich im Thunderbird nur eine leere Seite als Mail angezeigt bekomme, obwohl der komplette Mail Inhalt im Quelltext einsehbar ist.

    Die nächste Zeile ...
    PHP-Code:
    $mailbody  "This is a multi-part message in MIME format\r\n"
    ... steht vor der Nachricht im Head Bereich in der Email. Sie scheint nicht zwingend erforderlich zu sein, aber Mail Clients fügen diese ebenfalls hinzu, wenn man mit z.B. Thunderbird eine Email verschickt. Ich vermute, dass dies aus Gründen der Kompatibilität zu einigen Mail Server geschieht.

    Nun folgt der erste Teil unserer Email, der Text.
    PHP-Code:
        $mailbody .= "--" .$trenner"\r\n";
        
    $mailbody .= "Content-Type: text/html; charset=UTF-8\r\n";
        
    $mailbody .= "Content-Transfer-Encoding: 8bit\r\n\r\n";
        
    $mailbody .= $template"\r\n\r\n"
    Durch den Trenner teilen wir dem Mail Client mit, dass zwischen diesem Trenner und dem nächsten Trenner, bzw. dem Ende der Mail, ein Teilabschnitt dieser Email steht. Damit der Client weiß um was es sich bei diesem Abschnitt handelt, teilen wir ihm das mithilfe des "Content-Type" und dem "Transfer-Encoding" mit. Durch die Angabe "text/html" weiß nun der Client, dass alles bis zum nächsten Trennen als HTML dargestellt werden soll.

    Der nächste Teilabschnitt der Mail ist unser Bild:
    PHP-Code:
        // Anhang anfügen
        
    $mailbody .= "--" .$trenner"\r\n";
        
    $mailbody .= "Content-Type: image/jpeg; name=\"" .$uploadname"\"\r\n";
        
    $mailbody .= "Content-Transfer-Encoding: base64\r\n";
        
    $mailbody .= "Content-Disposition: attachment; filename=\"" .$uploadname"\"\r\n\r\n";
        
    $mailbody .= chunk_splitbase64_encodefile_get_contents$_FILES['datei']['tmp_name'] ) ) );
        
    $mailbody .= "\n"
    Wieder folgt zunächst der Trenner. Der Client stoppt seine HTML Ausgabe an dieser Position und wird ab diesem Punkt ausgeben, was ihm durch den "Content-Type" und das "Transfer-Encoding" aufgetragen wird. Wir sehen nun, dass wir als Content-Type eine JPG Datei ausgeben möchten. Der Name ergibt sich aus dem Rückgabewert der Funktion, die den Upload zuvor überprüft hat. Als Transfer-Encoding wird "base64" angegeben. Diese Angabe ist überaus wichtig um eine korrekte Übertragung der Daten zu gewährleisten.
    Mit der Angabe "Content-Disposition: attachment;" legen wir fest, dass der Anhang wirklich an die Mail angehängt wird. Eine andere Möglichkeit wäre hier das Einbetten in den Mailtext, indem man als Content-Disposition ein "inline" angibt.
    Die nächste Zeile ist ziemlich tricky:
    PHP-Code:
    $mailbody .= chunk_splitbase64_encodefile_get_contents$_FILES['datei']['tmp_name'] ) ) ); 
    Arbeiten wir uns mal von Innen nach Außen durch, weil hier mehrere Funktionen verschachtelt sind. Mit file_get_contents wird eine Datei als String eingelesen. Dies ist hier möglich, weil diese Funktion seit PHP 4.3 binary safe ist. Als einzulesender Dateiname nehmen wir hier den Name der temporären datei, die durch den Upload auf dem Server gelandet ist. Diese Datei steht nur zu genau diesem Zeitpunkt zur Verfügung. Sobald das Script beendet wird oder eine andere Seite geladen wird, existiert diese Datei nicht mehr. Möchte man diese Datei erst zu einem späteren Zeitpunkt verarbeiten, muß man diese zunächst mit move_uploaded_file an eine andere Position kopieren.
    Da wir nun die Bilddatei als String eingelesen haben, wird er mit base64_encode umgewandelt, damit die Datei beschädigt wird, falls es nicht möglich ist die Mail als 8bit zu übertragen. Es wird also aus Gründen der Kompatibilität gemacht. Anschließend wird der String mit chunk_split so aufbereitet, dass die Zeilenlänge 76 Zeichen nicht übersteigt.

    Das war's! Die Daten können nun wieder mit der mail-Funktion versendet werden. Sollte man mehr als eine Datei anhängen wollen, kann man den letzten Schritt beliebig oft wiederholen. Erst Trenner setzen, dann Art der Daten und Übertragungsmodus angeben, die Datei anhängen, fertig.


    Das Ergebnis im Mail Client:




    Eine Empfangsbestätigung verschicken
    Das ist genauso einfach wie das verschicken einer ganz einfachen Textmail. Wie wir ja bereits gehört haben, gibt die mail-Funktion bei Erfolg ein TRUE zurück. Damit können wir also feststellen, ob die Nachricht des Benutzers an uns übermittelt wurde und falls ja, schicken wir ihm eine Mail als Bestätigung. Das sieht in etwa so aus:
    PHP-Code:
        if (@mail$empfaengerhtmlspecialchars$betreff ), $mailbody$mailheader ))
        {
            
    // Bei erfolgreichem Versand Danke-Seite anzeigen
            
    $mailheader  "From: Firma Max Mustermann<mustermann@domain.tld>\r\n";
            
    $mailheader .= "Reply-To: Firma Max Mustermann<mustermann@domain.tld>\r\n";
            
    $mailheader .= "Return-Path: noreply@" .$_SERVER['SERVER_NAME']. "\r\n";
            
    $mailheader .= "MIME-Version: 1.0\r\n";
            
    $mailheader .= "Content-Type: text/plain; charset=UTF-8\r\n";
            
    $mailheader .= "Content-Transfer-Encoding: 7bit\r\n";
            
    $mailheader .= "Message-ID: <" .time(). " noreply@" .$_SERVER['SERVER_NAME']. ">\r\n";
            
    $mailheader .= "X-Mailer: PHP v" .phpversion(). "\r\n\r\n";
            
            
    // Inhalt der Bestätigung
            
    $mailbody 'Vielen Dank für Ihre Email. Wir werden uns in Kürze bei Ihnen melden.';

            
    // Bestätigung verschicken
            
    if (@mail$email"Die Firma Max Mustermann bedankt sich"$mailbody$mailheader ))
            {
                
    // Bestätigung wurde verschickt
            
    }
        } 
    Das ist im Prinzip der selbe Code wie zuvor in der Text Mail. Es werden lediglich einige Kleinigkeiten im Mail Header angepasst, damit der Benutzer auch weiß, wer ihm schreibt und wohin er antworten kann.


    Damit sollten die meisten Fragen zum Thema "Wie versendet man eine Email mit PHP" geklärt sein. Wer Fragen oder Anregungen hat, kann sie gerne in diesem Thread stellen.


    Danke für's lesen und viel Spaß beim mailen,
    Andreas



    p.s.: Korrekturlesen werden ich demnächst, weil ich darauf gerade keine Lust habe.
    Angehängte Dateien

  3. #3
    TP-Veteran max.m lebt für das TP und seine User max.m lebt für das TP und seine User max.m lebt für das TP und seine User max.m lebt für das TP und seine User max.m lebt für das TP und seine User max.m lebt für das TP und seine User Avatar von max.m
    Registriert seit
    Dec 2005
    Ort
    Stuttgart
    Beiträge
    1.939

    Thumbs up

    Zitat Zitat von Rizzo Beitrag anzeigen
    Danke für's lesen
    Danke fürs schreiben.

  4. #4
    TP-Insider TP-Sponsor zulujaner ist ein richtiges Arbeitstier - DANKE zulujaner ist ein richtiges Arbeitstier - DANKE zulujaner ist ein richtiges Arbeitstier - DANKE zulujaner ist ein richtiges Arbeitstier - DANKE Avatar von zulujaner
    Registriert seit
    Apr 2008
    Ort
    Naumburg
    Beiträge
    879
    Hallo Rizzo,

    das ist schon der Hammer, fast täglich was Neues. Immer ausführlich beschrieben, mit Beispielen und angehängtem ZIP.

    Wenn ich jetzt nur noch wüßte, wie und wann ich die ganzen interessanten Scripte, in meine schon seit Monaten vor mir her geschobene Page bringe...

    Super wie immer...

    zulu

  5. #5
    TP-Moderator Cybergreek lebt für das TP und seine User Cybergreek lebt für das TP und seine User Cybergreek lebt für das TP und seine User Cybergreek lebt für das TP und seine User Cybergreek lebt für das TP und seine User Cybergreek lebt für das TP und seine User Avatar von Cybergreek
    Registriert seit
    Nov 2005
    Ort
    Köln
    Beiträge
    1.604
    Zitat Zitat von max.m Beitrag anzeigen
    Danke fürs schreiben.
    Dem kann ich mich nur anschließen! Klasse Rizzo!

    Schön finde ich aber auch die checkInjection()
    Grüße vom Griechen,
    Cybergreek!

    everygain Translator - eine Firefox-Erweiterung, damit der Grieche Euch besser versteht

  6. #6
    TP-Specialist phpBuddy ist einer der Eckpfeiler des TP - ohne ihn geht nichts phpBuddy ist einer der Eckpfeiler des TP - ohne ihn geht nichts phpBuddy ist einer der Eckpfeiler des TP - ohne ihn geht nichts phpBuddy ist einer der Eckpfeiler des TP - ohne ihn geht nichts phpBuddy ist einer der Eckpfeiler des TP - ohne ihn geht nichts phpBuddy ist einer der Eckpfeiler des TP - ohne ihn geht nichts phpBuddy ist einer der Eckpfeiler des TP - ohne ihn geht nichts phpBuddy ist einer der Eckpfeiler des TP - ohne ihn geht nichts phpBuddy ist einer der Eckpfeiler des TP - ohne ihn geht nichts phpBuddy ist einer der Eckpfeiler des TP - ohne ihn geht nichts phpBuddy ist einer der Eckpfeiler des TP - ohne ihn geht nichts Avatar von phpBuddy
    Registriert seit
    Aug 2004
    Ort
    Kaiserslautern
    Beiträge
    4.678
    Danke für die Blumen und eure netten Worte.


    Zitat Zitat von Cybergreek Beitrag anzeigen
    Schön finde ich aber auch die checkInjection()
    Kleiner Gimmick für Leute mit einem Auge für's Detail.

  7. #7
    TP-Specialist MichaelM hilft, wo's geht MichaelM hilft, wo's geht MichaelM hilft, wo's geht Avatar von MichaelM
    Registriert seit
    Jan 2004
    Ort
    Münster-Hiltrup
    Beiträge
    2.323
    Wieder guter Stoff zum dazu lernen.
    Verstehe sogar ich "teilweise" schon...
    Danke Rizzo.
    Harleylujar, Michael!!

    Man sieht nur mit dem Herzen gut - das Wesentliche ist für das Auge unsichtbar...

    www.mikel-mueller.de
    www.sanitaertechnik-mueller.de

  8. #8
    TP-Greis Boris lebt für das TP und seine User Boris lebt für das TP und seine User Boris lebt für das TP und seine User Boris lebt für das TP und seine User Boris lebt für das TP und seine User Boris lebt für das TP und seine User Boris lebt für das TP und seine User Avatar von Boris
    Registriert seit
    Mar 2001
    Ort
    Stuttgart & Kornwestheim
    Beiträge
    9.420
    Witzig finde ich, dass ich ähnliche Funktionen wie du nutze, die auch noch die gleichen Namen besitzen, z.B.:

    PHP-Code:
    function checkInjections()
    {
        
    // @desc:        Überprüft Formularfelder auf enthaltene Injections
        // @version:    April 26, 2007    14:51
        // =============================================================================

        
    $checkit =    "/(bcc:|cc:|to:|Content-Transfer-Encoding:|MIME-Version:|Content-Type:)/iu";

        foreach(
    $_POST as $key => $value)
        {
            if(
    preg_match($checkit$_POST[$key]))
            {
                die(
    'Spamversuch - der Versand wurde blockiert.');
                exit;
            }
        }

    My software never has bugs. It just develops random features ...

    » DevShack - die Website des freien Webentwicklers Boris

  9. #9
    TP-Specialist phpBuddy ist einer der Eckpfeiler des TP - ohne ihn geht nichts phpBuddy ist einer der Eckpfeiler des TP - ohne ihn geht nichts phpBuddy ist einer der Eckpfeiler des TP - ohne ihn geht nichts phpBuddy ist einer der Eckpfeiler des TP - ohne ihn geht nichts phpBuddy ist einer der Eckpfeiler des TP - ohne ihn geht nichts phpBuddy ist einer der Eckpfeiler des TP - ohne ihn geht nichts phpBuddy ist einer der Eckpfeiler des TP - ohne ihn geht nichts phpBuddy ist einer der Eckpfeiler des TP - ohne ihn geht nichts phpBuddy ist einer der Eckpfeiler des TP - ohne ihn geht nichts phpBuddy ist einer der Eckpfeiler des TP - ohne ihn geht nichts phpBuddy ist einer der Eckpfeiler des TP - ohne ihn geht nichts Avatar von phpBuddy
    Registriert seit
    Aug 2004
    Ort
    Kaiserslautern
    Beiträge
    4.678
    Zitat Zitat von Boris Beitrag anzeigen
    Witzig finde ich, dass ich ähnliche Funktionen wie du nutze, die auch noch die gleichen Namen besitzen ...
    Hehe, in der Tat ... Allerdings denke ich, dass das so ungewöhnlich eigentlich gar nicht ist. Ich glaube auch die phpMailer Klasse aus dem PEAR Paket und auch Joomla nutzt ähnliche Funktionen. Die Namen entstehen aus gängigen Code Konventionen. Funktionen tragen idR englische Bezeichner, weshalb Funktionen die etwas prüfen das Präfix "check" bekommen, auslesende Funktionen "get", zuweisende Funktionen "set", usw. Und 'ne Injection ist nun mal 'ne Injection, da gibt's kein anderes sinnvolles Wort.

    Hat doch aber auch was schönes, weil man sich so sofort auch in anderer Leute Code zurecht findet. Nebenbei deutet es auch darauf hin, dass der Code nicht vollkommen verbockt wurde. 2 Leute, unabhängig voneinander, die zeitversetzt die selbe Methode zum prüfen benutzen, können nicht irren.


    @ MichaelM
    Schön, so schwer ist der Stoff aber auch nicht, weil das noch in die Kategorie Grundlagenwissen fällt.

  10. #10
    TP-Insider Sascha79 hilft, wo's geht Sascha79 hilft, wo's geht Avatar von Sascha79
    Registriert seit
    Jul 2008
    Ort
    Tübingen
    Beiträge
    674
    @ MichaelM
    Schön, so schwer ist der Stoff aber auch nicht, weil das noch in die Kategorie Grundlagenwissen fällt.
    Hier in Brasilien ist es etwas schwer an (deutsche) Bücher über PHP zu kommen. Deshalb sag auch ich ein Dankeschön und nehme diesen Beitrag gleich in mein Lesezeichen auf.

    Ich bin zwar alles andere als ein PHP-Programierer, aber die Zeit bleibt ja nicht stehen und ich seh schon das dieses Grundlagenwissen mir in Zukunft sehr weiterhelfen wird.
    Das Leben ist schön -
    Lehren ist die schönste Methode zu lernen.

  11. #11
    TP-Junior Frisko macht alles soweit korrekt
    Registriert seit
    Jan 2009
    Beiträge
    9
    Hallo zusammen, ich habe die Tuts von Rizzo durchgearbeitet und bin erstmal mega froh, dass ich sie gefunden habe...sind sehr hilf- und umfangreich, verständlich geschrieben und für einen Anfänger leicht zu verstehen und nachvollziehbar. Also Hut ab
    Dieses Tut hier ist so ziemlich genau das, wonach ich gesucht habe. Also machte ich mich motiviert und frisch ans Werk ein schönes Mail- Script zu schreiben. Hat dank der tollen Anleitung auch prima geklappt soweit, dachte ich zumindest, bis ich das Endergebnis testen wollte. Irgendwie klappt der Übergang vom Formular zur mail.php nicht. Um es zu beschreiben: Beim Klick auf Formular Absenden versucht der Browser die mail.php zu öffnen, d.h er bietet mir sie zum Öffnen oder Speichern auf der lokalen Festplatte an!

    Ich dachte erst, dass ich vielleicht einen Fehler beim Scripten gemacht habe und ging den Coden also nochmals Stück für Stück durch, habe jedoch keinen Fehler finden können. Also habe ich mal spaßeshalber die Original-Dateien auf den Server geladen, die am Ende des Tutorials zum Download angeboten werden, und siehe da, das gleiche "Phänomen".
    Woran könnte das liegen? Stimmt etwas nicht mit den Einstellungen auf dem Server oder was ist der Fehler?

    Freue mich auf Antwort.
    Bis dann

  12. #12
    TP-Moderator Adromir lebt für das TP und seine User Adromir lebt für das TP und seine User Adromir lebt für das TP und seine User Adromir lebt für das TP und seine User Adromir lebt für das TP und seine User Adromir lebt für das TP und seine User Adromir lebt für das TP und seine User Adromir lebt für das TP und seine User Avatar von Adromir
    Registriert seit
    Jun 2004
    Ort
    Hannover
    Beiträge
    4.805
    Könnte es sein, daß dein Server kein php unterstützt?
    Je größer der Deppenfaktor, desto gigantischer das Bescheidwissergefühl
    -Dieter Nuhr

  13. #13
    TP-Junior Frisko macht alles soweit korrekt
    Registriert seit
    Jan 2009
    Beiträge
    9
    Das kann ich defintiv ausschließen...schließlich ist der Großteil der Seite in PHP geschrieben und der funktioniert ja auch einwandfrei
    Immerhin steht was in $_POST. Das ist doch schonmal was...

  14. #14
    TP-Junior Frisko macht alles soweit korrekt
    Registriert seit
    Jan 2009
    Beiträge
    9
    PHP Version 4.4.7
    ist aktuell eingerichtet, um genau zu sein. Gerne kann ich auch Infos aus der phpinfo() liefern, falls das zur Lösung meines Problems beiträgt. Also ich bin gerade recht ratlos. Ich habe zwischendurch gedacht, dass vielleicht eine Funktion oder sonstwas im Code ist, die erst ab PHP5 unterstützt wird, ist aber Quatsch

  15. #15
    TP-Specialist phpBuddy ist einer der Eckpfeiler des TP - ohne ihn geht nichts phpBuddy ist einer der Eckpfeiler des TP - ohne ihn geht nichts phpBuddy ist einer der Eckpfeiler des TP - ohne ihn geht nichts phpBuddy ist einer der Eckpfeiler des TP - ohne ihn geht nichts phpBuddy ist einer der Eckpfeiler des TP - ohne ihn geht nichts phpBuddy ist einer der Eckpfeiler des TP - ohne ihn geht nichts phpBuddy ist einer der Eckpfeiler des TP - ohne ihn geht nichts phpBuddy ist einer der Eckpfeiler des TP - ohne ihn geht nichts phpBuddy ist einer der Eckpfeiler des TP - ohne ihn geht nichts phpBuddy ist einer der Eckpfeiler des TP - ohne ihn geht nichts phpBuddy ist einer der Eckpfeiler des TP - ohne ihn geht nichts Avatar von phpBuddy
    Registriert seit
    Aug 2004
    Ort
    Kaiserslautern
    Beiträge
    4.678
    Hallo,

    das Problem liegt definitiv beim Server, bzw. deren Konfiguration. Wenn PHP Dateien als Download angeboten werden, wird idR kein PHP unterstützt, bzw werden Dateien mit .php nicht als solche ausgeführt. Je nach Hoster kann es sein, dass bestimmte Verzeichnisse eingeschränkt sind und eine andere Endung benutzt werden muß.
    Falls .htaccess erlaubt ist erstelle mal eine Datei mit dem Name .htaccess mit diesem Inhalt ...
    Code:
    AddType application/x-httpd-php php php5 php4 php3 html htm
    ... und lade die in's gleiche Verzeichnis in dem auch die mail.php liegt. Hilft das auch nicht, musst Du dich an deinen Provider wenden, weil das nicht am Code liegen kann.

+ Antworten
Seite 1 von 5 1 2 3 4 ... LetzteLetzte

Ähnliche Themen

  1. Emails in Datenbank?
    Von Hausmaster im Forum Traum-Dynamik
    Antworten: 5
    Letzter Beitrag: 12.02.2007, 11:50
  2. Emails
    Von djflow im Forum Server & Provider
    Antworten: 0
    Letzter Beitrag: 11.05.2006, 00:48
  3. Emails verschlüsseln
    Von Rizzla im Forum Traum-Dynamik
    Antworten: 6
    Letzter Beitrag: 23.10.2003, 11:49
  4. sounds für emails
    Von notator im Forum Einfach so ...
    Antworten: 2
    Letzter Beitrag: 10.04.2003, 12:37
  5. Antworten: 24
    Letzter Beitrag: 20.09.2002, 11:44

Stichworte

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51