Kralle: HTML5 , Formular und Versand mittels PHP

0 127

HTML5 , Formular und Versand mittels PHP

Kralle
  • formulare
  • html
  • php
  1. 2
    me-too
    1. 0
      Kralle
      1. 0
        me-too
      2. 3
        tk
  2. 0

    HTML5 , Formular und Versand mittels PHP, XSS und kontextgerechte Behandlung

    me-too
    • html
    • php
    • xss
    1. 0
      Kralle
      1. 0
        Der Martin
        1. 0
          Kralle
          1. 0
            me-too
      2. 0
        tk
  3. 0
    Raketenfehlersuchtrupp
    1. 0
      Kralle
    2. 0
      Kralle
      1. 0
        Matthias Apsel
      2. 0
        Raketenfehlersuchtrupp
  4. 0
    Kralle
    1. 0
      Der Martin
      1. 0
        Kralle
        1. 0
          Matthias Apsel
          1. 0
            Kralle
            1. 0
              Rolf B
              1. 0
                Kralle
            2. 0
              Raketenfehlersuchtrupp
              1. 0
                Kralle
                1. 0
                  Der Martin
                  1. 1
                    Matthias Apsel
                    • formulare
                    • html
                    1. 0
                      Kralle
                      1. 0
                        tk
                      2. 0
                        Raketenfehlersuchtrupp
                    2. 0
                      Der Martin
                      1. 0
                        Julius
                        1. 0
                          Der Martin
                      2. 0
                        Raketenhandbuchvorhleser
                2. 0
                  Raketenfehlersuchtrupp
                  1. 0
                    Kralle
            3. 1
              tk
          2. 0
            Raketenfehlersuchtrupp
            1. 0
              Kralle
              1. 0
                Raketenfehlersuchtrupp
      2. 0
        Raketenfehlersuchtrupp
        1. 0
          Der Martin
          1. 0
            Raketenhandbuchleser
          2. 0
            tk
            1. 0
              Raktenstartbeurteiler
              1. 0
                tk
    2. 0
      Raketenfehlersuchtrupp
  5. 3
    Matthias Apsel
    • meinung
    • sicherheit
    1. 1
      Der Martin
      1. 0
        Raketenfehersuchtrupp
      2. 0
        Kralle
        1. 0
          Matthias Apsel
          1. 0
            me-too
        2. 0
          Raktenhistoriker
    2. 0

      HTML5 , Formular und Versand mittels PHP, Medienbruch vermeiden?

      me-too
      • e-mail
      • formulare
      • sicherheit
  6. 0
    Kralle
    1. 0
      Matthias Apsel
      1. 0
        Kralle
      2. 0
        1unitedpower
    2. 0
      Der Martin
      1. 0
        Matthias Apsel
        1. 0
          Tabellenkalk
          1. 0
            Kralle
            1. 0
              Der Martin
              1. 0
                Kralle
                1. 1
                  Der Martin
                  1. 1
                    Raketenpostsystem
                    1. 0
                      Kralle
                      1. 0
                        Raketenpostsystem
                        1. 0
                          Kralle
                          1. 0
                            Julius
                      2. 0
                        Der Martin
                        1. 0
                          Kralle
                          1. 0
                            Der Martin
                          2. 0
                            Julius
                            1. 0
                              Kralle
                              1. 0
                                Julius
                                1. 0
                                  Kralle
                                  1. 0
                                    Tabellenkalk
                                    1. 0
                                      Der Martin
                                      1. 0
                                        Raketenwilli
                                      2. 0
                                        Kralle
                                    2. 0
                                      Kralle
                                      1. 0
                                        Der Martin
                                        1. 0
                                          Kralle
                                          1. 0
                                            tk
                                          2. 0
                                            Der Martin
                                            1. 1
                                              Kralle
                                              1. 0
                                                Der Martin
                                                1. 0
                                                  klawischnigg
                                                  1. 0
                                                    Der Martin
                                                    • menschelei
                                                    1. 0
                                                      Matthias Apsel
                                                      1. 0
                                                        Robert B.
                                                    2. 0
                                                      Robert B.
                                                      1. 0
                                                        MudGuard
                                                        1. 1
                                                          Robert B.
                                                          1. 0

                                                            Kopierer, Versicherung, txt→pdf→txt

                                                            Raketenclown
                                                            • humor
                                                            • menschelei
                                          3. 1
                                            Julius
                                          4. 0

                                            Wohl gelöst.

                                            Raketenwilli
                                            1. 0
                                              Matthias Apsel
                                            2. 2
                                              Julius
                                              1. 1
                                                Der Martin
                                                1. 0
                                                  mb_wordwrap für Grobmotoriker
                                                2. 0
                                                  Raketenwilli
                                              2. 1
                                                Raketenwilli
                                                1. 0

                                                  Mails mit mb_send_mail und Zeilenlängen - Ist wordwrap notwendig?

                                                  Raketentestpilot
                                              3. 0

                                                wordwrap() für utf8?

                                                me-too
                                                • e-mail
                                                • internet
                                                • php
                                                1. 0

                                                  wordwrap() für utf8? - Nein! Das wird von mb_send_mail() mit BASE64 codiert und dann gewrappt!

                                                  Raketentestpilot
                                                  1. 0

                                                    mb_send_mail() und seine Nutzungsvarianten

                                                    me-too
                                                    1. 0
                                                      Der Martin
                                                      1. 0

                                                        Aufbau eines Emails

                                                        Raketenwissenschaftler
                                                        1. 0
                                                          Der Martin
                                                      2. 0
                                                        Raketenwissenschaftler
                                                        1. 0
                                                          Der Martin
                                                          1. 0
                                                            Raketenwissenschaftler
                                                          2. 0
                                                            Raketenwissenschaftler
                                                    2. 0
                                                      Raketenwissenschaftler
                                                    3. 0
                                                      Raketenwissenschaftler
                                      2. 1
                                        Julius
                                        1. 0

                                          HTML5 , Formular und Versand mittels PHP, falsche Dateiendung?

                                          me-too
                                          1. 1
                                            Der Martin
                                            1. 0

                                              Betreff anpassen?

                                              me-too
                                              • ux
                                              • zu diesem forum
                                              1. 1
                                                Julius
                            2. 0
                              LarryWalker
          2. 0
            Der Martin
      2. 0
        Kralle
    3. 0
      Robert B.
      • e-mail

Moin,

ich möchte den Eingaben eines Formulars mittels PHP verschicken. Das ich so etwas gemacht habe, ist schon lange her. Früher wurde der PHP-Teil mit im <header> platziert. Egel ob ich den PHP-Teil jetzt Header oder oberhalb des Form platziere, der Validator des W3C meckert.

    Error: Saw <?. Probable cause: Attempt to use an XML processing instruction in HTML. (XML processing instructions are not supported in HTML.)

    At line 37, column 5

    ular</h1>↩↩	 	<?php↩			$betref

    Error: Bad value <?=$_SERVER[PHP_SELF]; ?> for attribute action on element form: Illegal character in path segment: < is not allowed.

    From line 45, column 6; to line 46, column 32

    ?>↩	↩					<form name="kontaktFormular" method="post" action="<?=$_SERVER[PHP_SELF]; ?>"     onSubmit="return isValid()">

Mein PHP-Teil sieht so aus:

