Cy: Formularübergabe leer? Mailer verliert Formatierung

hallo,
ich habe einen Mailer geschrieben. Die Nachricht soll über ein normales HTML Textarea-Feld übergeben werden.

<form action="exec/sendnews.php" method=post target=_blank enctype=text/plain>
ist da die Form Definition. Das Problem ist, es wird anscheinend nichts übergeben.

Wenn ich das enctype weglasse, bekomme ich die Variablen $message und $subject übergeben.

Wenn ich sie senden will, dann verliert der Newsletter jegliche formatierung- der Zeilenumbruch ist weg usw.
Ein nachträgliches Eintragen von von \n befördert ein \n zutage.

Ich bitte dringend um Hilfe, weil der Kunde mit im Nacken sitzt, und ich keine Ahnung habe was da los ist.

Viele Grüße und Danke
Chris

  1. Moin

    <form action="exec/sendnews.php" method=post target=_blank enctype=text/plain>
    ist da die Form Definition. Das Problem ist, es wird anscheinend nichts übergeben.

    Wenn ich das enctype weglasse, bekomme ich die Variablen $message und $subject übergeben.

    Wenn ich sie senden will, dann verliert der Newsletter jegliche formatierung- der Zeilenumbruch ist weg usw.
    Ein nachträgliches Eintragen von von \n befördert ein \n zutage.

    Ich bitte dringend um Hilfe, weil der Kunde mit im Nacken sitzt, und ich keine Ahnung habe was da los ist.

    Offensichtlich nicht. Erstmal: Des enctype ist da nicht nur falsch notiert (da gehören Anführungszeichen drumrum!) sondern auch falsch. Das willst du nur benutzen, wenn du mailto: als action hast. Ich hab sogar schonmal gesehen, dass text/plain einen Perl-Formmailer vollkommen verwirrt hat, so daß nix mehr ging. (Ich hoffe einfach mal, dass PHP damit klarkommt).

    Zweitens: das mit dem \n ist auch vollkommen ok so. Du hast magic quotes eingeschaltet und dann werden die Backslashes eben escaped. Es würde auch nichts bringen \n hineinzuschreiben, da das eh nicht als Zeilenumbruch interpretiert wird. Stattdessen musst du die Zeilenumbrüche in das Textfeld eingeben.
    Hast du dort zufällig wrap="virtual" oder sowas gesetzt? Eigentlich sollten die Zeilenumbrüche nämlich völlig problemlos mit rüberkommen.

    Was hast du sonst noch gemacht? Hast du vielleicht einen Header gesendet der dem Mailclient einredet, er würde HTML-Code bekommen, dann aber vergessen nl2br() über den Text laufen zu lassen?

    --
    Henryk Plötz
    Grüße aus Berlin

    1. Hallo,
      und erstmal vielen Dank für deine Hilfe. Nachfolgend werde ich deine Kommentare kommentieren :)

      Offensichtlich nicht. Erstmal: Des enctype ist da nicht nur falsch notiert (da gehören Anführungszeichen drumrum!) sondern auch falsch. Das willst du nur benutzen, wenn du mailto: als action hast. Ich hab sogar schonmal gesehen, dass text/plain einen Perl-Formmailer vollkommen verwirrt hat, so daß nix mehr ging. (Ich hoffe einfach mal, dass PHP damit klarkommt).

      Ok alles klar, das ist draußen.

      Zweitens: das mit dem \n ist auch vollkommen ok so. Du hast magic quotes eingeschaltet und dann werden die Backslashes eben escaped. Es würde auch nichts bringen \n hineinzuschreiben, da das eh nicht als Zeilenumbruch interpretiert wird. Stattdessen musst du die Zeilenumbrüche in das Textfeld eingeben.
      Hast du dort zufällig wrap="virtual" oder sowas gesetzt?

      Eigentlich sollten die Zeilenumbrüche nämlich völlig problemlos mit rüberkommen.

      Ja, ich habe wrap=physical gesetzt. Es hatte auch mal funktioniert...

      Was hast du sonst noch gemacht? Hast du vielleicht einen Header gesendet der dem Mailclient einredet, er würde HTML-Code bekommen, dann aber vergessen nl2br() über den Text laufen zu lassen?

      Ok hier eine Beschreibung der Dinge die ich in dem Skript gemacht habe, das die Daten verarbeitet.

      Was ist eigentlich n12br() ?

      Also:
      Er schreibt ein Backup von $message in ein Datei
      Er fragt nach wieviele Emails es zu versenden gibt
      Er legt fest wieviele Emails er auf einmal versenden darf
      Echo eines HTML Heads: Muß sein, da der Mailer mit mehreren Hüben die Mails verschickt. Hier refresht er sich mit diesem Header.
      Er versendet die Emails, mit $message, wobei die Emails dann keinerlei Formatierung mehr aufweisen.

      Ist der Code hilfreich? kann ich jederzeit posten.

      Vielen Dank!
      CY

      --
      Henryk Plötz
      Grüße aus Berlin

      1. Moin

        Was ist eigentlich n12br() ?

        Wandelt Zeilenumbrüche in <br>+Zeilenumbruch um. Wenn du HTML-Code ausgeben willst, und dabei deine Zeilenumbrüche erhalten bleiben sollen, brauchst du das. Hint: http://www.php.net/manual/de/ beantwortet alle deine Fragen zu vorgegebenen Funktionen.

        Ist der Code hilfreich? kann ich jederzeit posten.

        Ja, wäre sehr hilfreich. Ich tippe mal dadrauf dass den Text wieder aus der Datei holst und dabei die Zeilenumbrüche wegwirfst?

        --
        Henryk Plötz
        Grüße aus Berlin

        1. Moin

          Was ist eigentlich n12br() ?

          Wandelt Zeilenumbrüche in <br>+Zeilenumbruch um. Wenn du HTML-Code ausgeben willst, und dabei deine Zeilenumbrüche erhalten bleiben sollen, brauchst du das. Hint: http://www.php.net/manual/de/ beantwortet alle deine Fragen zu vorgegebenen Funktionen.

          Danke, ich sehs mir mal an.

          Ja, wäre sehr hilfreich. Ich tippe mal dadrauf dass den Text wieder aus der Datei holst und dabei die Zeilenumbrüche wegwirfst?

          Nein, der Text bleibt in der Variable $message und wird von dort auch versandt

          Hier der Code:

          // ** INIT

          if (!isset($startfrom))
          {
           $startfrom=0;
           $fp = fopen("../backup/".time().".txt","a-");
           if (fwrite($fp,$message));
           fclose($fp);
          }

          // ** CONNECTION
          $server="host";
          $Benutzer ="ichselbst";
          $Kennwort ="pass";
          $verbindung = mysql_connect($server, $Benutzer, $Kennwort);
          mysql_select_db("datenbank", $verbindung);

          // ** Zaehlen der Emailadressen
          $sql = "
           SELECT *
           FROM LIST_$liste
           WHERE status='1'
           ";
           // Status=1 bedeuted : bekommt den Letter

          $result = mysql_query($sql);
          $menge = mysql_num_rows($result);

          // ** AUSLESEN DER HUB ADRESSEN
          $sql = "
           SELECT *
           FROM LIST_$liste
           WHERE status='1'
           LIMIT $startfrom,$versendenProHub
           ";
          $result = mysql_query($sql);

          // ** START NEXT BERECHNEN / Anhalten des Programmes
          $startnext = $startfrom + $versendenProHub;
          $pruefsumme = $menge + $versendenProHub;
          if ($startnext>$pruefsumme) { killitbaby(); }
          // ** Header
          echo (" <html>
           <head>
           <title> VERSENDE MAIL </title>
           <meta http-equiv="refresh" content="3; URL=sendnews.php?startfrom=$startnext">
             </title>
             <body>
             ");

          echo("<b class=message_ok> -> Backup des Newsletters geschrieben </b><br>");
          // ** Versenden der Emails
          while ($row = mysql_fetch_array($result))
          {
           echo("<b class=text>Versende Email an: ".$row["email"]."</b><br>");
            $headers = "From: ".$fromadress."\r\nReply-To: ".$replyadress."";
           if(!@mail($row["email"],$subject,$message,$headers))
           {
           echo "<b class=message_error> -> FEHLGESCHLAGEN</b><br>";
           }
           else
           {
           echo "<b class=message_ok> -> OK</b><br>";
           }
          }

          echo("</body>");

          function killitbaby()
          {
           echo ("Alle Letter versendet. Das Programm ist beendet.");
           session_destroy();
           die;
          }

          ?>

          --
          Henryk Plötz
          Grüße aus Berlin

          1. Moin

            Nein, der Text bleibt in der Variable $message und wird von dort auch versandt

            Noe, der Text ist gar nirgendwo drin und wird verworfen. Ich kommentier das mal eben.

            // ** INIT

            if (!isset($startfrom))
            {
            $startfrom=0;
            $fp = fopen("../backup/".time().".txt","a-");
            if (fwrite($fp,$message));

            // Sinnlose Anweisung        ^

            fclose($fp);
            }

            [snip]

            // ** Zaehlen der Emailadressen

            [snip]

            $menge = mysql_num_rows($result);

            // *autsch*, du hältst wohl nicht viel von SELECT COUNT(*) ?

            [snip]

            <meta http-equiv="refresh" content="3; URL=sendnews.php?startfrom=$startnext">

            // Abgesehen davon, dass ich das mit header() lösen würde, wird hier gar nichts weiter übergeben. Das ist genauso als würdest du sendnews.php?startfrom=3  (mit beliebigen Werten für 3) in die Addressezeile eintippen. Soll das Skript den Nachrichtentext etwa raten?

            [snip]

            if(!@mail($row["email"],$subject,$message,$headers))

            // Weder $subject noch $message können hier bekannt sein

            [snip]

            ?>

            --
            Henryk Plötz
            Grüße aus Berlin

            1. Moin

              Nein, der Text bleibt in der Variable $message und wird von dort auch versandt

              Noe, der Text ist gar nirgendwo drin und wird verworfen. Ich kommentier das mal eben.

              Die $message und $subject wird doch vom Forumlar hierher übergeben? Das Feld des Formulars heißt eben auch message zb.

              // ** INIT

              if (!isset($startfrom))
              {
              $startfrom=0;
              $fp = fopen("../backup/".time().".txt","a-");
              if (fwrite($fp,$message));
              // Sinnlose Anweisung        ^
              fclose($fp);
              }

              Wieso sinnlos? Die Datei ist gefüllt.

              [snip]

              // ** Zaehlen der Emailadressen
              [snip]
              $menge = mysql_num_rows($result);
              // *autsch*, du hältst wohl nicht viel von SELECT COUNT(*) ?

              Oh, das kenn ich gar nicht. Ich sehs mir an, danke :)

              [snip]

              <meta http-equiv="refresh" content="3; URL=sendnews.php?startfrom=$startnext">
              // Abgesehen davon, dass ich das mit header() lösen würde, wird hier gar nichts weiter übergeben. Das ist genauso als würdest du sendnews.php?startfrom=3  (mit beliebigen Werten für 3) in die Addressezeile eintippen. Soll das Skript den Nachrichtentext etwa raten?

              Ich hatte vor, eine Session am Anfang zu eröffnen, um das alles nicht übergeben zu müssen. Das mit dem Header werd ich mir ansehen :)

              [snip]

              if(!@mail($row["email"],$subject,$message,$headers))
              // Weder $subject noch $message können hier bekannt sein

              Ja wieso?
              Wie gesagt, das Formular solls ja hierher übergeben,
              wieso kann das nciht bekannt sein? Versteh ich nicht.

              Gruß
              CY

              [snip]

              ?>

              --
              Henryk Plötz
              Grüße aus Berlin

              1. Moin

                Wieso sinnlos? Die Datei ist gefüllt.

                Ich meinte das if ( ) ;  ist sinnlos. Da steht "Wenn das Schreiben erfolgreich war, dann tue nichts, wenn das Schreiben nicht erfolgreich war, dann tue auch nichts".

                Wie gesagt, das Formular solls ja hierher übergeben,
                wieso kann das nciht bekannt sein? Versteh ich nicht.

                Wenn du nicht irgendwo noch einen genialen Codeteil aus dem Hut ziehst, ist es aber trotzdem so, dass $message nur einmal, beim Abschicken deines ursprünglichen Formulars übergeben wird. Danach wird dann das Skript immer wieder nur mit dem einzigen Parameter startfrom aufgerufen.

                --
                Henryk Plötz
                Grüße aus Berlin

                1. Moin

                  Wieso sinnlos? Die Datei ist gefüllt.

                  Ich meinte das if ( ) ;  ist sinnlos. Da steht "Wenn das Schreiben erfolgreich war, dann tue nichts, wenn das Schreiben nicht erfolgreich war, dann tue auch nichts".

                  Wie gesagt, das Formular solls ja hierher übergeben,
                  wieso kann das nciht bekannt sein? Versteh ich nicht.

                  Wenn du nicht irgendwo noch einen genialen Codeteil aus dem Hut ziehst, ist es aber trotzdem so, dass $message nur einmal, beim Abschicken deines ursprünglichen Formulars übergeben wird. Danach wird dann das Skript immer wieder nur mit dem einzigen Parameter startfrom aufgerufen.

                  --
                  Henryk Plötz
                  Grüße aus Berlin

                  Hi,
                  ne kein genialer Codeteil, wie gesagt... ne Session hoffentlich :)
                  Ähm, ok dein Tip mit nl2.. hat geholfen. Ich hab jetzt alles da, nur noch eine Frage:
                  Wenn mein Formular " übergibt, wird daraus "
                  Wie stelle ich es an das in der Mail dann wieder " dasteht?

                  Gruß
                  Cy

                  1. Moin

                    Wenn mein Formular " übergibt, wird daraus "
                    Wie stelle ich es an das in der Mail dann wieder " dasteht?

                    http://www.php.net/manual/de/function.stripslashes.php ist dein Freund.

                    --
                    Henryk Plötz
                    Grüße aus Berlin