FrankMehl: generierte email mit kryptischen Zeichen

Hallo!

Ich habe auf www.buettner-psychotherapie.de/kontakt_impressum.php ein php-Formular, mit der ein paar Informationen zum Webseiteneigentümer gesendet werden können.

Bei ihm kommen Umlaute zerschossen an,
wenn ich das Ergebnis an mich sende, ist's ok.

Woran kann das liegen?
Wie kann ich es beheben?

Hier der Ausschnitt...

aus erhÃ?ltst! ;)

Ich gr�ße Dich lieb und freue mich, da mir Deine Webseite gut gef�llt. :-)

Liebe Gr�ße!

Für Hilfe großen Dank!
der Frank

  1. Hi!

    Ich habe auf www.buettner-psychotherapie.de/kontakt_impressum.php ein php-Formular, mit der ein paar Informationen zum Webseiteneigentümer gesendet werden können.

    Die Seite gibt über ein Meta-Element zum Content-Type an, sie sei UTF-8 und der Browser wird in genau der Kodierung die Formulardaten absenden.

    Bei ihm kommen Umlaute zerschossen an, wenn ich das Ergebnis an mich sende, ist's ok.
    Woran kann das liegen?

    Vermutlich daran, dass die Software von ihm was anderes rät als bei dir und du auf dem jeweiligen Weg keine Angaben zur Zeichenkodierung gemacht hast.

    Wie kann ich es beheben?

    Setz an den vorgesehenen Stellen die Angabe zur Zeichenkodierung.

    Lo!

    1. Setz an den vorgesehenen Stellen die Angabe zur Zeichenkodierung.

      Ich habe noch nie vorher eine Angabe zur Zeichencodierung für php-Dokumente gesehen.
      Sollte das so aussehen ? ...

      <?php
      $name = ""; // kanji
      $mbox = "kru";
      $doma = "gtinn.mon";
      $addr = mb_encode_mimeheader($name, "UTF-7", "Q") . " <" . $mbox . "@" . $doma . ">";
      echo $addr;
      ?>

      Gruß vom Frank

      1. Hallo,

        Ich habe noch nie vorher eine Angabe zur Zeichencodierung für php-Dokumente gesehen.

        aber für e-Mails - *DA* geht's doch schief.

        Sollte das so aussehen ? ...

        <?php
        $name = ""; // kanji
        $mbox = "kru";
        $doma = "gtinn.mon";
        $addr = mb_encode_mimeheader($name, "UTF-7", "Q") . " <" . $mbox . "@" . $doma . ">";
        echo $addr;
        ?>

        Ich habe keine Ahnung, was du mit diesen Zeilen anstellst.
        Gib einfach im Mailheader den richtigen Content-Type an (bevorzugt text/plain) und ergänze ihn um die passende Angabe der Zeichencodierung - scheint in deinem Fall UTF-8 zu sein.

        Ciao,
         Martin

        --
        There are 10 types of people in the world: Those who understand the binary system, and those who don't.
        Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
        1. Hi!

          Sollte das so aussehen ? ...
          $addr = mb_encode_mimeheader($name, "UTF-7", "Q") . " <" . $mbox . "@" . $doma . ">";
          Ich habe keine Ahnung, was du mit diesen Zeilen anstellst.

          Er hat Toms etwas kryptischen Hinweis nicht richtig verstanden und einfach mal den Code aus dem Beispiel im PHP-Handbuch zu mb_encode_mimeheader() gepostet.

          Gib einfach im Mailheader den richtigen Content-Type an (bevorzugt text/plain) und ergänze ihn um die passende Angabe der Zeichencodierung - scheint in deinem Fall UTF-8 zu sein.

          Das ist nur die halbe Miete, denn die Content-Type-Header-Zeile gilt nur für den Body. Texte in den Headerzeilen, vor allem im Subjekt und bei Namen in Absender und Empfänger gilt eine spezielle Form, die man mit der oben genannten Funktion bekommen kann. Aber UTF-7 sollte man nicht nehmen.

          Lo!

          1. Hallo,

            $addr = mb_encode_mimeheader($name, "UTF-7", "Q") . " <" . $mbox . "@" . $doma . ">";
            Ich habe keine Ahnung, was du mit diesen Zeilen anstellst.
            Er hat Toms etwas kryptischen Hinweis nicht richtig verstanden und einfach mal den Code aus dem Beispiel im PHP-Handbuch zu mb_encode_mimeheader() gepostet.

            ach so ...

            Gib einfach im Mailheader den richtigen Content-Type an (bevorzugt text/plain) und ergänze ihn um die passende Angabe der Zeichencodierung - scheint in deinem Fall UTF-8 zu sein.
            Das ist nur die halbe Miete, denn die Content-Type-Header-Zeile gilt nur für den Body. Texte in den Headerzeilen, vor allem im Subjekt und bei Namen in Absender und Empfänger gilt eine spezielle Form, die man mit der oben genannten Funktion bekommen kann.

            Das ist richtig. Aus der Beschreibung habe ich aber nicht ableiten können, dass dort das Problem liegt, sondern eher im Mail-Inhalt, den der eine Client anscheinend korrekt als UTF-8 anzeigt (vermutlich weil das seine Defaulteinstellung ist) und der andere mangels Information als ISO-irgendwas.

            Dass die Header dennoch richtig codiert sein müssen, ist wahr. Sie dürfen nur ASCII-Zeichen enthalten.

            Aber UTF-7 sollte man nicht nehmen.

            ACK.

            Ciao,
             Martin

            --
            Abraham sprach zu Bebraham: Kann i mal dei Cebra ham?
            Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
            1. Hello,

              Dass die Header dennoch richtig codiert sein müssen, ist wahr. Sie dürfen nur ASCII-Zeichen enthalten.

              Wenn man nicht weiß/nicht wissen kann, in welcher Codierung die Daten kommen, empfiehlt sich eine Funktion, die zumindest versucht zu erkennen, welche Codierung vorliegt.

              http://www.php.net/manual/de/function.mb-detect-encoding.php
              oder eine selbst gebaute von Cybaer
              http://forum.de.selfhtml.org/archiv/2006/3/t124786/#m804376

              Liebe Grüße aus dem schönen Oberharz

              Tom vom Berg

              --
               ☻_
              /▌
              / \ Nur selber lernen macht schlau
              http://bergpost.annerschbarrich.de
              1. Hi,

                Dass die Header dennoch richtig codiert sein müssen, ist wahr. Sie dürfen nur ASCII-Zeichen enthalten.
                Wenn man nicht weiß/nicht wissen kann, in welcher Codierung die Daten kommen, empfiehlt sich eine Funktion, die zumindest versucht zu erkennen, welche Codierung vorliegt.

                aber nicht für die Header. Da gibt's nichts zu raten oder zu versuchen. Entweder der Wert eines Mailheaders ist komplett ASCII, dann darf man ihn unmaskiert schreiben, oder er enthält irgendein Nicht-ASCII-Zeichen, dann muss man ihn codieren - und zwar wie im folgenden Beispiel:

                =?ISO-8859-1?Q?Max M=FCller?=

                Der codierte String hat drei Felder, die jeweils durch Fragezeichen getrennt sind. Das erste Feld gibt die verwendete Zeichencodierung an - das ist wichtig, damit die Bytewerte im codierten String richtig interpretiert werden können. Das zweite Feld gibt die Transportcodierung an, entweder Q für Quoted-Printable (bevorzugt), oder B für base64. Und das dritte Feld enthält schließlich den eigentlichen String in der gewählten Transportcodierung.

                Genau das macht die von dir schon empfohlene Funktion mb_encode_mimeheader(). Aber ich halte es für fahrlässig, den Parameter charset für die Zeichencodierung *nicht* explizit anzugeben; IMHO dürfte er nicht optional sein.
                Ich habe oben Quoted-Printable als bevorzugt genannt, weil man damit einen Text, der nur ein paar Nicht-ASCII-Zeichen enthält, immer noch ganz gut lesen kann. Einem base64-codierten String sieht man dagegen nicht mehr an, was wirklich in ihm steckt. Deswegen wundert es mich auch, dass base64 von mb_encode_mimeheader() als Default genommen wird.

                So long,
                 Martin

                --
                Lebensmotto der Egoisten:
                Was ist so schlimm daran, dass jeder nur an sich selbst denkt? Dann ist doch an alle gedacht!
                Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
                1. Hello,

                  Dass die Header dennoch richtig codiert sein müssen, ist wahr. Sie dürfen nur ASCII-Zeichen enthalten.
                  Wenn man nicht weiß/nicht wissen kann, in welcher Codierung die Daten kommen, empfiehlt sich eine Funktion, die zumindest versucht zu erkennen, welche Codierung vorliegt.

                  aber nicht für die Header. Da gibt's nichts zu raten oder zu versuchen.

                  Du sollst auch nichts versuchen, sondern Du sollst die Codierung feststellen, die vorliegt, um diese dann in die vorgeschriebene Zielcodierung umwandeln zu können.

                  Liebe Grüße aus dem schönen Oberharz

                  Tom vom Berg

                  --
                   ☻_
                  /▌
                  / \ Nur selber lernen macht schlau
                  http://bergpost.annerschbarrich.de
        2. Hi!

          aber für e-Mails - *DA* geht's doch schief.

          Was bedeutet "*DA*"?

          Gib einfach im Mailheader den richtigen Content-Type an (bevorzugt text/plain) und ergänze ihn um die passende Angabe der Zeichencodierung - scheint in deinem Fall UTF-8 zu sein.

          Ich habe so etwas noch nie gesehen.
          Das müßte vermutlich etwa so aussehen:
          "MIME-Version: 1.0rn"."Content-type: text/plain; charset=utf-8"
          Stimmt das?

          Ich habe dies eingebaut und das sieht so aus:
          mail("meinname@server.com","Website-Kontaktformular-Eintragung: $_POST[nachname]",
          "MIME-Version: 1.0rn"."Content-type: text/plain; charset=utf-8",  $inhalt_fuermich, "From: ".$_POST[email]);
          Aber ist ist leider nicht sauber. Das heißt die Email wird gesendet, aber es erscheint eine Fehlermeldung "From:... List:; syntax illegal for recipient addresses ".
          Wie sollte der implementierte Code aussehen?

          Frank

          1. Hallo,

            aber für e-Mails - *DA* geht's doch schief.
            Was bedeutet "*DA*"?

            "da" ist ein umgangssprachlicher Ausdruck für "dort", oder hier besser: "dabei". ;-)

            Gib einfach im Mailheader den richtigen Content-Type an (bevorzugt text/plain) und ergänze ihn um die passende Angabe der Zeichencodierung - scheint in deinem Fall UTF-8 zu sein.
            Ich habe so etwas noch nie gesehen.

            Noch nie den Quelltext empfangener Mails angeschaut? Kaum zu glauben.

            "MIME-Version: 1.0rn"."Content-type: text/plain; charset=utf-8"
            Stimmt das?

            Nee. Den MIME-Header baut man eigentlich nur ein, wenn man multipart-Mails verschickt. Bei einfachen Textmails hat er nichts verloren. Und anstatt "rn" meintest du doch wohl "\r\n", oder?
            Der Content-Type-Header danach sieht aber richtig aus.

            Ich habe dies eingebaut und das sieht so aus:

            Ich trenne mal auf, damit's übersichtlicher und besser zu kommentieren ist.

            mail("meinname@server.com",

            Bitte verwende für Beispiele die Domainnamen, die extra dafür vorgesehen sind, und nicht erfundene, die vermutlich jemandem gehören.

            "Website-Kontaktformular-Eintragung: $_POST[nachname]",

            Kontrollier mal, ob das korrekt kommt. Das Einbetten von komplexen Variablen (Array- oder Objektelemente) ist problematisch, und das ungeprüfte Einfügen von Benutzereingaben ist immer riskant (auch wenn es von PHP noch entschärft wird).

            "MIME-Version: 1.0rn"."Content-type: text/plain; charset=utf-8",

            Sehr eigenwillig als Nachrichtentext. Du solltest dich schon an die Reihenfolge der Parameter von mail() halten. Ansonsten: Siehe oben.

            $inhalt_fuermich,

            Aha, das ist doch erst der Nachrichtentext, oder nicht? Aber mail() erwartet hier schon die zusätzlichen Header.

            "From: ".$_POST[email]);

            Das ist syntaktisch schon besser als oben beim Subject, aber $_POST[email] ist trotzdem falsch: Der Index (oder Schlüssel) ist doch ein String, keine benannte Konstante. Deshalb schmeißt diese Anweisung eine Notice. Abgesehen ist dieser Parameter natürlich auch schon eine Position zu weit hinten; mail() wird ihn als zusätzliche Parameter für das sendmail-Script interpretieren.
            Abgesehen davon: Du willst doch hier nicht etwa die Mailadresse dessen, der das Kontaktformular benutzt, als Absenderadresse eintragen? Das geht vermutlich schief.

            Aber ist ist leider nicht sauber.

            Nein, überhaupt nicht.

            Das heißt die Email wird gesendet, aber es erscheint eine Fehlermeldung "From:... List:; syntax illegal for recipient addresses ".

            Klar. Weil an der Parameter-Position, wo mail() die "additional headers" erwartet, erstmal dein Nachrichtentext ($inhalt_fuermich) kommt. Möglicherweise steht da auch noch irgendwo "From: " drin, und was danach kommt ist (gemäß SMTP interpretiert) Unsinn. Oder sendmail reklamiert, dass die als Extra-Parameter übergebene Mailadresse nicht als Absenderadresse zulässig ist.

            Wie sollte der implementierte Code aussehen?

            Das solltest du nach den Hinweisen nun selbst hinkriegen.

            Ciao,
             Martin

            --
            Frage an Radio Eriwan: Kann man eigentlich ein guter Kommunist und gleichzeitig ein guter Christ sein?
            Radio Eriwan antwortet: Im Prinzip ja - aber warum sollte man sich das Leben doppelt schwer machen?
            Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
            1. Hallo Martin!

              Super großen ganz vielen Dank,
              dass Du Dir so viel Zeit genommen hast
              und ich jetzt viel mehr weiß
              und mir den nützlichen Link abspeichen kann
              und das Formular jetzt sicherlich geht
              (ich muß den Test des eigentlichen Webseitenbesitzers abwarten,
              weil das Problem war ja bei ihm).

              Danke schön!!!
              und auch den anderen in diesem Thread!

              Liebe Grüße
              und schönes WE!
              Frank

              1. Hi,

                Super großen ganz vielen Dank,

                so überschwenglich bin ich's nicht gewöhnt ...
                Aber schön, wenn du's nun verstanden hast.

                Ciao,
                 Martin

                --
                Männer haben nur eine Angst: Die Angst, kein Mann zu sein.
                  (Liv Tyler, US-Schauspielerin)
                Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
  2. Hello,

    Ich habe auf www.buettner-psychotherapie.de/kontakt_impressum.php ein php-Formular, mit der ein paar Informationen zum Webseiteneigentümer gesendet werden können.

    Bei ihm kommen Umlaute zerschossen an,
    wenn ich das Ergebnis an mich sende, ist's ok.

    Woran kann das liegen?

    An der Codierung.

    Wie kann ich es beheben?

    Die richtige Codierung an der richtigen Stelle verwenden.

    In welcher Codierung liegt die Webseite mit dem Formmailer vor?
    In dieser Codierung kommen dann i.d.R. auch die Daten an am Server.

    Der Mail-Funktion ist es egal, was für eine Codierung sie dem Mailserver übermittelt, aber dem Mailserver eventuell nicht, welche er bekommt (in den Headern) und der Client wüsste nachher auch gerne, welche er bekommt in Mail-Headern und Mail-Body, damit er sie richtig anzeigen kann.

    Also musst Du an der Stelle, wo Du noch Einfluss darauf hast, die Codierungsinformation einbauen, bzw. die vorgeschriebene Codierung (ASCII für die Mailheader) herstellen.

    Das geht z.B. mit der Funktion mb_encode_mimeheader()
    http://de2.php.net/manual/en/function.mb-encode-mimeheader.php

    Liebe Grüße aus dem schönen Oberharz

    Tom vom Berg

    --
     ☻_
    /▌
    / \ Nur selber lernen macht schlau
    http://bergpost.annerschbarrich.de