<?php
			$betreff = "LUG - Anfrage vom Kontaktformular";
			$nachricht = $_POST["message"];
			$empfaenger="max.musterman@musterseite.de";
			if(($nachricht!='')&&($betreff!='')
				mail($empfaenger, $betreff, $vname, $nname, $email, $message, $send);
		?>

Wo ist mein Fehler?

Gruß Heiko

akzeptierte Antworten

  1. Hi,

    der Fehler liegt darin, dass den HTML-Validator der PHP-Code gar nichts angeht.

    Der sollte bei ordnungsgemäß eingerichtetem PHP auf dem Webserver bereits ausgeführt und umgewandelt worden sein, sodass beim Validator nur noch HTML ankommt.

    Entweder hast Du also deine Quelldatei mitteös Upload zum Validator geschickt, oder, wenn Du dem einen Link gesendet hast, humpelt dein Webserver. PHP wird dort nicht ausgeführt.

    LG
    me-too

    1. Moin,

      da ich noch beim Bau der Seite bin, habe ich die Seite tatsächlich per Upload an den Validator geschickt.

      Wenn wir schon dabei sind ... Wo platziere ich nach aktuellem Stand, den PHP-Code? Im <header> oder direkt vor dem <form> oder an ganz anderer Stelle?

      Gruß Heiko

      1. Hi Heiko,

        da ich noch beim Bau der Seite bin, habe ich die Seite tatsächlich per Upload an den Validator geschickt.

        Wenn wir schon dabei sind ... Wo platziere ich nach aktuellem Stand, den PHP-Code? Im <header> oder direkt vor dem <form> oder an ganz anderer Stelle?

        Das ist Geschmackssache.
        Ich trenne HTML und PHP immer soweit es möglich ist. Zuerst der gesamte operative (aktive) Teil des PHP-Codes, in dem alle Ausgaben in Variablen (Output-Array )gerechnet werden.

        Dann am Ende der HTML-Teil, in dem nur noch kurze ("passive") PHP-Ausgaben der vorberechneten Variablen stattfinden.

        Oder als Alternative PHP und HTML ganz trennen. Im HTML werden Platzhalter eingebaut, die dem Validator nicht weh tun und die dann durch das PHP-Skript per str_replace() (Arrayvariante) durch die Werte ausgetauscht werden.

        Das wird dann aber spätestens bei revolvierenden Beschreibungselementen (Tabellen, Listen, ...) kompliziert.

        LG
        me-too

      2. Hallo Heiko,

        da ich noch beim Bau der Seite bin, habe ich die Seite tatsächlich per Upload an den Validator geschickt.

        Das funktioniert – wie du ja gemerkt hast – nicht. Der Validator kann nur die HTML-Seite testen die dann tatsächlich beim Browser ankommt - wenn du die Seite aktuell nur lokal hast kannst du auch den Quelltext kopieren und testen.

        Wo platziere ich nach aktuellem Stand, den PHP-Code? Im <header> oder direkt vor dem <form> oder an ganz anderer Stelle?

        Du meinst wohl <head>, <header> ist was anderes - aber: an keiner der Stellen. Der PHP-Code gehört ganz an den Anfang der Datei, noch vor <!DOCTYPE html>. Erst werden die Eingaben geholt, dann die Daten verarbeitet und erst zum Schluss wird das Ergebnis ausgegeben (hier als HTML) - siehe EVA-Prinzip.

        Gruß,
        Tobias

  2. Hi nochmal,

    ich bin eben noch nicht darauf eingegangen. Aber deine PHP-Ausgaben müssen noch kontextgerecht behandelt werden. PHP_SELFist ohne htmlspecialchars() ein Angriffsvektor füf XSS.

    LG
    md-too

    1. Moin,

      wo muss ich denn htmlspecialchars() einsetzen? Für jeden Variablen Wert den ich aus dem Formular empfange?

      Gruß Heiko

      1. Hallo,

        wo muss ich denn htmlspecialchars() einsetzen?
        Für jeden Variablen Wert den ich aus dem Formular empfange?

        nein, umgekehrt: Für jeden Wert, den du wieder als HTML ausgibst.

        Live long and pros healthy,
         Martin

        --
        Ich stamme aus Ironien, einem Land am sarkastischen Ozean.
        1. Moin,

          aber würde das nicht bedeuten, das ich das gar nicht brauche, solange ich keinen HTML-Text ausgeben will oder verstehe ich das jetzt falsch?

          Gruß Heiko

          1. Hi,

            aber würde das nicht bedeuten, das ich das gar nicht brauche, solange ich keinen HTML-Text ausgeben will oder verstehe ich das jetzt falsch?

            Ja.
            Aber auch das dynamische Befüllen von Attributwerten (z.B. action) oder die Erzeugung von Lknks mittels PHP sind Ausgaben.

            LG
            me-too

      2. Hallo Heiko,

        wo muss ich denn htmlspecialchars() einsetzen?

        Wie Martin schon schrieb: immer wenn du etwas als HTML ausgibst, also der Kontext wechselt (auch Fortsetzung beachten).

        Gruß,
        Tobias

  3. <?=$_SERVER[PHP_SELF]; ?>
    

    Wo ist mein Fehler?

    Wenn denn nur einer (Anzahl: 1) wäre.

    1. Wieso bekommt ein HTML-Validator PHP zu „sehen“?
    2. Wieso steht da nicht <?=htmlspecialchars( $_SERVER[PHP_SELF]); ?>?
    3. Hast Du mal ins Error-Log geschaut? Da sollte eine Warnung stehen, weil Du <?=htmlspecialchars( $_SERVER['PHP_SELF']); ?> notieren sollst, damit das auch morgen noch klappt.

    Ganz schön viel für 26 Zeichen.

    $betreff = "LUG - Anfrage vom Kontaktformular";
    # … zwei Zeilen
    if(($nachricht!='')&&($betreff!='')
    

    So kann man heizen. Erst $betreff statisch befüllen und dann prüfen, ob was drin steht. Tipp: Mit einem regulärem Ausdruck wird es noch schneller schön warm.

    Gibts jemanden in der LUG (das meint oft: Linux-User-Group) der sich auskennt?

    1. Moin,

      das mit dem htmlspecialchars() hat man mir gerade schon geschrieben und jetzt weiß ich auch wo hin damit.

      Der Betreff sollte in der IF-Klausel gar nicht mehr drinstehen (Kopierfehler).

      Auch ist die Abfrage als solches falsch, denn wenn die $message leer ist, dann soll die Mail natürlich nicht versandt werden.

      Gruß Heiko

    2. Moin,

      wenn ich <?=htmlspecialchars( $_SERVER[PHP_SELF]); ?> einsetze, dann erhalte ich diese Meldung:

      Error: Bad value <?=htmlspecialchars( $_SERVER[PHP_SELF]); ?> for attribute action on element form: Illegal character in path segment: < is not allowed.
      
      From line 46, column 6; to line 47, column 32
      
      */↩	↩					<form name="kontaktFormular" method="post" action="<?=htmlspecialchars( $_SERVER[PHP_SELF]); ?>"     onSubmit="return isValid()">
      1. Hallo Kralle,

        wenn ich <?=htmlspecialchars( $_SERVER[PHP_SELF]); ?> einsetze, dann erhalte ich diese Meldung: < is not allowed.

        Bei dir wird kein PHP ausgeführt.

        Bis demnächst
        Matthias

        --
        Du kannst das Projekt SELFHTML unterstützen,
        indem du bei Amazon-Einkäufen Amazon smile (Was ist das?) nutzt.
        1. Noch immer bekommt der HTML-Validator Deinen PHP-Code vorgelegt: Wenn man einen Bauplan zum TÜV bringt und behauptet, das wäre ein Auto, dann bekommt man auch keine Plakette. Wenn Du und also verrätst, wie Du den Validator fütterst, dann könnten wir Dir genauer sagen, was los ist.

        2. Wenn es denn mal soweit funktioniert wird das immer noch folgende Warnung ausgeben:

        PHP Warning:
        Use of undefined constant PHP_SELF - assumed 'PHP_SELF'
        (this will throw an Error in a future version of PHP)…
        
  4. Moin,

    ich glaube ich habe da ein grundlegendes Problem.

    1. Wie ich jetzt von Euch erfahren habe, kann ich kein Upload zu Validator machen, wenn ich PHP einsetze. Fazit: Nur noch gegen die URL testen.

    2. Ich sollte meinen "action"-Teil ändern. Also so: action="<?=htmlspecialchars( $_SERVER[PHP_SELF]); ?>"

    3. Ich sollte entweder auf direkt auf dem Server oder in einer XAMPP-Umgebung arbeiten wenn ich mehr als HTML und CSS einsetze.

    Frage, ist dieser PHP-Script jetzt so richtig:

    <?php
    			$betreff = "LUG - Anfrage vom Kontaktformular";
    			$nachricht = $_POST["message"];
    			$empfaenger="max.musterman@musterseite.de";
    			if(($nachricht!='')&&($email!='')
    				mail($empfaenger, $betreff, $vname, $nname, $email, $message, $send);
    		?>
    

    Langsam kommen mir da Zweifel, wenn ich mir das auf verschiedenen Seiten so anschaue.

    Also, ich habe die Seite jetzt auf den Server geladen. PHP-Teil ganz oben.

    Aber, der Form-Action-Teil sorgt noch immer für eine Meldung.

        Error: Saw <?. Probable cause: Attempt to use an XML processing instruction in HTML. (XML processing instructions are not supported in HTML.)
    
        At line 1, column 2
    
        <?php↩			$betref
    
        Error: Bad value <?=htmlspecialchars( $_SERVER[PHP_SELF]); ?> for attribute action on element form: Illegal character in path segment: < is not allowed.
    
        From line 47, column 6; to line 48, column 32
    
        */↩	↩					<form name="kontaktFormular" method="post" action="<?=htmlspecialchars( $_SERVER[PHP_SELF]); ?>"     onSubmit="return isValid()">

    Gruß Heiko

    1. Hallo,

      Frage, ist dieser PHP-Script jetzt so richtig:

      <?php
      			$betreff = "LUG - Anfrage vom Kontaktformular";
      			$nachricht = $_POST["message"];
      			$empfaenger="max.musterman@musterseite.de";
      			if(($nachricht!='')&&($email!='')
      				mail($empfaenger, $betreff, $vname, $nname, $email, $message, $send);
      		?>
      

      auf gar keinen Fall.

      Langsam kommen mir da Zweifel, wenn ich mir das auf verschiedenen Seiten so anschaue.

      Aus gutem Grund. Du übergibst 7 Parameter an mail(), die Funktion erwartet aber nur maximal 4: Empfänger, Betreff, die Nachricht an sich, und optional zusätzliche Header.

      Live long and pros healthy,
       Martin

      --
      Ich stamme aus Ironien, einem Land am sarkastischen Ozean.
      1. Okay, das bedeutet, ich muss die $nachricht vorher aus den anderen Werten zusammenbauen und muss dann bei mail dann auch noch die richte Reihenfolge einhalten. Ist meine If-Abfrage denn richtig?

        Gruß Heiko

        1. Hallo Kralle,

          Ist meine If-Abfrage denn richtig?

          Nein.

          Zudem ist auch $nachricht = $_POST["message"]; unsinnig und gefährlich.

          Bis demnächst
          Matthias

          --
          Du kannst das Projekt SELFHTML unterstützen,
          indem du bei Amazon-Einkäufen Amazon smile (Was ist das?) nutzt.
          1. Also, ich habe den ganzen PHP-Teil geändert.

            <?php
            			/* Empänger der Nachricht */
            			$empfaenger = "max.musterman@musterseite.de";
            			$betreff = "LUG - Anfrage vom Kontaktformular";
            			/* Daten aus dem Formular Variablen zuweisen */
            			$vorname = $_POST["vname"];
            			$nachname = $_POST["nname"];
            			$email = $_POST["email"];
            			$nachricht = $_POST["message"];
            			/* Ein formatierte E-Mail daraus machen */
            			$message .= 'Moin, ' . "\n";
            			$message .= $vname . ' '. $nname . 'möchte folgendes wissen/fragen/mitteilen' . "\n";
            			$message .= $nachricht. "\n";
            			$message .= '  ' . "\n";
            			$message .= 'Antwort bitte an: '. $email . "\n";									
            			/* header zusammen bauen */
            			$header -= 'From:' . $email . "\n";
            			$header -= 'Replay-To:' . $email . "\n";
            			$header -= "Content-type: text/plain; charset=UTF-8 \r\n";
            			if(($nachricht!='')&&($email!='')
            				mail($empfaenger, $betreff, $message, $header);
            				echo "Ihre Nachricht wurde &uuml;bermittelt. Vielen Dank!";
            		?>
            
            

            Quelle dafür war: https://susanne-lueders.de/blog/ein-kontaktformular-mit-php-programmieren

            Ist den der action-Teil mit

            <form name="kontaktFormular" method="post" action="<?=htmlspecialchars( $_SERVER[PHP_SELF]); ?>"
            

            richtig?

            Gruß Heiko

            1. Hallo Kralle,

              <form name="kontaktFormular" method="post" action="<?=htmlspecialchars( $_SERVER[PHP_SELF]); ?>"
              

              PHP_SELF musst Du in Anführungszeichen setzen. Andernfalls bekommst Du, wie schon geschrieben, eine Warnung für ein undefiniertes Symbol.

              <form name="kontaktFormular" method="post" action="<?=htmlspecialchars( $_SERVER["PHP_SELF"]); ?>"
              

              Man könnte einwenden, dass Anführungszeichen in Anführungszeichen geschachtelt werden, aber weil sie einmal Teil von HTML und einmal Teil von PHP sind, ist das hier nicht relevant.

              /* header zusammen bauen */
              			$header -= 'From:' . $email . "\n";
              			$header -= 'Replay-To:' . $email . "\n";
              			$header -= "Content-type: text/plain; charset=UTF-8 \r\n";
              

              Hä? Ich habe irgendwann einmal einen BASIC-Dialekt unter den Fingern gehabt, der das - mit Semantik für Strings belegt hat, es hat Leerzeichen abgeschnitten und am Ende gesammelt. Aber in PHP ist das nicht der Fall. Hier musst Du zum Verketten von Strings immer den Punkt-Operator oder für eine Verkettung mit Zuweisung das .= nehmen. Ein -= konvertiert die Operatoren in Zahlen und subtrahiert.

              Rolf

              --
              sumpsi - posui - obstruxi
              1. Moin Rolf,

                /* header zusammen bauen */
                			$header -= 'From:' . $email . "\n";
                			$header -= 'Replay-To:' . $email . "\n";
                			$header -= "Content-type: text/plain; charset=UTF-8 \r\n";
                

                Hä? Ich habe irgendwann einmal einen BASIC-Dialekt unter den Fingern gehabt, der das - mit Semantik für Strings belegt hat, es hat Leerzeichen abgeschnitten und am Ende gesammelt. Aber in PHP ist das nicht der Fall. Hier musst Du zum Verketten von Strings immer den Punkt-Operator oder für eine Verkettung mit Zuweisung das .= nehmen. Ein -= konvertiert die Operatoren in Zahlen und subtrahiert.

                Rolf

                In der ersten Zeile einen zu weit auf der Tastatur und dann zweimal kopiert. :-)

                Gruß Heiko

                Edit Rolf B: Zitat gefixt

            2. Du solltest da noch einiges entschärfen:

              und mb_send_mail() verwenden, weil Du ich sonst auch noch um die Kodierung kümmern musst.

              <form name="kontaktFormular" method="post" action="<?=htmlspecialchars( $_SERVER[PHP_SELF]); ?>">
              
              1. Da fehlen immer noch die Quotas (', ") um den String 'PHP_SELF':
              <form action="<?=$_SERVER[PHP_SELF];?>">
              

              … errechnet in meiner Testumgebung:

              <form action="PHP Warning:  Use of undefined constant PHP_SELF - assumed 'PHP_SELF' (this will throw an Error in a future version of PHP) in /tmp/test on line 4
              PHP Stack trace:
              PHP   1. {main}() /tmp/test:0
              test">
              
              1. Das geht viel kürzer und ergo viel sicherer:
              <form name="kontaktFormular" method="post">
              
              1. Wenn Du das mal action-attribut mal angeben musst, dann gib es statisch an, sonst hast Du einen Wust an Sicherheitsprpblemen am Hals:
              htmlspecialchars( $url, ENT_QUOTES | ENT_HTML5 );
              

              wäre wohl das mindeste…

              1. Hmm,

                wenn ich nur <form name="kontaktFormular" method="post"> nutze, woher weiß dann das PHP-Script, das es jetzt dran ist?

                Das mit dem action-Attribut htmlspecialchars( $url, ENT_QUOTES | ENT_HTML5 ); verstehe ich nicht. Wo muß ich das denn jetzt wo eintragen?

                Gruß Heiko

                1. Hi,

                  wenn ich nur <form name="kontaktFormular" method="post"> nutze, woher weiß dann das PHP-Script, das es jetzt dran ist?

                  wenn das action-Attribut eines Formulars fehlt oder nur ein Leerstring ist, gilt als Defaultwert die Adresse der Seite, die das Formular enthält. Das Formular wird sozusagen "an sich selbst" verschickt.

                  Live long and pros healthy,
                   Martin

                  --
                  Ich stamme aus Ironien, einem Land am sarkastischen Ozean.
                  1. Hallo Der Martin,

                    wenn das action-Attribut […] ein Leerstring ist,

                    handelt es sich um ungültiges HTML.

                    Bis demnächst
                    Matthias

                    --
                    Du kannst das Projekt SELFHTML unterstützen,
                    indem du bei Amazon-Einkäufen Amazon smile (Was ist das?) nutzt.
                    1. Dann müsste ich also so etwas machen: <form action="test.php" method="post"> und mein Script in die datei "test.php" auslagern.

                      Richtig?

                      Gruß Heiko

                      1. Hallo Heiko,

                        Richtig?

                        Nein. Lass das action-Attribut einfach weg und gut ist.

                        Das action-Attribut darf fehlen (dann nimmt der Browser die aktuelle Adresse als Ziel), aber eben nicht leer sein - das war alles was Matthias richtig stellen wollte.

                        Gruß,
                        Tobias

                      2. Nochmal: Nein!

                        Wenn Du action nicht angibst, dann schickt der Browser die Daten an die aktuelle URL. Und das ist vorliegend genau das, was Du willst. Du willst es ihm nur auf eine absolut umständliche, missverständliche und unsichere Weise beibringen.

                    2. Hallo,

                      wenn das action-Attribut […] ein Leerstring ist,

                      handelt es sich um ungültiges HTML.

                      war das mal anders? Ich habe action="" nämlich schon oft gesehen, auch in diversen Tutorials.
                      Was natürlich kein Beweis für die Richtigkeit ist - daher meine verunsicherte Nachfrage.

                      Live long and pros healthy,
                       Martin

                      --
                      Ich stamme aus Ironien, einem Land am sarkastischen Ozean.
                      1. Hallo Der Martin,

                        wenn das action-Attribut […] ein Leerstring ist,

                        handelt es sich um ungültiges HTML.

                        war das mal anders?

                        Bei HTML 4 soll es eine URI sein. Ein leerer String ist keine URI, würde ich mal behaupten.

                        Gruß
                        Julius

                        1. Hallo Julius,

                          wenn das action-Attribut […] ein Leerstring ist,

                          handelt es sich um ungültiges HTML.

                          war das mal anders?

                          Bei HTML 4 soll es eine URI sein. Ein leerer String ist keine URI, würde ich mal behaupten.

                          leider stoße ich beim Folgen der zahlreichen Verlinkungen gerade nur auf Watte: Samtweiche Aussagen und nichts Hartes dahinter.
                          Aber ich meine mich zu erinnern, dass ein Leerstring eine gültige URI sei. Die Diskussion ging in die Richtung "protokoll-relativ, server-relativ, dokument-relativ", und da zu keinem der URI-Anteile eine Angabe gemacht wird, gilt die Basis-URI.

                          Aber ich finde gerade nichts, was mein Gedächtnis in der Richtung stützt.

                          Live long and pros healthy,
                           Martin

                          --
                          Ich stamme aus Ironien, einem Land am sarkastischen Ozean.
                      2. Zweiter Google-Treffer bei einer Suche nach form "html5 w3c":

                        https://www.w3.org/TR/2014/REC-html5-20141028/forms.html#attr-fs-action

                        The action and formaction content attributes, if specified, must have a value that is a valid non-empty URL potentially surrounded by spaces.

                        Ich habe action="" nämlich schon oft gesehen

                        Leider sogar beim MDN. Aber der Pilot Quirx geht wie folgt vor „Leerer String?“ → „Falsch!“ → „So tun, als ob es nicht da wäre!“ → „Oh! Ja da schau her: Das selbe Resultat!“

                2. Das mit dem action-Attribut htmlspecialchars( $url, ENT_QUOTES | ENT_HTML5 ); verstehe ich nicht. Wo muß ich das denn jetzt wo eintragen?

                  JETZT? Meine Ansage, war, es jetzt GAR NICHT zu verwenden.

                  1. Jetzt ja :-)

                    Gruß Heiko

            3. Hallo Heiko,

              $header -= 'From:' . $email . "\n"; $header -= 'Replay-To:' . $email . "\n"; $header -= "Content-type: text/plain; charset=UTF-8 \r\n";

              den Fehler mit -= statt .= hat Rolf ja schon genannt, zusätzlich sind aber noch die Zeilenenden falsch: die müssen überall \r\n sein, nicht nur \n. Generell wäre es aber auch sinnvoller nicht mail() zum Verschicken der Mails zu verwenden sondern eine fertige Bibliothek – oder wie Matthias schrieb gleich einfach nur eine E-Mailadresse angeben.

              if(($nachricht!='')&&($email!='')

              da ist ein Syntax-Fehler drin, du schließt die runde Klammer nach if nicht und die geschweifte Klammer um die beiden folgenden Zeilen fehlt auch.

              echo "Ihre Nachricht wurde &uuml;bermittelt. Vielen Dank!";

              Es gibt keinen Grund Umlaute zu verst&uuml;mmeln, du hast deine Seite doch UTF-8 codiert gespeichert, oder?

              Quelle dafür war: […]

              Die Seite ist bereits 6 Jahre alt und an der Stelle an der die Autorin von einer "if-Schleife" redet hat sie sich selbst disqualifiziert, auch einige deiner Fehler sind schon auf der Seite zu finden.

              Ist den der action-Teil mit

              <form name="kontaktFormular" method="post" action="<?=htmlspecialchars( $_SERVER[PHP_SELF]); ?>"
              

              richtig?

              Nein, da fehlen immer noch die Anführungszeichen um »PHP_SELF« - da du allerdings ohnehin auf die gleiche Seite verweisen willst kannst du auch das action-Attribut ganz weg lassen.

              Gruß,
              Tobias

          2. Zudem ist auch $nachricht = $_POST["message"]; unsinnig und gefährlich

            Wir sollten wenigstens versuchen zu erklären, warum das so ist:

            Ein böswilliger Besucher könnte auf die Idee kommen, als Nachricht etwas wie

            <script>alert("böse");</script> 
            

            zu hinterlassen.

            Manche Mailclients (besonders, aber nicht nur Webmailer) sind so versessen darauf, die Mails als HTML zu interpretieren, dass diese das auch dann tun, wenn im Header des Mails eigentlich „plaintext“ angekündigt wurde. Auch MS-Outlook hat das mal getan. Manche davon wieder führen sogar Javascript aus, und manche Webbrowser sind auch so veraltet, dass die sich (z.B. im Falle eines Webmailers) nicht um Verbote aus HTTP-Headern kümmern und das also ausführen. Das alert("böse") ist nur eine harmlose DEMO…

            Naja. Und wie vor wenigen Stunden an anderer Stelle nachzulesen war ist die „Updatepolitik“ so mancher Firma einer Überprüfung zu unterziehen...

            1. Moin,

              Zudem ist auch $nachricht = $_POST["message"]; unsinnig und gefährlich

              Wir sollten wenigstens versuchen zu erklären, warum das so ist:

              Ein böswilliger Besucher könnte auf die Idee kommen, als Nachricht etwas wie

              <script>alert("böse");</script> 
              

              zu hinterlassen.

              Wie macht man denn richtig? Ich dachte durch das htmlspecialchars im action würde das Problem beseitigt?

              Oder verstehe ich das ganze immer noch falsch?

              Gruß Heiko

              1. Wie macht man denn richtig? Ich dachte durch das htmlspecialchars im action würde das Problem beseitigt?

                Nein. Hier geht es um den Inhalt der Nachricht. Nicht um die Adresse des Skriptes. Du musst also alles behandeln, was in die Nachricht einfließt.

                Oder verstehe ich das ganze immer noch falsch?

                Das denke ich wohl.

                Du wirst nach ein paar Tagen nach Veröffentlichung des Kontaktformulars merken, was da so alles eingegeben wird und dass Kontaktformular-Spam „lediglich ärgerlich“ ist.

      2. die Funktion erwartet aber nur maximal 4:

        Das ist schon mal fast richtig:

        PHP Warning:  mail() expects at most 5 parameters, 7 given
        

        Das Handbuch sagt, der optionale fünfte Parameter seien die zusätzlichen Optionen für das versendende Programm (normalerweise sendmail)

        1. Hallo,

          die Funktion erwartet aber nur maximal 4:

          Das ist schon mal fast richtig:

          PHP Warning:  mail() expects at most 5 parameters, 7 given
          

          Das Handbuch sagt, der optionale fünfte Parameter seien die zusätzlichen Optionen für das versendende Programm (normalerweise sendmail)

          stimmt, den 5. Parameter hatte ich glatt übersehen (und selbst noch nie verwendet). Meine Güte, immer diese off-by-one-errors!

          Live long and pros healthy,
           Martin

          --
          Ich stamme aus Ironien, einem Land am sarkastischen Ozean.
          1. stimmt, den 5. Parameter hatte ich glatt übersehen (und selbst noch nie verwendet)

            Ich habe dafür bis jetzt auch noch nie einen Anlass gesehen. Die Optionen werden vor allem dann benötigt, wenn sich bei einem Aufruf von sendmail ein eher ungewöhnliches Programm meldet. Mehr erfährt man mit man sendmail auf dem Server. Allerdings könnte man das auch in der php.ini konfigurieren:

            ; For Unix only.  You may supply arguments as well (default: "sendmail -t -i").
            ; http://php.net/sendmail-path
            ;sendmail_path =
            
            ; Force the addition of the specified parameters to be passed as extra parameters
            ; to the sendmail binary. These parameters will always replace the value of
            ; the 5th parameter to mail().
            ;mail.force_extra_parameters =
            
          2. Hallo Martin,

            Das Handbuch sagt, der optionale fünfte Parameter seien die zusätzlichen Optionen für das versendende Programm (normalerweise sendmail)

            stimmt, den 5. Parameter hatte ich glatt übersehen (und selbst noch nie verwendet).

            Ich habe den 5. Parameter durchaus schon gebraucht: bei meinem ehemaligen Provider war/ist es nötig über den 5. Parameter eine gültige Absender-E-Mail-Adresse zu setzen (mit -f davor). Wenn man das nicht gemacht hat (und auch in der Administrationsoberfläche keine Standard-Adresse gesetzt hat), wurde die Mail nicht verschickt – das hat natürlich für viele Fragen im Kundenboard dort gesorgt …

            Gruß,
            Tobias

            1. bei meinem ehemaligen Provider

              Du wist wohl genau wissen, warum ein Test von dessen Eigenschaft $isEhemalig == true ergibt.

              Oder hast Du gar nicht versucht, im 4. Parameter die header From: und Reply-To: zu besetzen?

              1. Hallo,

                bei meinem ehemaligen Provider

                Du wist wohl genau wissen, warum ein Test von dessen Eigenschaft $isEhemalig == true ergibt.

                Ja, aber die Sache mit dem 5. Parameter bei mail() hat nichts damit zu tun :-)

                Oder hast Du gar nicht versucht, im 4. Parameter die header From: und Reply-To: zu besetzen?

                Das hätte nichts gebracht: es musste wirklich als 5. Parameter ein -f gueltige-adresse@example.com angegeben werden, wobei die Adresse in der Admin-Oberfläche angelegt, aber nicht identisch mit der Angabe im From-Header sein muss.

                Gruß,
                Tobias

    2. Frage, ist dieser PHP-Script jetzt so richtig:

      <?php
      			$betreff = "LUG - Anfrage vom Kontaktformular";
      			$nachricht = $_POST["message"];
      			$empfaenger="max.musterman@musterseite.de";
      			if(($nachricht!='')&&($email!='')
      				mail($empfaenger, $betreff, $vname, $nname, $email, $message, $send);
      		?>
      

      Falsch ist (mindestens):

      mail($empfaenger, $betreff, $vname, $nname, $email, $message, $send);
      

      Im Einzelnen:

      • Die die Werte/Parameter für mail sind grundsätzlich falsch. → Handbuch

      • Wenn Du UTF-8-kodierte Strings übergibts, dann wäre wenn schon mb_sendmail() der Kandidat der Wahl. → Handbuch

      • Du besetzt die Variable $nachricht und versendest $message. Was in $vname, $nname, $email, $message, $send steht ist völlig unklar und die gehören da auch nicht hin.

  5. Hallo Kralle,

    ich möchte den Eingaben eines Formulars mittels PHP verschicken. Das ich so etwas gemacht habe, ist schon lange her.

    Ich vermute eher, du hast sowas noch nie gemacht.

    Früher wurde der PHP-Teil mit im <header> platziert.

    Verwechselst du vielleicht PHP mit JavaScript? Dass "header" hier ohnehin falsch ist, wurde schon erwähnt.

    Wo ist mein Fehler?

    Es wäre einfacher, auf das Kontaktformular zu verzichten und stattdessen im Impressum der Seite eine Mail-Adresse als Kontaktmöglichkeit anzugeben. Ein Kontaktformular ist nur Ziel für Angreifer, du musst dich selbst um die Sicherheit kümmern. Bei einer Mail-Adresse kann der Spam bereits durch den Provider herausgefiltert werden.

    Bis demnächst
    Matthias

    --
    Du kannst das Projekt SELFHTML unterstützen,
    indem du bei Amazon-Einkäufen Amazon smile (Was ist das?) nutzt.
    1. Hallo,

      Als Ergänzung:

      Es wäre einfacher, auf das Kontaktformular zu verzichten und stattdessen im Impressum der Seite eine Mail-Adresse als Kontaktmöglichkeit anzugeben.

      nicht stattdessen. Eine e-Mail-Adresse ist nach allgemeiner Lesart sowieso Pflicht im Impressum.

      Ein Kontaktformular ist nur Ziel für Angreifer, du musst dich selbst um die Sicherheit kümmern. Bei einer Mail-Adresse kann der Spam bereits durch den Provider herausgefiltert werden.

      Und sieh es mal aus Nutzersicht: Ein Kontaktformular ist ein Notbehelf. Bei der Kontaktaufnahme per e-Mail habe ich viel mehr Freiheiten - und das Doppel-Plus: Ich habe in "Sent Items" automatisch eine Kopie meines Anschreibens. Mit Datum!

      Wenn ich also mit einer wie auch immer gearteten Organisation Kontakt aufnehmen will, suche ich lieber noch fünf Minuten länger und finde eventuell eine e-Mail-Adresse.

      Live long and pros healthy,
       Martin

      --
      Ich stamme aus Ironien, einem Land am sarkastischen Ozean.
      1. Eine e-Mail-Adresse ist nach allgemeiner Lesart sowieso Pflicht im Impressum.

        Nein. Nur eine "Adresse für die schnelle elektronische Kontaktaufnahme". Dank des unsäglichen Überflusses an Gummi beim Gesetzgeber ist der auch hier ins Gesetz geflossen und damit reicht auch als "Adresse für die schnelle elektronische Kontaktaufnahme" auch die eines Kontaktformulars…

      2. Eine E-Mailadresse im Impressum ist schön und gut, aber wer hat die wirklich noch so auf der Seite, das man sie einfach kopieren kann? Entweder versucht man mittels JavaScript die Adresse vor Spamern zu schützen oder man baut solche Konstrukte:

        teo[punkt]mustermann[at]muster[bindestrich]welt[punkt]de gruselig.

        Da hat man mit einem Kontaktformular im Hintergrund doch mehr Möglichkeiten. Wenn man dann noch PHP anstatt JS nimmt, dann kann man die ganze Seite nutzen ohne JS aktivieren zu müssen.

        Ob wie das Formular dann nachher wirklich nutzen müssen wir uns noch überlegen. Damit ich das aber morgen zeigen kann, würde ich es natürlich gern fehlerfrei und soweit wie möglich sicher haben.

        Gruß Heiko

        1. Hallo Kralle,

          Eine E-Mailadresse im Impressum ist schön und gut, aber wer hat die wirklich noch so auf der Seite, das man sie einfach kopieren kann?

          https://selfhtml.org/impressum.html

          Ich erhalte über ein Kontaktformular einer anderen Seite – die ich hier nicht nenne – wesentlich mehr Spam als hierüber.

          Da hat man mit einem Kontaktformular im Hintergrund doch mehr Möglichkeiten.

          Ja? Welche denn?

          Wenn man dann noch PHP anstatt JS nimmt, dann kann man die ganze Seite nutzen ohne JS aktivieren zu müssen.

          Hä?

          Damit ich das aber morgen zeigen kann, würde ich es natürlich gern fehlerfrei und soweit wie möglich sicher haben.

          Das wird wohl nichts werden. Mir scheint, dir fehlen wirklich viele Grundlagen.

          Bis demnächst
          Matthias

          --
          Du kannst das Projekt SELFHTML unterstützen,
          indem du bei Amazon-Einkäufen Amazon smile (Was ist das?) nutzt.
          1. Dieser Beitrag wurde gelöscht: Der Beitrag ist unkonstruktiv oder provokativ und trägt zu einer Verschlechterung der Stimmung bei.
        2. Eine E-Mailadresse im Impressum ist schön und gut, aber wer hat die wirklich noch so auf der Seite, das man sie einfach kopieren kann?

          <span>per Email:</span>username<script>document.write('&#64;');</script><noscript style="display:inline"><div style="display:inline">&#64;</div></noscript>hostname

          Reicht seit langer Zeit. Das Resultat (hier: username@hostname) kann man kopieren. Wer es schwieriger machen will kann den spans und divs noch unsinnige und zufällige Klassennamen, IDs oder andere Eigenschaften verpassen…

    2. Hi,

      Das ich so etwas gemacht habe, ist schon lange her.

      Ich vermute eher, du hast sowas noch nie gemacht.

      Vielleicht fragt er ja deshalb hier?

      Es wäre einfacher, auf das Kontaktformular zu verzichten und stattdessen im Impressum der Seite eine Mail-Adresse als Kontaktmöglichkeit anzugeben. Ein Kontaktformular ist nur Ziel für Angreifer, du musst dich selbst um die Sicherheit kümmern. Bei einer Mail-Adresse kann der Spam bereits durch den Provider herausgefiltert werden.

      Eigensinniger Rat! :-(

      Wenn er den Medienbruch vermeiden will, ist ein Kontaktformular durchaus der richtige Weg.

      Wenn kein (eigener) Mailclient zur Verfügung steht, wäre dies einer von mehreren guten Gründen dafür. Das wäre z.B. im Internetlokal und von fremden Geräten der Fall. Man kann einen Emailkontakt aber gerne zusätzlich anbieten.

      Und wie man technisches Spamming durch Kontaktformulare vermeidet, wurde in diesem Forum imho oft genug diskutiert (nicht durch Captchas, aber das wäre der Suchbegriff fürs Archiv).

      Manuell verfassten inhaltlichen Spam kann man mit etwas mehr Aufwand auch verhindern; der kommt aber selten vor.

      Grüße
      me-too

  6. **Ich möchte mich an dieser Stelle erst einmal für die vielen Informationen und Eure Geduld bedanken. **Ich wollte das eigentlich bei jedem einzeln mittels des Buttons "Positiv Bewerten" unter den Beiträgen machen, aber die scheinen nicht zu funktionieren.

    Da ich keinen Zugriff auf die Server-Logfiles habe, kann ich leider auch nicht sehen, was es für eine Meldung gibt, wenn ich das Formular abschicke.

    Ich habe das jetzt zweimal abgeschickt, aber eine Mail kam bei mir nicht an.

    Müsste das jetzt eigentlich laufen?

    	<form name="kontaktformular" method="post"> 
    
    <?php
    			/* Empänger der Nachricht (bei mehreren Empfängrn diese durch Komma trennen */
    			$empfaenger = "test@peitschende-wei.de";
    			$betreff = "LUG - Anfrage vom Kontaktformular";
    			/* Daten aus dem Formular Variablen zuweisen */
    			$vorname = $_POST["vname"];
    			$nachname = $_POST["nname"];
    			$email = $_POST["email"];
    			$nachricht = $_POST["message"];
    			/* Auf 70 Zeichen pro Zeile begrenzen */
    			$nachricht = wordwrap($nachricht, 70, "\r\n");
    			/* Ein formatierte E-Mail daraus machen */
    			$message .= 'Moin, ' . "\r\n";
    			$message .= $vname . ' '. $nname . 'möchte folgendes wissen/fragen/mitteilen' . "\r\n";
    			$message .= $nachricht . "\r\n";
    			$message .= '  ' . "\r\n";
    			$message .= 'Antwort bitte an: ' . $email . "\r\n";									
    			/* header zusammen bauen */
    			$header .= 'From:' . $email . "\r\n";
    			$header .= 'Replay-To:' . $email . "\r\n";
    			$header .= "Content-type: text/plain; charset=UTF-8 \r\n";
    			if(($nachricht != '')&&($email != ''))
    				{
    					mail($empfaenger, $betreff, $message, $header);
    					echo "Ihre Nachricht wurde übermittelt. Vielen Dank!";
    				}
    		?>
    

    Wenn ja, dann scheint sendmail auf dem Server nicht aktiv zu sein, obwohl ein

    <?php
    phpinfo();
    ?>
    

    Was anderes sagt.

    Gruß Heiko

    1. Hallo Kralle,

      **Ich möchte mich an dieser Stelle erst einmal für die vielen Informationen und Eure Geduld bedanken. **Ich wollte das eigentlich bei jedem einzeln mittels des Buttons "Positiv Bewerten" unter den Beiträgen machen, aber die scheinen nicht zu funktionieren.

      Du brauchst mindestens 50 Punkte, um einen Beitrag positiv bewerten zu können.

      <?php
      			/* Daten aus dem Formular Variablen zuweisen */
      			$vorname = $_POST["vname"];
      			$nachname = $_POST["nname"];
      			$email = $_POST["email"];
      			$nachricht = $_POST["message"];
      

      Das Umkopieren ist nicht notwendig. Benutzereingaben 1:1 zu übernehmen und ohne Kontrolle weiterzuleiten, ist möglicherweise gefährlich.

      			if(($nachricht != '')&&($email != ''))
      

      Diese Überprüfung kannst du doch schon ganz am Anfang vornehmen. Was passiert eigentlich wenn meine E-Mail lautet?

      Bis demnächst
      Matthias

      --
      Du kannst das Projekt SELFHTML unterstützen,
      indem du bei Amazon-Einkäufen Amazon smile (Was ist das?) nutzt.
      1. Moin,

        Du brauchst mindestens 50 Punkte, um einen Beitrag positiv bewerten zu können.

        Aha, danke für die Info.

        Das Umkopieren ist nicht notwendig. Benutzereingaben 1:1 zu übernehmen und ohne Kontrolle weiterzuleiten, ist möglicherweise gefährlich.

        Auf der rechte Seite des Gleichheitszeichen kann ich noch mehr machen, wenn das Formular als solches erst einmal funktioniert.

        			if(($nachricht != '')&&($email != ''))
        

        Diese Überprüfung kannst du doch schon ganz am Anfang vornehmen.

        Stimmt, dann würde der Rest nicht durchlaufen werden müssen.

        Was passiert eigentlich wenn meine E-Mail lautet?

        Dann bekomme ich eine Nachricht mit "leerem" E-Mail-Feld. Sollte man noch ein Trim-Befehl vorschalten.

        Gruß Heiko

      2. Das Umkopieren ist nicht notwendig. Benutzereingaben 1:1 zu übernehmen und ohne Kontrolle weiterzuleiten, ist möglicherweise gefährlich.

        Das Umkopieren schadet nicht. Variablenwerte müssen natürlich vor der Ausgabe in HTML oder vor dem Einfügen in SQL-Anfragen entschärft werden. Ich vermute, darauf wolltest du hinaus. Dafür spielt die Herkunft der Daten aber keine Rolle.

    2. Hallo,

      **Ich möchte mich an dieser Stelle erst einmal für die vielen Informationen und Eure Geduld bedanken. **Ich wollte das eigentlich bei jedem einzeln mittels des Buttons "Positiv Bewerten" unter den Beiträgen machen, aber die scheinen nicht zu funktionieren.

      du darfst andere Beiträge voten, wenn du a) registriert bist (das ist ja offensichtlich der Fall) und b) selbst mindestens 50 Punkte auf dem Konto hast (das entspricht 5 Gut-Votes).

      Da ich keinen Zugriff auf die Server-Logfiles habe, kann ich leider auch nicht sehen, was es für eine Meldung gibt, wenn ich das Formular abschicke.

      Hä?

      <?php
      			/* Empänger der Nachricht (bei mehreren Empfängrn diese durch Komma trennen */
      			$empfaenger = "test@peitschende-wei.de";
      			$betreff = "LUG - Anfrage vom Kontaktformular";
      			/* Daten aus dem Formular Variablen zuweisen */
      			$vorname = $_POST["vname"];
      			$nachname = $_POST["nname"];
      			$email = $_POST["email"];
      			$nachricht = $_POST["message"];
      

      Das stumpfe Umkopieren der Daten ist nach wie vor sinnlos.

      			/* Auf 70 Zeichen pro Zeile begrenzen */
      			$nachricht = wordwrap($nachricht, 70, "\r\n");
      			/* Ein formatierte E-Mail daraus machen */
      			$message .= 'Moin, ' . "\r\n";
      

      Entscheide dich bitte: $nachricht oder $message.

      			$message .= $vname . ' '. $nname . 'möchte folgendes wissen/fragen/mitteilen' . "\r\n";
      			$message .= $nachricht . "\r\n";
      			$message .= '  ' . "\r\n";
      			$message .= 'Antwort bitte an: ' . $email . "\r\n";									
      			/* header zusammen bauen */
      			$header .= 'From:' . $email . "\r\n";
      

      Halt! $header ist bis hierher noch gar nicht definiert. Die Erstzuweisung darf nicht mit dem Operator .= erfolgen.

      			$header .= 'Replay-To:' . $email . "\r\n";
      			$header .= "Content-type: text/plain; charset=UTF-8 \r\n";
      

      Und hier baust du ungeprüft die vom Besucher eingegebene Mailadresse ein. Okay, die Mail geht vermutlich nur an dich oder einen LUG-Admin, trotzdem sollte man das nicht machen. Da kann jeder Dreck drinstehen! So baust du eine Spamschleuder. Stell dir vor, jemand gibt als Mailadresse folgendes ein:

      me@example.org\r\ncc: donald.duck@waltdisney.com

      Ja, das Beispiel ist lächerlich; es soll nur das Prinzip zeigen.

      Wenn ja, dann scheint sendmail auf dem Server nicht aktiv zu sein

      Dann würde der Aufruf von mail() ein false zurückgeben. Das prüfst du aber gar nicht.

      Live long and pros healthy,
       Martin

      --
      Ich stamme aus Ironien, einem Land am sarkastischen Ozean.
      1. Hallo Der Martin,

        Entscheide dich bitte: $nachricht oder $message.

        $nachricht ist die Mitteilung aus dem Formular, $message wird der zu versendende Mailtext.

        Bis demnächst
        Matthias

        --
        Du kannst das Projekt SELFHTML unterstützen,
        indem du bei Amazon-Einkäufen Amazon smile (Was ist das?) nutzt.
        1. Hallo,

          $nachricht ist die Mitteilung aus dem Formular, $message wird der zu versendende Mailtext.

          Dann ist da aber immernoch der .=-Fehler, den Heiko auch schon beim $header hat.

          Gruß
          Kalk

          1. Habe beide ".="-Fehler raus genommen.

            Bekomme trotzdem keine Mail :-(

            Muss da unbedingt noch die Abfrage von "mail" reinmachen.

            Gruß Heiko

            1. Hallo,

              Habe beide ".="-Fehler raus genommen.

              Bekomme trotzdem keine Mail :-(

              Muss da unbedingt noch die Abfrage von "mail" reinmachen.

              ja, mach das. Unabhängig davon: Bei manchen Webhostern muss man im Kundencenter (oder wie das auch immer heißt) erst ein Mail-Postfach anlegen und für den Versand von Mails durch PHP "freischalten". Da solltest du noch nachforschen, wie das bei deinem Hoster ist.

              Live long and pros healthy,
               Martin

              --
              Ich stamme aus Ironien, einem Land am sarkastischen Ozean.
              1. Hmm, da es nicht mein Hoster ist, werde ich mal den Eigentümer fragen. Kann ich das so deuten, dass das Script eigentlich laufen müsste?

                Gruß Heiko

                1. Hi,

                  Hmm, da es nicht mein Hoster ist, werde ich mal den Eigentümer fragen.
                  Kann ich das so deuten, dass das Script eigentlich laufen müsste?

                  naja, das will ich jetzt nicht in allen Facetten mit "ja" beantworten, weil vielleicht noch einige kapitale Bugs drinstecken, die bis jetzt keiner von uns gesehen hat.
                  Meines Erachtens müsste aber zumindest irgendeine e-Mail verschickt werden, auch wenn der Inahlt möglicherweise noch "strubbelig" ist oder Daten fehlen - vorausgesetzt, der Mailversand ist providerseitig freigeschaltet.

                  Apropos: In irgendeinem anderen Posting habe ich gesehen, dass du die Mailadresse des Besuchers, der das Formular ausfüllt, als From:-Header einträgst. Das könnte auch ein Fettnäpfchen sein. Oft muss da die Adresse eines gültigen Postfachs auf eben diesem Webspace angegeben werden. Oder From: komplett weglassen.
                  Eine server-fremde Mailadresse ist als angeblicher Absender wahrscheinlich nicht erlaubt.

                  Live long and pros healthy,
                   Martin

                  --
                  Ich stamme aus Ironien, einem Land am sarkastischen Ozean.
                  1. Apropos: In irgendeinem anderen Posting habe ich gesehen, dass du die Mailadresse des Besuchers, der das Formular ausfüllt, als From:-Header einträgst. Das könnte auch ein Fettnäpfchen sein.

                    Ja. Und das wahrscheinlich sogar ungeprüft!

                    https://forum.selfhtml.org/self/2020/jun/07/html5-formular-und-versand-mittels-php/1771660#m1771660

                    $header .= 'Replay-To:' . $email . "\r\n";
                    

                    und

                    $header .= 'From:' . $email . "\r\n";
                    

                    Weg damit! Oder wenigstens mit

                    $header[] = 'Replay-To:' . filter_var($email, FILTER_VALIDATE_EMAIL));
                    $header=implode( PHP_EOL, $header);
                    

                    (vor PHP 7.2)

                    $header['Replay-To'] = filter_var($email, FILTER_VALIDATE_EMAIL));
                    

                    (PHP 7.2+)

                    zusammensetzen und verbauen.

                    Mit dem from-Header kann es gehen, muss aber nicht oder der wird eh überschrieben. Spätestens beim Transport werden wohl manche Mailserver manches Mail nicht haben wollen - wenn nämlich der sendende Server nicht zum SPIFF-Eintrag der Domain der Absenderadresse passt.

                    Es ist also geradezu zweckverhindernd, die Mailadresse des Benutzers der Webseite da anzugeben.

                    1. Moin,

                      ich habe jetzt im From eine von meinen gültigen E-Mailadressen eingetragen und das Formular mal bei meinem Provider abgelegt. Das Error-Log aktiviert, das Formular ausgefüllt und abgeschickt. Keine Einträge im LOG.

                      Der echo-Befehl ist ja auf der "normalen"-Seite nicht zu sehen. Gibt es z.B. im FF eine Möglichkeit sich auch solche Ausgaben anzeigen zu lassen?

                      Gruß Heiko

                      1. Keine Einträge im LOG.

                        Ja. Und sonst? (Mail angekommen? Annahme behauptet? …)

                        1. Keine Mail angekommen und die Echo-Meldungen aus dem Script bekomme ich nicht zu sehen. Deshalb fragte ich ja, wie ich mir die Echo-Ausgaben anzeigen lassen kann. Oder muss ich mir für jede Ausgabe eine Extra-HTML-Seite erstellen?

                          Gruß Heiko

                          1. Hallo Kralle,

                            Keine Mail angekommen und die Echo-Meldungen aus dem Script bekomme ich nicht zu sehen.

                            mail() liefert einen boolschen Wert zurück. Den müsstest du erst casten, um ihn mittels echo ausgeben zu können. Benutze stattdessen lieber var_dump():

                            var_dump(mail([]));
                            

                            Doku: https://www.php.net/var_dump

                            Gruß
                            Julius

                      2. Hallo,

                        ich habe jetzt im From eine von meinen gültigen E-Mailadressen eingetragen und das Formular mal bei meinem Provider abgelegt.
                        Das Error-Log aktiviert, das Formular ausgefüllt und abgeschickt.
                        Keine Einträge im LOG.

                        und wenn du den From-Header ganz weglässt?
                        Lass doch mal den Server ergänzen, wie er's für richtig hält.

                        Der echo-Befehl ist ja auf der "normalen"-Seite nicht zu sehen.

                        Ähm, wie? Nein, doch natürlich!
                        Alles, was du mit echo ausgibst, geht direkt in den Browser-Quelltext.

                        Gibt es z.B. im FF eine Möglichkeit sich auch solche Ausgaben anzeigen zu lassen?

                        Ja klar. Hinschauen!
                        Oder ich verstehe nicht, was du gemeint hast.

                        Live long and pros healthy,
                         Martin

                        --
                        Ich stamme aus Ironien, einem Land am sarkastischen Ozean.
                        1. Das mit weglassen werde ich probieren.

                          Die Echo-Ausgabe muss so schnell sein, das ich nichts davon zu sehen bekomme.

                          Gruß Heiko

                          1. grübel ...

                            Die Echo-Ausgabe muss so schnell sein, das ich nichts davon zu sehen bekomme.

                            ich kann dir nicht folgen.

                            Live long and pros healthy,
                             Martin

                            --
                            Ich stamme aus Ironien, einem Land am sarkastischen Ozean.
                          2. Hallo Kralle,

                            Die Echo-Ausgabe muss so schnell sein, das ich nichts davon zu sehen bekomme.

                            Ich glaube, du hast noch nicht verstanden, wie PHP funktioniert: Es erzeugt ein Dokument (im einfachsten Fall eines, das als HTML sein soll), das anschließend zum Browser geschickt und dargestellt wird. Es kann also nicht sein, dass dieser einmal ausgegebene Wert nach einer gewissen Zeit einfach wieder verschwindet.

                            Gruß
                            Julius

                            1. Moin,

                              		if(($nachricht != '')&&($email != ''))
                              				{
                              					$result = mail($empfaenger, $betreff, $message);
                              						if(!$result) { 
                              							echo "Error"; 
                              						} else { 
                              							echo "Success"; 
                              						} 
                              						echo "Ihre Nachricht wurde übermittelt. Vielen Dank!";
                              				} else {
                              						echo "Ich konnte die Nachricht nicht zustellen.";
                              				}
                              

                              Nicht einer der Texte wir auf dem Bildschirm angezeigt.

                              Gruß Heiko

                              1. Hallo Kralle,

                                		if(($nachricht != '')&&($email != ''))
                                				{
                                					$result = mail($empfaenger, $betreff, $message);
                                						if(!$result) { 
                                							echo "Error"; 
                                						} else { 
                                							echo "Success"; 
                                						} 
                                						echo "Ihre Nachricht wurde übermittelt. Vielen Dank!";
                                				} else {
                                						echo "Ich konnte die Nachricht nicht zustellen.";
                                				}
                                

                                Nicht einer der Texte wir auf dem Bildschirm angezeigt.

                                Dann scheitert es vielleicht schon am ersten if? Spendier dem doch ebenfalls ein else.

                                Gruß
                                Julius

                                1. Hallo Kralle,

                                  		if(($nachricht != '')&&($email != ''))
                                  				{
                                  					$result = mail($empfaenger, $betreff, $message);
                                  						if(!$result) { 
                                  							echo "Error"; 
                                  						} else { 
                                  							echo "Success"; 
                                  						} 
                                  						echo "Ihre Nachricht wurde übermittelt. Vielen Dank!";
                                  				} else {
                                  						echo "Ich konnte die Nachricht nicht zustellen.";
                                  				}
                                  

                                  Nicht einer der Texte wir auf dem Bildschirm angezeigt.

                                  Dann scheitert es vielleicht schon am ersten if? Spendier dem doch ebenfalls ein else.

                                  Das hat doch ein else.

                                  Gruß
                                  Julius

                                  1. Hallo,

                                    Nicht einer der Texte wir auf dem Bildschirm angezeigt.

                                    Dann scheitert es vielleicht schon am ersten if?

                                    Kommt vom Script überhaupt irgendein echo? Testest du überhaupt mit dem Script, von dem du glaubst, das sei es?

                                    Gruß
                                    Kalk

                                    1. Hi,

                                      Nicht einer der Texte wir auf dem Bildschirm angezeigt.

                                      Dann scheitert es vielleicht schon am ersten if?

                                      Kommt vom Script überhaupt irgendein echo? Testest du überhaupt mit dem Script, von dem du glaubst, das sei es?

                                      und noch eins weiter gefragt: Kann man sich das mal irgendwo "live" anschauen, um sich selbst ein Bild zu machen?

                                      Live long and pros healthy,
                                       Martin

                                      --
                                      Ich stamme aus Ironien, einem Land am sarkastischen Ozean.
                                      1. Kann man sich das mal irgendwo "live" anschauen, um sich selbst ein Bild zu machen?

                                        Der vollständige Quelltext würde mir reichen...

                                      2. Hmm,

                                        und noch eins weiter gefragt: Kann man sich das mal irgendwo "live" anschauen, um sich selbst ein Bild zu machen?

                                        Im Moment nicht, da in dem Script E-Mailadressen benutzt werden, für die ich noch keine Alternative eingerichtet habe.

                                        Ich werde morgen zwei Adressen einrichten und dann die URL zum Script auf meiner Homepage, hier posten.

                                        Jetzt ist Tatort-Zeit (ein Hoch auf Timeshift).

                                        Gruß Heiko

                                    2. Moin,

                                      Kommt vom Script überhaupt irgendein echo?

                                      Ich sehe keines

                                      Testest du überhaupt mit dem Script, von dem du glaubst, das sei es?

                                      ??? Das Script ist doch mit in der HTML-Datei.

                                      Gruß HEiko

                                      1. Mahlzeit,

                                        Kommt vom Script überhaupt irgendein echo?

                                        Ich sehe keines

                                        dann sind wir wieder am Anfang: Wird PHP überhaupt ausgeführt?
                                        Guck in den Quellcode, den der Browser bekommt (Ctrl-U): Steht da noch PHP-Code drin? Ja? Na also, dann ist dieser Code gar nicht ausgeführt worden!

                                        Live long and pros healthy,
                                         Martin

                                        --
                                        Ich stamme aus Ironien, einem Land am sarkastischen Ozean.
                                        1. Das ist ja Verrückt.

                                          Warum wird auch bei mir kein PHP ausgeführt?

                                          Das Formular liegt jetzt unter http://www.heiko-rompel.de/kontakt.html

                                          und bei mir ist PHP aktiv. Ich nutze auf dem gleichen Server, unter einer anderen URL Joomla, was ohne PHP nicht gehen würde.

                                          Gruß Heiko

                                          So, jetzt aber ab zum "Tatort".

                                          1. Hallo Heiko,

                                            Warum wird auch bei mir kein PHP ausgeführt?

                                            Weil Dateien die auf .html enden standardmäßig nicht von PHP geparst werden.

                                            Gruß,
                                            Tobias

                                          2. Hallo Heiko,

                                            Das ist ja Verrückt.

                                            Warum wird auch bei mir kein PHP ausgeführt?

                                            Das Formular liegt jetzt unter http://www.heiko-rompel.de/kontakt.html

                                            Bingo!!

                                            In Dateien mit der Endung .html wird normalerweise kein PHP interpretiert. Dafür müsstest du die Datei schon auf .php umbenennen (oder tief in die Serverkonfiguration eingreifen).

                                            So, jetzt aber ab zum "Tatort".

                                            Etwa 45° links von mir läuft auf RTL Dan Browns "Inferno".

                                            Live long and pros healthy,
                                             Martin

                                            --
                                            Ich stamme aus Ironien, einem Land am sarkastischen Ozean.
                                            1. Guten Abend,

                                              Bingo!!

                                              In Dateien mit der Endung .html wird normalerweise kein PHP interpretiert. Dafür müsstest du die Datei schon auf .php umbenennen (oder tief in die Serverkonfiguration eingreifen).

                                              AUA. Da hätte ich ja noch Wochen lang suchen können. Und was lerne ich daraus? Das ich bei der nächsten Frage gleich einen Link zur Seite mit schicke, dann wäre es wahrscheinlich gleich aufgefallen und man hätte ganz anderes an die Fehlersuchen gehen können.

                                              **Ich kann mich als erstes nur Entschuldigen, das ich nicht gleich einen Link gepostet habe und dann kann ich mich nur erneut dafür Bedanken, das Ihr mir geholfen habt und dabei so einen langen Atem dabei hattet.

                                              Ich gelobe Besserung.**

                                              Gruß Heiko

                                              1. n'Abend Heiko,

                                                Bingo!!

                                                AUA. Da hätte ich ja noch Wochen lang suchen können.

                                                naja, das ist ein generelles Problem beim hilfesuchenden Kontakt zwischen Laien und Experten: Die Laien wissen oft gat nicht, welche Details wichtig sind und welche nicht.
                                                Hotline-Mitarbeiter: Ja, was steht denn nun bei Ihnen auf dem Bildschirm?
                                                Anrufer: Eine kleine Blumenvase.

                                                Ich merke das auch oft, wenn meine Eltern mich am Telefon um Hilfe bitten, weil der PC nicht exakt das tut, was sie erwarten. Ich muss da manchmal schon sehr stark auf meine Phantasie setzen, um überhaupt das Problem zu verstehen. Wenn ich dagegen am Wochenende mal zu Besuch bin und selbst vor der Kiste sitze, sehe ich das Problem meist sehr viel klarer.

                                                Und was lerne ich daraus?
                                                Das ich bei der nächsten Frage gleich einen Link zur Seite mit schicke, dann wäre es wahrscheinlich gleich aufgefallen und man hätte ganz anderes an die Fehlersuchen gehen können.

                                                Gut! Das könnte uns in Zukunft die Hilfe sehr erleichtern. Denn dann können wir gezielt auf die Kleinigkeiten achten (oft auch unbewusst), die wir für wichtig halten.

                                                Ich gelobe Besserung.

                                                Amen. 😉
                                                Und hat sich der Tatort gelohnt?
                                                Für mich ist Tatort eigentlich nur mit ein paar wenigen Teams sehenswert. Wachtveitl und Nemec gehören nicht dazu. Aber bitte, Geschmackssache.

                                                Live long and pros healthy,
                                                 Martin

                                                --
                                                Ich stamme aus Ironien, einem Land am sarkastischen Ozean.
                                                1. Hi there,

                                                  Hotline-Mitarbeiter: Ja, was steht denn nun bei Ihnen auf dem Bildschirm?
                                                  Anrufer: Eine kleine Blumenvase.

                                                  Muß ein ziemlicher alter Gag sein...(oder eine Blumenvase mit eingebautem Kreiselstabilisator)...😉

                                                  Ich merke das auch oft, wenn meine Eltern mich am Telefon um Hilfe bitten, weil der PC nicht exakt das tut, was sie erwarten. Ich muss da manchmal schon sehr stark auf meine Phantasie setzen, um überhaupt das Problem zu verstehen.

                                                  Genau. Und weil meine Phantasie bei weitem nicht ausreicht, die digitalen Gedankengänge meiner weit über 80 Jahre alten Eltern zu verstehen, hab ich zuerst Teamviewer installiert und dann einfach immer meinen Neffen hingeschickt...

                                                  1. Hallo,

                                                    Hotline-Mitarbeiter: Ja, was steht denn nun bei Ihnen auf dem Bildschirm?
                                                    Anrufer: Eine kleine Blumenvase.

                                                    Muß ein ziemlicher alter Gag sein...

                                                    ja, ist er. Noch aus der Zeit der Röhrenmonitore. Allerdings hat eine Kollegin von mir immerhin seitlich am Rand Ihres TFT-Monitors eine ganz schlanke Vase angeclipst[1], fast schon ein Reagenzglas, mit einer Plastikblume drin.

                                                    (oder eine Blumenvase mit eingebautem Kreiselstabilisator)...😉

                                                    Das wäre doch auch mal originell!

                                                    Ich merke das auch oft, wenn meine Eltern mich am Telefon um Hilfe bitten, weil der PC nicht exakt das tut, was sie erwarten. Ich muss da manchmal schon sehr stark auf meine Phantasie setzen, um überhaupt das Problem zu verstehen.

                                                    Genau. Und weil meine Phantasie bei weitem nicht ausreicht, die digitalen Gedankengänge meiner weit über 80 Jahre alten Eltern zu verstehen, hab ich zuerst Teamviewer installiert und dann einfach immer meinen Neffen hingeschickt...

                                                    Is' natürlich auch eine Maßnahme. 😀
                                                    Bisher haben wir's aber meist auf die herkömmliche Weise hinbekommen.

                                                    Live long and pros healthy,
                                                     Martin

                                                    --
                                                    Ich stamme aus Ironien, einem Land am sarkastischen Ozean.

                                                    1. An einer Halterung, die vom Hersteller eigentlich zum Festklemmen von Zetteln oder Broschüren gedacht war, die man abtippt. Aber wer macht das heute noch ... ↩︎

                                                    1. Hallo Der Martin,

                                                      Allerdings hat eine Kollegin von mir immerhin seitlich am Rand Ihres TFT-Monitors eine ganz schlanke Vase angeclipst[1], fast schon ein Reagenzglas, mit einer Plastikblume drin.

                                                      https://www.ifa-freunde-rostock.de/img/n/v/TDSC03906.jpg

                                                      Bis demnächst
                                                      Matthias

                                                      --
                                                      Du kannst das Projekt SELFHTML unterstützen,
                                                      indem du bei Amazon-Einkäufen Amazon smile (Was ist das?) nutzt.

                                                      1. An einer Halterung, die vom Hersteller eigentlich zum Festklemmen von Zetteln oder Broschüren gedacht war, die man abtippt. Aber wer macht das heute noch ... ↩︎

                                                      1. Moin,

                                                        https://www.ifa-freunde-rostock.de/img/n/v/TDSC03906.jpg

                                                        ist das da die Turbo-Taste neben dem Touch-Wheel?

                                                        Viele Grüße
                                                        Robert

                                                    2. Moin,

                                                      Allerdings hat eine Kollegin von mir immerhin seitlich am Rand Ihres TFT-Monitors eine ganz schlanke Vase angeclipst[1], fast schon ein Reagenzglas, mit einer Plastikblume drin.

                                                      Also ein Kölsch-Glas 😝

                                                      Und wer heute noch Zettel abtippt? Das kommt öfter vor, als man glaubt: Digitales Dokument ausdrucken, weitergeben oder faxen und dann wieder eintippen. Das ist diese Digitalisierung, von der alle reden – digitus ist der lateinische Name der Finger.

                                                      (oder eine Blumenvase mit eingebautem Kreiselstabilisator)...😉

                                                      Das wäre doch auch mal originell!

                                                      Definitiv!

                                                      Viele Grüße
                                                      Robert


                                                      1. An einer Halterung, die vom Hersteller eigentlich zum Festklemmen von Zetteln oder Broschüren gedacht war, die man abtippt. Aber wer macht das heute noch ... ↩︎

                                                      1. Hi,

                                                        Und wer heute noch Zettel abtippt? Das kommt öfter vor, als man glaubt: Digitales Dokument ausdrucken, weitergeben oder faxen und dann wieder eintippen. Das ist diese Digitalisierung, von der alle reden – digitus ist der lateinische Name der Finger.

                                                        Was bei einem großen Versicherer passiert ...

                                                        cu,
                                                        Andreas a/k/a MudGuard

                                                        1. Hallo Andreas,

                                                          Was bei einem großen Versicherer passiert ...

                                                          Beim Einscannen sollte man allerdings nur den Scans trauen, die man selbst gefälscht hat.

                                                          Viele Grüße
                                                          Robert

                                                          1. Beim Einscannen sollte man allerdings nur den Scans trauen, die man selbst gefälscht hat.

                                                            Sicherlich war Xerox da von einem Anwalt beraten, der behauptet hat, durch die kleinen Veränderungen würde(n):

                                                            • neue „Werke“ entstehen
                                                            • Urheberechtsverletzungen bezüglich der eingescannten „Werke“ unmöglich
                                                            • Xerox könnte selbst Urheberrechte an den neuen Werken geltend machen.

                                                            Was tut es da schon, wenn die Zahlen in den Werken nicht stimmen? Ein gewisser GvG soll sich schon 1986 um die Generalrechtevertretung für Deutschland bemüht haben…

                                                            Versicherung (txt→print→txt; txt→pdf→txt)

                                                            Später wurde das dann modernisiert - wir sollten die Daten nicht mehr als Text, sondern als PDF liefern (Datenformat immer noch gleich). Auch kein Problem - einfach den Text an den Pdf-Generator übergeben. Auch hier wieder die Frage nach dem Warum. Antwort: unsere OCR-Software kann nur PDF - und erzeugt daraus dann eine Textdatei, die dann an den Sachbearbeiter gemailt wird.

                                                            Wir machen also aus dem Text ein PDF, das dann per OCR wieder zu Text wird …

                                                            Naja.

                                                            1. (Einfache Antwort:) Sowas kommt raus, wenn man nur großen Firmen vertraut.
                                                            2. („Schwierige“ Antwort:) Das korrekte Einlesen einer Textdatei wurde ja unter Windows durch die Einführung von verschiedener Kodierungen für Nicht-ASCII-Texte für mehrere Jahrzehnte nahezu unmöglich, mindestens unwahrscheinlich.
                                          3. Hallo Kralle,

                                            Das ist ja Verrückt.

                                            Warum wird auch bei mir kein PHP ausgeführt?

                                            Merke dir das für zukünftige Debugging Sessions:
                                            Bei Problemen immer mit dem Browser den Quelltext der Seite anschauen, er zeigt dir, was dein Browser wirklich erhalten hat – Dann wäre dir auch viel früher aufgefallen, dass der Code gar nicht ausgeführt wurde, dir aber auch nicht angezeigt wurde, weil dein Browser ihn natürlich „nicht versteht“ und wegen der spitzen Klammern drumherum < > schlicht als unbekanntes HTML-Element ohne End-Tag </bla> und ohne Inhalt interpretiert:

                                            Gruß
                                            Julius

                                          4. So, jetzt aber ab zum "Tatort".

                                            http://www.heiko-rompel.de/kontakt.html war spannend genug. Ich hab Dir, um eine ausufernde und ewig dauernde Diskussion zu vermeiden, die Lösung an die im Quelltext sichtbare Adresse geschickt.

                                            Aussagen dazu:

                                            • Ich bin, um es zurückhaltend zu sagen, ein wenig enttäuscht weil Du meine Tipps gleich reihenweise missachtest hast.
                                            • „Fertig“ ist das lange nicht.
                                            • Du hast die Hausaufgabe, das Skript durchzuarbeiten und nachzusehen, was ich da anders mache als Du.
                                            • Da waren grobe logische Fehler drin. Problem: Logisches Denken kann man nur schwer lehren - üben allerdings kann man das.
                                            • Wieso hast Du erwartet, dass eine Datei mit der Endung '.html' als PHP-Skript ausgeführt wird? Das ist zwar möglich - erfordert aber weitere Handlungen auf dem Server.
                                            1. Hallo Raketenwilli,

                                              • Wieso hast Du erwartet, dass eine Datei mit der Endung '.html' als PHP-Skript ausgeführt wird?

                                              Weil JavaScript auch in HTML-Dateien ausgeführt wird?

                                              Bis demnächst
                                              Matthias

                                              --
                                              Du kannst das Projekt SELFHTML unterstützen,
                                              indem du bei Amazon-Einkäufen Amazon smile (Was ist das?) nutzt.
                                            2. Hallo Raketenwilli,

                                              Ich hab Dir, um eine ausufernde und ewig dauernde Diskussion zu vermeiden, die Lösung an die im Quelltext sichtbare Adresse geschickt.

                                              Hast du auch das wordwrap() durch etwas Besseres ersetzt? Das zerschnibbelt nämlich Zeichen, die aus mehreren Bytes bestehen. Ein mb_wordwrap() gibt es offensichtlich nicht...

                                              Gruß
                                              Julius

                                              1. Hallo,

                                                Ich hab Dir, um eine ausufernde und ewig dauernde Diskussion zu vermeiden, die Lösung an die im Quelltext sichtbare Adresse geschickt.

                                                Hast du auch das wordwrap() durch etwas Besseres ersetzt?

                                                das ist normalerweise gar nicht nötig. Ich weiß nicht, woher der Hinweis mit den maximal 70 Zeichen pro Zeile kommt - in den zugehörigen RFCs ist von maximal 998 Zeichen plus CR/LF die Rede. Da ist also noch reichlich Luft nach oben.

                                                Das zerschnibbelt nämlich Zeichen, die aus mehreren Bytes bestehen. Ein mb_wordwrap() gibt es offensichtlich nicht...

                                                Das ist allerdings ein triftiger Grund, generell von wordwrap() abzuraten.

                                                Live long and pros healthy,
                                                 Martin

                                                --
                                                Ich stamme aus Ironien, einem Land am sarkastischen Ozean.
                                                1. if ( ! function_exists( 'mb_wordwrap') ) {
                                                  
                                                      function mb_wordwrap( $s, $l=75 ) {
                                                          $l = (int) $l;
                                                          if ( ! $l ) $l=1;
                                                          return implode( PHP_EOL, mb_str_split( $s, $l );
                                                      }
                                                  }
                                                  

                                                  Das bricht aber brutal um. Also anders als wordwrap() ohne positive Option dafür auch mitten im Wort. Deswegen das „für Grobmotoriker“.

                                                2. Ich weiß nicht, woher der Hinweis mit den maximal 70 Zeichen pro Zeile kommt

                                                  „Stille Post“ oder das ewige Zitat aus veralteten, aber eben auch nicht erwähnten Quellen...

                                                  Als die „Corana-Zielgruppe“ noch vor Monitoren mit bernsteinfarbener Schrift saß waren 70 Zeichen/Zeile im ARPA-Net schon „sportlich“. Schon damals waren es meist die Mail-Programme, die nicht mehr konnten…

                                              2. Hast du auch das wordwrap() durch etwas Besseres ersetzt?

                                                Nein. Ich hab gleich mb_send_mail genommen. Nach meinen Erfahrungen braucht das kein wordwrap für den body.

                                                1. Ich hab gleich mb_send_mail genommen. Nach meinen Erfahrungen braucht das kein wordwrap für den body.

                                                  Ich überprüfe solche ussagen gerne nochmal, habs also getestet:

                                                  1. Erzeugen eines langen Strings ohne Zeilenumbrüche in der Shell:

                                                  tr -d "\n" < /var/log/apache2/error.log > /tmp/longline
                                                  wc -c  /tmp/longline
                                                  139066 #139 kilobytes
                                                  wc -l
                                                  0 # Das sind nicht die Zeilen, sondern die Zeilenumbrüche!
                                                  

                                                  2. Test-Skript: (Die Adresse habe ich geändert!)

                                                  <?php
                                                  $txt=file_get_contents('/tmp/longline');
                                                  mb_send_mail(
                                                    'an_mich@example.com',
                                                    'Mail mit langer Zeile',
                                                    $txt
                                                  );
                                                  

                                                  3. Gegentest: (Die Adresse habe ich geändert!)

                                                  <?php
                                                  $txt=file_get_contents('/var/log/apache2/error.log');
                                                  mb_send_mail(
                                                    'an_mich@example.com',
                                                    'Mail error.log',
                                                    $txt
                                                  );
                                                  

                                                  4. Ergebnisse:

                                                  Beide Mails kommen an.

                                                  5. Weitere Erkenntnisse:

                                                  • Bis zum Empfang des Mails mit der langen Zeile dauert merkwürdig lange. (Mehrere Minuten)
                                                  • Mein grafischer Client auf dem gewiss nicht langsamen Rechner braucht jedes Mal mehrere Sekunden(~3) um das Mail mit der superlangen langen Zeile zu öffnen. Das liegt offenbar am „wrappen“ für die Darstellung.
                                                  • Im Fall des Mails mit den Zeilenumbrüchen im Error-Log ist beides nicht der Fall.

                                                  Logs (Auszug, Zeitzonen umgerechnet)

                                                  from [user]  Mon, 08 Jun 2020 08:13:43 +0000 (mein Hoster)
                                                  from relay   Mon, 08 Jun 2020 08:13:45 +0000 (Ankunft bei Google-SMTP)
                                                  by [smtp]    Mon, 08 Jun 2020 08:17:50 +0000 (Auslieferung durch Google-IMAP)
                                                  
                                              3. Hi Ihr Zwei,

                                                Ich hab Dir, um eine ausufernde und ewig dauernde Diskussion zu vermeiden, die Lösung an die im Quelltext sichtbare Adresse geschickt.

                                                Hast du auch das wordwrap() durch etwas Besseres ersetzt? Das zerschnibbelt nämlich Zeichen, die aus mehreren Bytes bestehen. Ein mb_wordwrap() gibt es offensichtlich nicht...

                                                Abgesehen davon, dass es nice wäre to have ein wordwrap() 4 utf8, sollten wir here not mix alle Anforderungen like Kraut &amp; Rüben.

                                                Die Begrenzung in Emails auf "80 Zeichen" Zeilenlänge incl. CrLf stammt aus den Transportregeln für Emails. Das bedeutet also, dass es sich ursprünglich nur um reine ASCCI-Codes mit sieben Bit gehandelt hat, wenn man von Zeichen sprach. Später wurden Oktetts daraus, also Codes mit acht Bit.

                                                Wenn man diese mittelalte Regel (max. 80 "Zeichen" pro Zeile) also auf das mb_mail_wrap() übertragen will, was wir hier eigentlich suchen/bauen wollen, dann muss dieses deshalb nach maximal 78 Bytes einen Zeilenumbruch (CrLf) einfügen, aber bitte nicht innerhalb einer UTF8-Sequenz.

                                                Der Versuch von Fastüx ist irrelevant, da er nicht vorhersehen kann kann, ob immer alle SMTP-Relays mitspielen. Dafür muss man sich an die gültigen Konventionen (RFCs) halten, ggf. auch an ältere. Man weiß ja nicht immer, welchen Weg die Email nimmt.

                                                Idee:

                                                Man könnte den Text in Einzelzeichen (UTF8) in ein Array zerlegen und die Elemente in einer Schleife dann jeweils solange wieder konkatinieren in einen Byte-String, bis gerade nicht 78 Bytes überschritten sind. CrLf hinten dran, nächster Loop. Dazu muss man dan eben str_len() bemühen, um Bytes zu zählen und nicht Zeichen.

                                                Wenn ich nachher noch lange Weile bekomme, versuche ich das mal zu coden.

                                                Wir wissen aber schon, dass dynamische Arrayerzeugung in PHP sehr lange dauert. Vielleicht gibt es da noch eine bessere Lösung. mb_substr() wird vermutlich obnehin benötigt.

                                                LG
                                                me-too

                                                Gruß
                                                Julius

                                                1. Der Versuch von Fastüx ist irrelevant, da er nicht vorhersehen kann kann, ob immer alle SMTP-Relays mitspielen. Dafür muss man sich an die gültigen Konventionen (RFCs) halten, ggf. auch an ältere. Man weiß ja nicht immer, welchen Weg die Email nimmt.

                                                  Was macht Dich so sicher?

                                                  Ich hab mir jetzt das mail mal angesehen.

                                                  Also mb_send_mail() produziert, da es ja UTF-8 verschickt, ein Mail, dessen Body wie folgt transportiert wird:

                                                  Content-Type: text/plain; charset=UTF-8
                                                  Content-Transfer-Encoding: BASE64
                                                  

                                                  Mithin also genau so, wie binären Kram.

                                                  Und da in BASE64 die originalen Zeilenumbrüche ebenfalls kodiert werden, nimmt mb_send_mail() die Gelegenheit beim Schopf und bricht das BASE64-Zeug nach 76 Zeichen um, der Zeilnumbruch ist "\n". (Auch beim Shell-Programm base64 passiert genau das per Voreinstellung!)

                                                  Meine Aussage war, dass ich mit mb_send_mail() kein wordwrap() benötige. Meine zweite Aussage war, dass ein Mail mit einer superlangen Zeile im Body ankommt. Nichts gesagt habe ich über den Transfer, aber eigentlich war das - wg. URF-8 absehbar…

                                                  1. Hi,

                                                    Der Versuch von Fastüx ist irrelevant, da er nicht vorhersehen kann kann, ob immer alle SMTP-Relays mitspielen. Dafür muss man sich an die gültigen Konventionen (RFCs) halten, ggf. auch an ältere. Man weiß ja nicht immer, welchen Weg die Email nimmt.

                                                    Was macht Dich so sicher?

                                                    Die Frage müsste lauten: warum ist das noch so unsicher?
                                                    Du hast die Testbedingungen noch nicht genannt. Lass uns das jetzt also bitte gemeinsam zu Ende denken/testen :-)

                                                    • Basissystem: Linux (?)
                                                    • Prüfstelle für den Output von von mb_send_mail(), reingucken kannst Du ja nicht. Hast Du das sendmail-Script (?) verbogen? Das wäre eine Möglichkeit, die generierte Maildatei anzusehen. Anstelle von sendmail ein Script einbinden, dass die Maildatei erst einmal speichert, anstatt sie an den SMTP-Service zu übergeben.
                                                    • Als Transfer-Encoding base64 zu benutzen, halte ich unter den gegebenen Umständen am bequemsten, hatte das auch gehofft, dass es so ist. Dass Du das ermittelt hattest, war mir bisher leider nicht aufgefallen.
                                                    • Die Array-Variante für die Header austesten, welche Umbrüche werden da produziert? Welche werden bei der Stringwurst-Variante richtig umgesetzt von mb_send_mail()? Das Handbuch ist an dieser Stelle vermutlich falsch.
                                                    • Wie kann man einen multipart-mixed Body produzieren?
                                                    • Müssen die Header noch vorher MIME-codiert werden, oder stimmt es, dass mb_send_mail() sich selber darum kümmert?
                                                    • Was passiert auf Windows-Systemen?

                                                    Ich komme leider erst am Montag, 15. Jun wieder an meinen Linux-PC. Der steht in der Firma. Es wäre also nett, wenn Du das praktisch testen könntest. Und dann sollten wir versuchen, eine kleine Doku fürs Wiki darüber zu verfassen, in mehreren (3?) Anforderungsgraden. Dabei ginge es ums Verständnis, nicht ums Vermeiden vom Swift-Mailer o.ä. Wo liegen die Injection-Schwachstellen, was muss man noch beachten, usw.? Was bedeutet "Content-Type", was "Content-Transfer-Encoding", Was ist eine Multipart-MIME-Mail, usw.

                                                    Ich hab mir jetzt das mail mal angesehen.

                                                    Also mb_send_mail() produziert, da es ja UTF-8 verschickt, ein Mail, dessen Body wie folgt transportiert wird:

                                                    Content-Type: text/plain; charset=UTF-8
                                                    Content-Transfer-Encoding: BASE64
                                                    

                                                    Mithin also genau so, wie binären Kram.

                                                    Man könnte also damit jetzt jede Datei versenden, auch Bilder... Da wäre dann nur der Content-Type-Header falsch. Wird der Default-Header überschrieben, wenn man den explizit setzt?

                                                    Und da in BASE64 die originalen Zeilenumbrüche ebenfalls kodiert werden, nimmt mb_send_mail() die Gelegenheit beim Schopf und bricht das BASE64-Zeug nach 76 Zeichen um, der Zeilnumbruch ist "\n". (Auch beim Shell-Programm base64 passiert genau das per Voreinstellung!)

                                                    Mich persönlich würde noch interessieren, woher die 76 kommt (also 78 incl. CRLF)? Die RFCs sprechen imho immer von 80 Bytes incl. CRLF!?

                                                    Meine Aussage war, dass ich mit mb_send_mail() kein wordwrap() benötige. Meine zweite Aussage war, dass ein Mail mit einer superlangen Zeile im Body ankommt. Nichts gesagt habe ich über den Transfer, aber eigentlich war das - wg. URF-8 absehbar…

                                                    Na eben :-)
                                                    Ich hatte jetzt der Vorsicht halber angenommen, dass Du die Datei nach dem Transport angeschaut hast, nachdem sie auch sendmail und die Kette der SMTP-Hops durchlaufen hat. Die ist aber höchst unbestimmt.
                                                    Dazu müsste man jetzt noch wissen, welche Mailserver involviert waren, Typ und Version. Dass Content mit base64-Encoding richtig durchläuft, wäre heutzutage aber zu erwarten.

                                                    Viele Fragen, lass es uns fertig machen!
                                                    Das würde dann das Antworten auf die Fragen dieses OP und die des @Linuchs in Zukunft vereinfachen. Und auch meine unx deine klären :-)

                                                    LG
                                                    me-too

                                                    1. Hallo,

                                                      • Als Transfer-Encoding base64 zu benutzen, halte ich unter den gegebenen Umständen am bequemsten, hatte das auch gehofft, dass es so ist. Dass Du das ermittelt hattest, war mir bisher leider nicht aufgefallen.

                                                      naja, base64 ist als Transfer-Encoding wohl robust, weil dann plain ASCII auf dem Übertragungsweg genügt. Das erkauft man sich aber mit dem Nachteil, dass die Nachricht im Quellcode nicht mehr lesbar ist und das Transfervolumen um 1/3 zunimmt.

                                                      Eben mal an ein paar gesendeten Mails verifiziert: Mein Thunderbird (Linux) versendet Content-Type: text/plain; charset=utf-8 mit Content-Transfer-Encoding: 8bit, als quasi Klartext. MS Outlook (wahlweise Outlook 2016 oder Outlook 365) produziert dagegen hartnäckig base64.

                                                      Also mb_send_mail() produziert, da es ja UTF-8 verschickt, ein Mail, dessen Body wie folgt transportiert wird:

                                                      Content-Type: text/plain; charset=UTF-8
                                                      Content-Transfer-Encoding: BASE64
                                                      

                                                      Für base64-codierten Content noch UTF-8 zu deklarieren, ist eigentlich Unfug. Da kommen sowieso nur ASCII-Zeichen vor; charset=ASCII würde also genügen.

                                                      Man könnte also damit jetzt jede Datei versenden, auch Bilder... Da wäre dann nur der Content-Type-Header falsch. Wird der Default-Header überschrieben, wenn man den explizit setzt?

                                                      Zumindest bei mail() ist das so (hab ich schon gemacht).

                                                      Und da in BASE64 die originalen Zeilenumbrüche ebenfalls kodiert werden, nimmt mb_send_mail() die Gelegenheit beim Schopf und bricht das BASE64-Zeug nach 76 Zeichen um, der Zeilnumbruch ist "\n". (Auch beim Shell-Programm base64 passiert genau das per Voreinstellung!)

                                                      Mich persönlich würde noch interessieren, woher die 76 kommt (also 78 incl. CRLF)? Die RFCs sprechen imho immer von 80 Bytes incl. CRLF!?

                                                      Es sind höchstens 80, gern auch weniger. Aber 78 wäre kein Vielfaches von 4, man würde also eine base64-Gruppe zerreißen. Deshalb 76.

                                                      Live long and pros healthy,
                                                       Martin

                                                      --
                                                      Ich stamme aus Ironien, einem Land am sarkastischen Ozean.
                                                      1. Also mb_send_mail() produziert, da es ja UTF-8 verschickt, ein Mail, dessen Body wie folgt transportiert wird:

                                                        Content-Type: text/plain; charset=UTF-8
                                                        Content-Transfer-Encoding: BASE64
                                                        

                                                        Für base64-codierten Content noch UTF-8 zu deklarieren, ist eigentlich Unfug. Da kommen sowieso nur ASCII-Zeichen vor; charset=ASCII würde also genügen.

                                                        Äh: Kein Unfug. In den Mails hat jeder Block/Part (Body, Alternativer HTML-Text, Anhänge) einen eigenen Header).

                                                        Der wieder führt auf, was nach dem Dekodieren drin stehen soll:

                                                        Content-Type: text/plain; charset=UTF-8
                                                        

                                                        und, damit auch bekannt wird, wie der Inhalt dekodiert werden soll, wie dieser für den Transport kodiert wurde:

                                                        Content-Transfer-Encoding: BASE64
                                                        

                                                        Das ist alles. Eigentlich ist das „so richtig schön einfach“. Im ersten Header steht noch das „Boundary“ (Eine Zeile mit Text, der im Inhalt nicht vorkommen soll), welches die Blöcke trennt).

                                                        1. Moin,

                                                          Für base64-codierten Content noch UTF-8 zu deklarieren, ist eigentlich Unfug. Da kommen sowieso nur ASCII-Zeichen vor; charset=ASCII würde also genügen.

                                                          Äh: Kein Unfug. In den Mails hat jeder Block/Part (Body, Alternativer HTML-Text, Anhänge) einen eigenen Header).

                                                          Der wieder führt auf, was nach dem Dekodieren drin stehen soll:

                                                          ähm ja, klar. Ich hab anscheinend schlecht geträumt ...

                                                          Live long and pros healthy,
                                                           Martin

                                                          --
                                                          Ich stamme aus Ironien, einem Land am sarkastischen Ozean.
                                                      2. Eben mal an ein paar gesendeten Mails verifiziert: Mein Thunderbird (Linux) versendet Content-Type: text/plain; charset=utf-8 mit Content-Transfer-Encoding: 8bit, als quasi Klartext. MS Outlook (wahlweise Outlook 2016 oder Outlook 365) produziert dagegen hartnäckig base64.

                                                        Scheinbar war Deine Textzeile nicht lang genug - oder Du bist auf Feinheiten der "Speicher als" Funktion des Thunderbird reingefallen:

                                                        User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101
                                                         Thunderbird/68.8.0
                                                        MIME-Version: 1.0
                                                        Content-Type: text/plain; charset=utf-8; format=flowed
                                                        Content-Language: de-DE
                                                        Content-Transfer-Encoding: base64
                                                        
                                                        [BASE64, umgebrochen]
                                                        

                                                        (Export als 'datei.eml')

                                                        Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.8.0
                                                        MIME-Version:
                                                        1.0
                                                        Content-Type:
                                                        text/plain; charset=utf-8; format=flowed
                                                        Content-Language:
                                                        de-DE
                                                        Content-Transfer-Encoding:
                                                        base64
                                                        
                                                        [Der dekodierte Text]
                                                        

                                                        (Export als 'datei.txt')

                                                        1. Mahlzeit,

                                                          Eben mal an ein paar gesendeten Mails verifiziert: Mein Thunderbird (Linux) versendet Content-Type: text/plain; charset=utf-8 mit Content-Transfer-Encoding: 8bit, als quasi Klartext. MS Outlook (wahlweise Outlook 2016 oder Outlook 365) produziert dagegen hartnäckig base64.

                                                          Scheinbar war Deine Textzeile nicht lang genug - oder Du bist auf Feinheiten der "Speicher als" Funktion des Thunderbird reingefallen:

                                                          weder noch.

                                                          Die Zeilen aus der vorangegangen Mail, die ich als Zitat habe stehenlassen, sind ultralang - ein Absatz mit über 200 Zeichen als eine einzige Zeile.
                                                          Das, was ich dann selbst geschrieben habe, ist nach ungefähr 76 Zeichen (oder weniger, je nach Wortlänge) umgebrochen. Das macht der T-Bird schon beim Schreiben im Compose-Fenster.

                                                          Und ich habe gar nichts exportiert oder gespeichert, sondern direkt mit Ctrl-U den Quelltext angezeigt:

                                                          User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101
                                                           Thunderbird/68.8.0
                                                          MIME-Version: 1.0
                                                          In-Reply-To: <002701d23b67$3a850810$b58f0950$@online.de>
                                                          Content-Type: text/plain; charset=utf-8; format=flowed
                                                          Content-Language: en-US
                                                          Content-Transfer-Encoding: 8bit
                                                          
                                                          Hallo,
                                                          
                                                          
                                                          > Die Örtlichkeit könnte theoretisch schon hinkommen, aber mein letzter Kenntnisstand ist, dass beide zu Fuß nicht allzu gut unterwegs sind. Aber wer weiß, es kann schon sein, dass du eine Begegnung der dritten Art hattest... 😊
                                                          
                                                          immerhin bin ich mir sicher, dass *ich* keine Halluzination hatte.
                                                          

                                                          Wie man sieht: Fließtext. Eine elend lange Textwurst. Wird auch in der Quellcode-Ansicht vom T-Bird einzeilig dargestellt. Die verstümmelten Zeichen sind typisch für die Quellcode-Ansicht, die kennt offensichtlich kein UTF-8. In der normalen Leseansicht wird's richtig angezeigt.

                                                          Wo Content-Language: en-US herkommt, ist mir allerdings unklar. Ich habe das nicht bestellt.

                                                          Live long and pros healthy,
                                                           Martin

                                                          --
                                                          Ich stamme aus Ironien, einem Land am sarkastischen Ozean.
                                                          1. ein Absatz mit über 200 Zeichen als eine einzige Zeile.

                                                            Das war wohl zu kurz... Du hast selbst geschrieben, dass die aktuelleren RFCs 998 (1000 mit CR+LF) Bytes pro Zeile erlauben.

                                                            Und ich habe gar nichts exportiert oder gespeichert, sondern direkt mit Ctrl-U den Quelltext angezeigt:

                                                            User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101
                                                             Thunderbird/68.8.0
                                                            MIME-Version: 1.0
                                                            In-Reply-To: <002701d23b67$3a850810$b58f0950$@online.de>
                                                            Content-Type: text/plain; charset=utf-8; format=flowed
                                                            Content-Language: en-US
                                                            Content-Transfer-Encoding: 8bit
                                                            
                                                            Hallo,
                                                            
                                                            > Die Örtlichkeit könnte theoretisch schon hinkommen, aber mein letzter Kenntnisstand ist, dass beide zu Fuß nicht allzu gut unterwegs sind. Aber wer weiß, es kann schon sein, dass du eine Begegnung der dritten Art hattest... 😊
                                                            
                                                            immerhin bin ich mir sicher, dass *ich* keine Halluzination hatte.
                                                            

                                                            Wie man sieht: Fließtext.

                                                            Mit einer ~13000 Zeichen-Zeile: (Ich hab beim Ctrl+v nicht gezählt) und Ctrl+u:

                                                            User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101
                                                             Thunderbird/68.8.0
                                                            MIME-Version: 1.0
                                                            Content-Type: text/plain; charset=utf-8; format=flowed
                                                            Content-Language: de-DE
                                                            Content-Transfer-Encoding: base64
                                                            
                                                            U3VwZXJsYW5nZVRleHR6ZWlsZVN1cGVybGFuZ2VUZXh0emVpbGVTdXBlcmxhbmdlVGV4dHpl
                                                            aWxlU3VwZXJsYW5nZVRleHR6ZWlsZVN1cGVybGFuZ2VUZXh0emVpbGVTdXBlcmxhbmdlVGV4
                                                            ...
                                                            
                                                          2. Die verstümmelten Zeichen sind typisch für die Quellcode-Ansicht, die kennt offensichtlich kein UTF-8. In der normalen Leseansicht wird's richtig angezeigt.

                                                            Wo Content-Language: en-US herkommt, ist mir allerdings unklar. Ich habe das nicht bestellt.

                                                            Da ich nicht weiß, wo das dokumentiert sein sollte, gehe ich - ebenso wie bei unterschiedlichen eml/txt-export mal von einem Osterei aus.

                                                            Übrigens hab ich mir eben mal ein per Windows-Irgendwas und Exchange verschicktes Mail angesehen: Zeilenlänge between (76,998), UTF-8, kam Base64-kodiert an.

                                                            Achso. Ich hab anno 2015 mal ein „Ticketsystem“ als Ergänzung für einen Webshop geschrieben… da spielte das Zusammenbauen von Mails eine ziemlich zentrale Rolle. Soll heißen: „Ich weiß was ich tue“.

                                                    2. Müssen die Header noch vorher MIME-codiert werden, oder stimmt es, dass mb_send_mail() sich selber darum kümmert?

                                                      Teil. Teils. Die kurze Aussage ist, dass mb_send_mail() sich rührend um das Subjekt und den Body kümmert. Die lange Aussage ist, dass mb_send_mail() die Namensteile von Adresse(n) (eg. foo bar <foo.bar@example.invalid>) nicht kodiert und dass auch die explizit übergebenen Header vom Skript mit mb_encode_mimeheader() behandelt werden müssen.

                                                    3. Und dann sollten wir versuchen, eine kleine Doku fürs Wiki darüber zu verfassen,

                                                      Da einerseits mail() und mb_send_mail() nicht wirklich gut im Handbuch erklärt werden, andererseits swiftmail und co. es geschafft haben, in der Anwendung „irre kompliziert“ zu werden und weil die Dokumentationen dieser Werke auch „ganz unterschiedliche Denkweisen zulassen“ war mein eigentlicher Plan selbst eine Klasse für das Mailen zu schreiben - und die hat schon jetzt fast 300 Zeilen (ohne Kommentare), ohne ein Mail schon zusammenzubauen, es versenden zu können oder schon Anhänge anzufügen...

                                                      Die „kleine Doku“ allein schon über mail() und mb_send_mail() wird also ein „ziemlich dickes Buch“ und ich bin mir auf Grund früherer Erfahrungen mit umfangreichen Einträgen höchst unsicher, ob das Wiki die geeignete Stelle und das geeignete Format dafür sein könnte.

                                      2. Hallo Kralle,

                                        Kommt vom Script überhaupt irgendein echo?

                                        Ich sehe keines

                                        Testest du überhaupt mit dem Script, von dem du glaubst, das sei es?

                                        ??? Das Script ist doch mit in der HTML-Datei.

                                        Wird es denn überhaupt ausgeführt?

                                        Testen wir mal ein ganz simples Skript. Was wird ausgegeben, wenn du folgende Zeilen in eine Datei packst und diese aufrufst?

                                        <?php
                                        echo "Die PHP-Version ist: " . phpversion();
                                        

                                        Das sollte etwas wie Die PHP-Version ist: 7.2.24-0ubuntu0.18.04.6 ausgeben.

                                        Gruß
                                        Julius

                                        1. Hallo Kralle,

                                          Kommt vom Script überhaupt irgendein echo?

                                          Ich sehe keines

                                          Testest du überhaupt mit dem Script, von dem du glaubst, das sei es?

                                          ??? Das Script ist doch mit in der HTML-Datei.

                                          Wird es denn überhaupt ausgeführt?

                                          vermutlich hat die Datei die falsche Extension?
                                          Der Dateiname sollte mit .php enden

                                          LG
                                          me-too

                                          1. Moin,

                                            ??? Das Script ist doch mit in der HTML-Datei.

                                            Wird es denn überhaupt ausgeführt?

                                            vermutlich hat die Datei die falsche Extension?
                                            Der Dateiname sollte mit .php enden

                                            ja, so weit waren wir am Sonntagabend schon. 😀

                                            Live long and pros healthy,
                                             Martin

                                            --
                                            Ich stamme aus Ironien, einem Land am sarkastischen Ozean.
                                            1. Hi Martin

                                              ??? Das Script ist doch mit in der HTML-Datei.

                                              Wird es denn überhaupt ausgeführt?

                                              vermutlich hat die Datei die falsche Extension?
                                              Der Dateiname sollte mit .php enden

                                              ja, so weit waren wir am Sonntagabend schon. 😀

                                              Asche auf mein Haupt

                                              Hättest Du das Subject passenc angepasst, wäre es mir vermutlich aufgefallen. Aber das scheint hier nicht üblich zu sein?

                                              LG
                                              me-too

                                              1. Hallo me-too,

                                                vermutlich hat die Datei die falsche Extension?
                                                Der Dateiname sollte mit .php enden

                                                ja, so weit waren wir am Sonntagabend schon. 😀

                                                Asche auf mein Haupt

                                                Hättest Du das Subject passenc angepasst, wäre es mir vermutlich aufgefallen. Aber das scheint hier nicht üblich zu sein?

                                                Nicht unüblich, aber im konkreten Fall ging es ja immer noch um den Mailversand.

                                                Gruß
                                                Julius

                            2. Dieser Beitrag wurde gelöscht: Beitrag ist Spam.
          2. Hi,

            $nachricht ist die Mitteilung aus dem Formular, $message wird der zu versendende Mailtext.

            Dann ist da aber immernoch der .=-Fehler, den Heiko auch schon beim $header hat.

            ja, aber zum Glück fällt der in der Praxis nicht auf, weil PHP beim Lesezugriff auf nicht definierte Variablen nicht nur eine Notice wirft[1], sondern auch einen dem Typ entsprechenden Null-Wert annimmt. Bei Strings ist das der leere String.

            Live long and pros healthy,
             Martin

            --
            Ich stamme aus Ironien, einem Land am sarkastischen Ozean.

            1. die in der Default-Einstellung unterdrückt werden, was aber während der Entwicklungs- und Testphase gar nicht gut ist. ↩︎

      2. Moin,

        Da ich keinen Zugriff auf die Server-Logfiles habe, kann ich leider auch nicht sehen, was es für eine Meldung gibt, wenn ich das Formular abschicke.

        Hä?

        Ich kann das Formular abschicken, bekomme aber kein Feedback, ob alles richtig war.

          	/* header zusammen bauen */
          	$header .= 'From:' . $email . "\r\n";
        

        Halt! $header ist bis hierher noch gar nicht definiert. Die Erstzuweisung darf nicht mit dem Operator .= erfolgen.

        Das bedeutet, bei der ersten Zuweisung muß der Punkt weg - richtig?

        			$header .= 'Replay-To:' . $email . "\r\n";
        			$header .= "Content-type: text/plain; charset=UTF-8 \r\n";
        

        Und hier baust du ungeprüft die vom Besucher eingegebene Mailadresse ein. Okay, die Mail geht vermutlich nur an dich oder einen LUG-Admin, trotzdem sollte man das nicht machen. Da kann jeder Dreck drinstehen! So baust du eine Spamschleuder. Stell dir vor, jemand gibt als Mailadresse folgendes ein:

        me@example.org\r\ncc: donald.duck@waltdisney.com

        Das ich da noch ein Prüfung einplanen sollte , ist mir inzwischen bewusst. Wenn das Script eine Mail verschicken kann und die Informationen auf dem Forumlar bei mir auch ankommen, dann rüste ich das Script auf, was dann aber Thema für einen anderen Thread wäre. Aber, im Moment kommt da nichts. Kann natürlich an dem $header-Fehler liegen.

        Dann würde der Aufruf von mail() ein false zurückgeben. Das prüfst du aber gar nicht.

        Sollte ich wohl mal einplanen.

        Gruß Heiko

    3. Moin Heiko,

      die anderen haben es vollkommen übersehen: Die Rückantwort-Adresse heißt natürlich Reply-To.

      Viele Grüße
      Robert