tanja: mail function

Hallo Forum ...

Wo liegt der Fehler?

Mir wird zwar eine Mail geschickt aber leider ohne Inhalt.

<html>
<head>
<title>Kontaktformular</title>
</head>
<body>
<form action="<?php $PHP_SELF; ?>" method="post">
Name
<br>
<input type="text" name="Name" size="20">
<br>
E-Mail
<br>
<input type="text" name="Mail" size="20">
<br>
Betreff
<br>
<input type="text" name="Betreff" size="20">
<br>
<input type="submit" name="submit">
</form>
</body>
</html>
<?php
mail("meine@adresse.de", "Eine Testmail von mir selber", "$message", "$header");
$message="<html><body>";
$message.="<p>Name";
$message.=$Name;
$message.="<br>E-Mail";
$message.=$Mail;
$message.="<br>Betreff";
$message.=$Betreff;
$message.="</p></body></html>";
$header="\n Content-Type: text/html";
?>

Ich wäre über einfache Hilfen dankbar.

Gruß

  1. hallo!

    diene mail ist leer, weil du die $message erst dann generierst, wenn du die mail beriets versandt hast.

    probier mal folgendes:
    <html>
    <head>
    <title>Kontaktformular</title>
    </head>
    <body>
    <form action="<?php $PHP_SELF; ?>" method="post">
    Name
    <br>
    <input type="text" name="Name" size="20">
    <br>
    E-Mail
    <br>
    <input type="text" name="Mail" size="20">
    <br>
    Betreff
    <br>
    <input type="text" name="Betreff" size="20">
    <br>
    <input type="submit" name="submit">
    </form>
    </body>
    </html>
    <?php
    $message="<html><body>";
    $message.="<p>Name";
    $message.=$Name;
    $message.="<br>E-Mail";
    $message.=$Mail;
    $message.="<br>Betreff";
    $message.=$Betreff;
    $message.="</p></body></html>";
    $header="\n Content-Type: text/html";
    mail("meine@adresse.de", "Eine Testmail von mir selber", "$message", "$header");?>

    1. Hallo ...

      Ich vergaß zu erwähnen, das die Betreffzeile bei meinem Outlook Express angezeigt wird. ---Eine Testmail von mir selber---
      Nur der Inhalt der Textboxen wird leider nicht übermittelt.

      Bei Deinem Lösungsvorschlag hat sich bei mir leider nichts geändert. Ausser das folgende Meldung unter meinem Formular auftaucht.

      Warning: mail(): SMTP server response: 550 syntax error in header in c:\netzwerk\pages\formular.php on line 33

      Gruß

      1. Hallo Tanja,

        Ich vergaß zu erwähnen, das die Betreffzeile bei meinem Outlook Express angezeigt wird. ---Eine Testmail von mir selber---

        Klar, die hast du ja auch als Konstante in der mail()-Anweisung drin.

        Nur der Inhalt der Textboxen wird leider nicht übermittelt.

        Auch klar, wie dolflyer schon sagte: Erst verschickst du die Mail, und dann erst generierst du den Text, der darin stehen soll. Das kann ja nicht gehen.

        Warning: mail(): SMTP server response: 550 syntax error in header in c:\netzwerk\pages\formular.php on line 33

        Ja, schau mal, was du als Header übergibst:

        $header="\n Content-Type: text/html";

        Da stecken gleich drei Fehler drin.
        Erstens fängt eine Headerzeile nicht mit einem Zeilenumbruch an, sondern wird damit beendet.
        Zweitens ist ein korrekter Zeilenumbruch nicht einfach ein Linefeed '\n', sondern die Kombination "\r\n".
        Und drittens darf am Zeilenanfang kein Leerzeichen stehen, ansonsten wird das als Fortsetzung der vorhergehenden Zeile interpretiert.
        Richtig müsste es also heißen:

        $header="Content-Type: text/html\r\n";

        Und zum Schluss frage ich mich, wieso du deine Variablen $message und $header noch einmal in Anführungszeichen setzt. Das hat zwar mit dem Fehler nix zu tun, ist aber überflüssig. Also

        mail("meine@adresse.de", "Eine Testmail von mir selber", $message, $header);
        ?>

        Damit sollte es nun eigentlich laufen.
        So long,

        Martin

        1. Hallo ...

          Ich versuche mir dieses schwierige Thema auch mittels Bücher näher zubringen. Dort wurde die $header halt so beschrieben. Aber mir ist schon aufgefallen das sich in den Büchern so einige Fehler eingeschlichen haben. Was das Erlernen nicht gerade einfacher macht.

          Ansonsten hat Eure Hilfestellung mir schon mal weiter geholfen.

          Nur gibt es da jetzt ein Neues Problem.
          Ich bekomme jetzt zwei E-Mails (ich glaube vorher auch schon)
          In der Einen steht

          Name

          E-Mail

          Betreff

          und in der Zweiten steht das Gleiche + die gemachten Angaben.

          hmmm

          Gruß

          1. Hi,

            Aber mir ist schon aufgefallen das sich in den Büchern so einige Fehler eingeschlichen haben. Was das Erlernen nicht gerade einfacher macht.

            da hast du leider Recht. Vor allem bei Büchern für Einsteiger, wie sie von vielen Verlagen angeboten werden, ist Vorsicht geboten. Oft enthalten sie tatsächlich Fehler, häufiger aber sogenannte gute Ratschläge, die man als Profi "nicht direkt falsch, aber unsinnig" einordnen würde.

            Ich bekomme jetzt zwei E-Mails (ich glaube vorher auch schon)

            Dann hast du die erste mail()-Anweisung im Script wohl immer noch drin?
            Du musst versuchen, die Logik zu verstehen: Erst bastelst du in $message den kompletten Text zusammen, den du versenden willst, und *erst dann* übergibst du den String an die mail()-Funktion. Nicht vorher.

            In der Einen steht
            Name
            E-Mail
            Betreff
            und in der Zweiten steht das Gleiche + die gemachten Angaben.

            So dachte ich mir das. Die erste Mail ist also immer noch die ohne Inhalt, die auch vor der ersten Änderung schon kam? Nimm die erste mail()-Anweisung raus, die darf nur einmal drinstehen. Und zwar zum Schluss.

            Schönen Abend noch,

            Martin

            1. Hi Martin,

              da hast du leider Recht. Vor allem bei Büchern für Einsteiger, wie sie von vielen Verlagen angeboten werden, ist Vorsicht geboten. Oft enthalten sie tatsächlich Fehler, häufiger aber sogenannte gute Ratschläge, die man als Profi "nicht direkt falsch, aber unsinnig" einordnen würde.

              immer das Gleiche: http://www.netz-treff.de/forum/forum_entry.php?id=10578 ;-)

              Viele Grüße

              Jörg

            2. Hallo

              So dachte ich mir das. Die erste Mail ist also immer noch die ohne Inhalt, die auch vor der ersten Änderung schon kam? Nimm die erste mail()-Anweisung raus, die darf nur einmal drinstehen. Und zwar zum Schluss.

              Ich habe den Änderungsvorschlag von dolflyer und Dir Übernommen
              Die mail() function einmal am Ende, den $header geändert...

              Ich habe auch solangsam eine Ahnung
              Frage: Wenn ich nur den php Teil in einer .php Datei abspeichere, würde ich dann auch eine Mail bekommen?
              Wenn Ja dann würde die mail() function ja ausgeführt, sobald ich die.php im Browser aufrufe.

              Falls ich da jetzt richtig liege komme ich da vielleicht auch selber drauf.

              Werde ich morgen gleich mal antesten.

              Danke nochmal

              N8

              1. n'Abend,

                Ich habe auch solangsam eine Ahnung

                das ist doch schon mal was! Wir haben alle mal klein angefangen. ;-)

                Frage: Wenn ich nur den php Teil in einer .php Datei abspeichere, würde ich dann auch eine Mail bekommen?

                Ja - nur würdest du dann im Browser nichts sehen, wenn du die Seite aufrufst.

                Wenn Ja dann würde die mail() function ja ausgeführt, sobald ich die.php im Browser aufrufe.

                Genau.  :-)

                Falls ich da jetzt richtig liege komme ich da vielleicht auch selber drauf.

                Worauf?

                Werde ich morgen gleich mal antesten.

                Na dann viel Erfolg!
                Schönen Feiertag noch,

                Martin

                1. Guten Morgen ...

                  Falls ich da jetzt richtig liege komme ich da vielleicht auch selber drauf.

                  Worauf?

                  Darauf wie ich es verhindern kann, das die Mail nicht beim öffnen der Seite abgeschickt wird. Mein erster Gedanke hat auch gleich funktioniert. Eine einfache if-Anweisung.
                  Wenn Alle Felder ausgefüllt, dann erstelle und versende die E-Mail.

                  So das senden von irgendwelchen Formularangaben funktioniert schon mal. Jetzt werde ich mich mal daran versuchen das Ganze ein wenig zuerweitern. Erlaubte Zeichen, Meldungen usw.

                  Ich melde mich dann mal wieder hier im Forum, sobald ich fertig bin mit diesem script.

                  Danke bis dann

                  1. Moin!

                    Falls ich da jetzt richtig liege komme ich da vielleicht auch selber drauf.
                    Worauf?
                    Darauf wie ich es verhindern kann, das die Mail nicht beim öffnen der Seite abgeschickt wird...

                    aaah, jetzt verstehe ich, was du meinst: Du rufst die PHP-Seite auf, sie zeigt das (noch leere) Formular an und verschickt gleichzeitig die erste Mail. Dann, wenn du das ausgefüllte Formular abschickst, geht die zweite Mail raus und das Formular wird (wieder leer) erneut angezeigt.
                    Stimmt, du machst das ja alles in einer PHP-Datei, die beim Absenden sich selbst wieder aufruft. Hatte ich übersehen, sorry.

                    Mein erster Gedanke hat auch gleich funktioniert. Eine einfache if-Anweisung.
                    Wenn Alle Felder ausgefüllt, dann erstelle und versende die E-Mail.

                    Schon mal nicht schlecht. Es geht aber noch eleganter. Anstatt alle Felder abzufragen, reicht ein einfaches

                    if (isset($_POST))
                       { // Formular verarbeiten & versenden
                       }

                    So fragst du einfach nur ab, ob überhaupt Formulardaten mit der POST-Methode (steht als action="post" in deinem <form>) übergeben wurden.

                    Jetzt werde ich mich mal daran versuchen das Ganze ein wenig zuerweitern. Erlaubte Zeichen, Meldungen usw.

                    Da fängt dann die Fleißarbeit richtig an. ;-)
                    Einer meiner Profs im Informatik-Studium meinte einmal, 90% der Zeit, die man für eine Software braucht, geht für die Phase zwischen "funktioniert" und "funktioniert zuverlässig" drauf.
                    Das erklärt auch die mangelhafte Zuverlässigkeit von MS-Produkten, die offensichtlich schon nach 30..50% Entwicklungszeit auf den Markt kommen, denn "es funktioniert doch schon".  ;-)

                    Schönen Tag noch,

                    Martin

                    1. Hallo ...

                      Schon mal nicht schlecht. Es geht aber noch eleganter. Anstatt alle Felder abzufragen, reicht ein einfaches

                      if (isset($_POST))
                         { // Formular verarbeiten & versenden
                         }

                      Sorry, aber wenn ich Deine If-Anweisung gegen meine tausche, dann wird gleich wieder beim öffnen der Datei im Browser eine Mail geschickt. Ich poste noch mal den Quelltext. Du must Dich bestimmt noch mehr in das Denken eines Anfängers reinversetzen .-)

                      ------------------------------------------------------------

                      <html>
                      <head>
                      <title>Kontaktformular</title>
                      </head>
                      <body>
                      <form action="<?php $PHP_SELF; ?>" method="post">
                      Name
                      <br>
                      <input type="text" name="Name" size="20">
                      <br>
                      E-Mail
                      <br>
                      <input type="text" name="Mail" size="20">
                      <br>
                      Betreff
                      <br>
                      <input type="text" name="Betreff" size="20">
                      <br>
                      <input type="submit" name="submit">
                      <br>
                      </form>
                      </body>
                      </html>
                      <?php
                      if ($Name AND $Mail AND $Betreff)
                      {
                      $message="Name: $Name\r\n";
                      $message.="E-Mail: $Mail\r\n";
                      $message.="Betreff: $Betreff\r\n";
                      $header="Content-Type: text/plain\r\n";
                      mail("meine@adresse.de", "Eine Testmail von mir selber", $message, $header);
                      }
                      ?>

                      -------------------------------------------------------------------

                      Das Ganze ist gespeichert in einer formular.php .
                      Getestet wird es lokal auf meinem Rechner mit apache Webserver.

                      Gruß

                      1. Hallo Tanja,

                        if (isset($_POST))
                           { // Formular verarbeiten & versenden
                           }
                        Sorry, aber wenn ich Deine If-Anweisung gegen meine tausche, dann wird gleich wieder beim öffnen der Datei im Browser eine Mail geschickt.

                        ups, das stelle ich beim Ausprobieren auch gerade fest. Hmm, ich war mir eigentlich sicher, ich hätte das schon mal so gemacht und Erfolg gehabt... Oder hatte ich etwa gezielt isset($_POST['submit']) abgefragt? Wahrscheinlich...

                        Du must Dich bestimmt noch mehr in das Denken eines Anfängers reinversetzen .-)

                        Maybe. :-)

                        <?php
                        if ($Name AND $Mail AND $Betreff)

                        Oh weh, oh weh! Was seh ich da?
                        Das produziert bei mir eine PHP-Fehlermeldung:
                        Undefined variable: Name in U:\Web\post.php

                        Du hast in deiner PHP-Installation offensichtlich register_globals=on. Das bewirkt, dass alle übergebenen GET- und POST-Parameter automatisch als Variablen im PHP-Script zur Verfügung stehen. Klingt gut, ist aber gefährlich. Denn so kann ich jederzeit neue Variablen in dein Script einschleusen; es gibt Fälle, in denen das heimtückische Fehler verursachen kann. Deswegen empfiehlt man allgemein, in der php.ini register_globals=off zu setzen. Damit vermeidet man unschöne Nebeneffekte, nur ist der Zugriff auf die übergebenen Parameter etwas umständlicher. Entweder du "holst" sie dir am Anfang des Scripts selbst:

                        $Name = $_REQUEST['Name'];

                        oder du greifst direkt auf die globalen Arrays wie z.B. $_REQUEST[] zu.

                        Ciao,

                        Martin

                        1. Hi ich noch mal

                          Du hast in deiner PHP-Installation offensichtlich register_globals=on. Das bewirkt, dass alle übergebenen GET- und POST-Parameter automatisch als Variablen im PHP-Script zur Verfügung stehen. Klingt gut, ist aber gefährlich. Denn so kann ich jederzeit neue Variablen in dein Script einschleusen; es gibt Fälle, in denen das heimtückische Fehler verursachen kann. Deswegen empfiehlt man allgemein, in der php.ini register_globals=off zu setzen. Damit vermeidet man unschöne Nebeneffekte, nur ist der Zugriff auf die übergebenen Parameter etwas umständlicher. Entweder du "holst" sie dir am Anfang des Scripts selbst:

                          Das ist ein Tiefschlag
                          In den sch... Büchern wurde mir vorgeschlagen register_globals auf on zusetzen da die Methode zum Ausprobieren weniger umständlich ist. Ich wurde auch drauf hingewiesen, dass es im Netz nicht ratsam ist.

                          Ich habe es garde mal ausprobiert, da funktioniert ja überhaupt kein Übungsscript mehr. grr

                          Bin beleidigt, mach feierabend

                          Tüch

                          1. Hallo ...

                            Ich habe doch noch kein Feierabend gemacht.

                            Lässt mir ja keine Ruhe !!!
                            Eine Frage hätte ich da noch (erst mal gg) und zwar:

                            Dort wo jetzt noch z.B. echo $irgendwas; steht, kann ich es erst mal gegen echo $irgendwas=$_REQUEST['irgendwas']; austauschen.

                            Auch wenn es nicht die eleganteste Lösung ist ???

                            Ich akzepziere nur ein Ja :-)

                            Bye

                            1. Hi,

                              Ich habe doch noch kein Feierabend gemacht.
                              Lässt mir ja keine Ruhe !!!

                              das kenne ich. ;-)

                              Dort wo jetzt noch z.B. echo $irgendwas; steht, kann ich es erst mal gegen echo $irgendwas=$_REQUEST['irgendwas']; austauschen.

                              Auch wenn es nicht die eleganteste Lösung ist ???
                              Ich akzepziere nur ein Ja :-)

                              Ähm... also:
                              Ja, das hast du fast richtig verstanden.
                              Aber nur fast.  *kopfeinzieh*

                              Entweder...
                               a) du ersetzt im ganzen Script $variable durch $_REQUEST['variable']
                              Oder
                               b) du machst nur *einmal* zu Beginn für jeden Parameter
                                    $variable = $_REQUEST['variable'];
                                  und lässt die Scriptanweisungen ansonsten so, wie sie sind.

                              Lösung a) hat Vorteile, wenn du $variable nur ein einziges Mal im ganzen Script brauchst, dann sparst du eine Variable ein.
                              Lösung b) würde ich empfehlen für Variablen, die im Script häufiger angesprochen werden. Ist weniger Schreibarbeit, und spart dem Server vielleicht ein paar Millisekunden Rechenzeit. ;-)

                              Schönen Abend noch,

                              Martin

                              1. Na,

                                a) du ersetzt im ganzen Script $variable durch $_REQUEST['variable']
                                Oder
                                b) du machst nur *einmal* zu Beginn für jeden Parameter
                                      $variable = $_REQUEST['variable'];
                                    und lässt die Scriptanweisungen ansonsten so, wie sie sind.

                                ok das habe ich verstanden, ausprobiert und es funktioniert.
                                Kann ich davon ausgehen, wenn die Inhalte der Variablen entweder als E-Mail ankommen oder auf einer anderen .php Seite angezeigt werden und register_globals auf off steht, dass alles gut wird ??
                                bzw. das Script ist schon mal eine Nummer sicherer?
                                Dann kann ich mich ja vielleicht jetzt mal an die Meldungen und Abfragen machen.

                                Ich danke Dir für all Deine Mühe

                                DANKE

                                1. n'Abend!

                                  Kann ich davon ausgehen, wenn die Inhalte der Variablen entweder als E-Mail ankommen oder auf einer anderen .php Seite angezeigt werden und register_globals auf off steht, dass alles gut wird ??

                                  Nett formuliert... und - ja.  :-)

                                  bzw. das Script ist schon mal eine Nummer sicherer?

                                  Dein Script war ja noch verhältnismäßig einfach, ich habe da kein konkretes Sicherheitsproblem gesehen - ich wollte nur aus Prinzip schon mal "HALT!" schreien, damit sich nicht Gewohnheiten einschleichen, die vielleicht später mal zum Problem werden könnten.

                                  Ich danke Dir für all Deine Mühe

                                  Yo, da nich für!

                                  Schönen Abend noch,

                                  Martin

  2. Hallo

    es bringt auch nix, wenn du $message verwendest bevor sie gefüllt wird.

    grüße Chris