Andreas der Fragende: Sonderzeichen beim übermittlung werden falsch angezigt -> über

Ich habe ein Problem beim versenden von Emails.
Alle Daten kommen aus einem Formular.
Die Seite ist mit

<meta http-equiv="content-type" content="text/html; charset=utf-8" />

hinterlegt.

Alle Sonderzeichen werden falsch dargestellt:

übermittelt

Zeilenvorschub als

\r\n

Ich denke ich kann bevor ich die Daten versende, wahrscheinlich irgendwo das Format hinterlegen.

Kann mir da jemand weiterhelfen?

Andreas

  1. Ich habe ein Problem beim versenden von Emails.
    Alle Daten kommen aus einem Formular.
    Die Seite ist mit

    <meta http-equiv="content-type" content="text/html; charset=utf-8" />

    hinterlegt.

    Alle Sonderzeichen werden falsch dargestellt:
    übermittelt

    Vermutlich ist das Programm, welches die Mails anzeigt der Aufassung, der Text(?) sei in ISO-8859-15 oder WIN-1252 kodiert. Das kannst Du nachschauen, wenn Du Dir die Header des empfangenen Mails mal anschaust.

    Du musst also entweder im Mail einen Header einbauen, der die Kodierung übermittelt (das zeigt mein Beispiel) oder aber den Text z.B. mit iconv umkodieren. Schwierigkeit dabei: utf-8 kennt Zeichen, die in ISO-8859-15 oder WIN-1252 nicht definiert sind.

    Zeilenvorschub als
    \r\n

    Das ist eigentlich richtig. Oder meinst Du, dass der Leser des Mails etwas sieht wie

    "Das ist Zeile 1\r\nDas ist Zeile 2\r\nUnd das ist Zeile 3".

    Dann hast Du das Problem, dass aus irgendeinem Grund im Skript die Daten einmal zu viel maskiert werden.

    Spiel doch mal damit:

    <?php  
    mb_language("de");  
    mb_internal_encoding("UTF-8");  
      
    $to      = '"' . mb_encode_mimeheader('Mailempfänger') . '" <mail.empfaenger@example.org>';  
    $from    = '"PHP-Skript" <php-skript@example.org>';  
    $subjekt = 'Mit viel Hüh und Hott gehts flott.';  
    $message = 'Das ist eine Testnachricht mit Umlauten:  
    ÄÜÖ  
    äüöß  
    und dem Euro-Symbol:€';  
      
    $headers = array  
    (  
         'Content-Type: text/plain; charset="UTF-8"',  
         'Content-Transfer-Encoding: 8bit',  
         'Reply-To: ' . $from  
    );  
    mb_send_mail($to, $subjekt, $message, implode("\r\n", $headers));  
    ?>
    

    Du musst natürlich die Mailadressen durch solche ersetzen, die Dir gehören.

    Jörg Reinholz

    1. Dann hast Du das Problem, dass aus irgendeinem Grund im Skript die Daten einmal zu viel maskiert werden.

      Ja das Stimmt, sie wurden zweimal maskiert.

      Das Beispiel von dir hat mir sehr weitergeholfen.

      Doch irgendwas stimmt nicht ganz, bei Empfang der Mail, ist das → From Feld leer

      <?php

      mb_language("de");
      mb_internal_encoding("UTF-8");

      $to      = '"' . mb_encode_mimeheader('Mailempfänger') . '" mail.empfaenger@example.org';
      $from    = '"PHP-Skript" php-skript@example.org';
      $subjekt = 'Mit viel Hüh und Hott gehts flott.';
      $message = 'Das ist eine Testnachricht mit Umlauten:
      ÄÜÖ
      äüöß
      und dem Euro-Symbol:€';

      $headers = array
      (
           'Content-Type: text/plain; charset="UTF-8"',
           'Content-Transfer-Encoding: 8bit',
           'Reply-To: ' . $from
      );
      mb_send_mail($to, $subjekt, $message, implode("\r\n", $headers));
      ?>

      
      >   
      > Du musst natürlich die Mailadressen durch solche ersetzen, die Dir gehören.  
      >   
      > Jörg Reinholz
      
      1. Ich habe Reply-To gegen FROM getauscht und jetzt funktioniert alles bestens.
        Doch ich finde nicht genau was Reply-To bedeuted, bzw. was der Zweck ist.

        Andreas

        1. Om nah hoo pez nyeetz, Andreas der Fragende!

          Doch ich finde nicht genau was Reply-To bedeuted, bzw. was der Zweck ist.

          http://de.wikipedia.org/wiki/Header_(E-Mail)#Reply-To:_Antwortadresse

          Matthias

          --
          Der Unterschied zwischen Java und JavaScript ist größer als der zwischen Span und Spange.

      2. Hallo,

        Doch irgendwas stimmt nicht ganz, bei Empfang der Mail, ist das → From Feld leer

        ich sehe im Code-Auszug auch keine Stelle, wo ein "From:"-Header gesetzt wird, stattdessen ein "Reply-To:".

        Ich habe Reply-To gegen FROM getauscht und jetzt funktioniert alles bestens.

        Heißt das, du hast den Header "Reply-To:" in "From:" geändert? Das wäre okay.

        Doch ich finde nicht genau was Reply-To bedeuted, bzw. was der Zweck ist.

        Das benutzt man dann, wenn man möchte, dass die Antwort an eine andere Adresse geht als an die, von der die Nachricht verschickt wurde - etwa wenn die Sekretärin die Nachricht schreibt, die Antwort aber direkt an den Chef gehen soll.

        $to      = '"' . mb_encode_mimeheader('Mailempfänger') . '" mail.empfaenger@example.org';
        $from    = '"PHP-Skript" php-skript@example.org';
        $subjekt = 'Mit viel Hüh und Hott gehts flott.';

        Achtung! Der Betreff-Text (Subject) enthält auch Umlaute, also Nicht-ASCII-Zeichen. Also muss er auch codiert werden wie weiter oben die Empfängeradresse.

        Ciao,
         Martin

        --
        Wissen erwirbt man, indem man immer das Kleingedruckte sorgfältig liest.
        Erfahrung bekommt man, indem man das nicht tut.
        Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
      3. Doch irgendwas stimmt nicht ganz, bei Empfang der Mail, ist das → From Feld leer

        Wenn Dein Mailagent den From-Header nicht setzt, dann solltest Du das machen:

        $headers = array  
        (  
             'Content-Type: text/plain; charset="UTF-8"',  
             'Content-Transfer-Encoding: 8bit',  
             'Reply-To: ' . $from,  
             'From: ' . $from,  
        );
        

        Wenn Dein Mailagent den From-Header aber selbst setzt, dann kannst Du zwar einen anderen setzen, doch der wird _eventuell_ überschrieben. (das ist bei Dir offenbar nicht der Fall).

        Gute Gründe dafür, die Absenderadresse nicht selbst zu setzen:

        Es _kann_ aber auch sein, dass der empfangende Mailserver das Mail ablehnt:

           ----- Transcript of session follows -----  
        ... while talking to gmail-smtp-in.l.google.com.:  
        
        >>> DATA  
        
        <<< 550-5.7.1 [XXX.XXX.XXX.XXX      12] Our system has detected that this message is  
        <<< 550-5.7.1 likely unsolicited mail. To reduce the amount of spam sent to Gmail,  
        <<< 550-5.7.1 this message has been blocked. Please visit  
        <<< 550-5.7.1 http://support.google.com/mail/bin/answer.py?hl=en&answer=188131 for  
        <<< 550 5.7.1 more information. z3si5091466wjx.177 - gsmtp  
        554 5.0.0 Service unavailable  
        
        

        Das kann dann der Fall sein, wenn die angegebene Maildresse zu einer Domain gehört, für welche SPF-Eintrag gesetzt wurde und der versendende Host darin nicht "erlaubt" ist. (Im obigen Beispiel habe ich die Ablehnung provoziert.)

        Ein SPF-Eintrag ist ein Eintrag im DNS. Grob gesagt zeigt der SPF-Eintrag an, welche Hosts Mails mit der Angabe der Domain (für die der Eintrag gesetzt wurde) versenden dürfen. Ob er abgefragt und beachtet wird ist Sache des Admins des empfangenden Mailservers.

        Abrufbar ist ein SPF-Record z.B. mit nslookup -t text gmail.com - Resultat:

        fastix@trainer:~$ host -t txt gmail.com  
        gmail.com descriptive text "v=spf1 redirect=_spf.google.com"
        

        Folgen:

        fastix@trainer:~$ host -t txt _spf.google.com  
        _spf.google.com descriptive text "v=spf1 include:_netblocks.google.com include:_netblocks2.google.com include:_netblocks3.google.com ~all"
        

        Würde ich z.B. eine Adresse mit dem Domainpart googlemail.com als Adresse des Senders angeben, dann kann ich mir sicher sein, dass _einige_ Empfangsserver den Zugang wie oben gezeigt ablehnen - weil der (angebliche) Absender von einem nicht genannten (oder eingeschlossenem) Host aus versucht, das Mail "einzuwerfen". Das soll Spam ver(h|m)indern.

        Muss man jetzt aus den oben genannten Gründen eine bestimmte aber (selbst) nicht gewünschte Mailadresse angeben (oder wird die angegebene überschrieben) dann gibt man kurzerhand hinter Reply-To eine Adresse an, an welche Antworten gesendet werden sollen, damit das Mailprogramm des Empfängers dessen Antworten nicht ins Nirvana sendet.

        Jörg Reinholz

        1. Hallo,

          Wenn Dein Mailagent den From-Header aber selbst setzt, dann kannst Du zwar einen anderen setzen, doch der wird _eventuell_ überschrieben. (das ist bei Dir offenbar nicht der Fall).

          das ist natürlich denkbar, aber gibt es den Fall tatsächlich? - Ich kenne es bisher nur andersrum, also dass der MTA einen From-Header mit irgendeiner Default-Absenderadresse einfügt, wenn ich selbst keinen angebe. Aber das möchte man eigentlich nicht, denn woher soll er wissen, _welche_ von mehreren gültigen, existierenden Mailadressen das laufende Script verwenden möchte?

          Es _kann_ aber auch sein, dass der empfangende Mailserver das Mail ablehnt:

          Es kann sogar sein, dass der _sendende_ Mailserver den Versand wegen einer für ihn ungültigen Absenderadresse ablehnt.

          Das kann dann der Fall sein, wenn die angegebene Maildresse zu einer Domain gehört, für welche SPF-Eintrag gesetzt wurde und der versendende Host darin nicht "erlaubt" ist. (Im obigen Beispiel habe ich die Ablehnung provoziert.)

          Das ist ja dann auch völlig korrekt. Wenn ich Mail versende, sollte ich das natürlich auch mit einer zur Domain gehörenden bzw. passenden Absenderadresse tun. Und dann gebe ich als From-Header eben eine der auf diesem Server eingerichteten Mailadressen an.

          Ich halte es jedenfalls für sinnvoll, die tatsächlich genutzte Absenderadresse in "From" anzugeben.

          Ciao,
           Martin

          --
          Männer sind ungerecht: Sie sehen immer nur den Baum, den eine Frau mit dem Auto gerammt hat. Aber die vielen Bäume, die sie nicht einmal gestreift hat, sehen sie nicht.
          Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
          1. Ich halte es jedenfalls für sinnvoll, die tatsächlich genutzte Absenderadresse in "From" anzugeben.

            Das ist richtig. Ergänzung: Wenn der Hoster den Mailtransport vernünftig konfiguriert hat ist es nicht nur sinnvoll sondern auch möglich :-)
            Jörg Reinholz

  2. @@Andreas der Fragende:

    nuqneH

    Alle Sonderzeichen werden falsch dargestellt:

    übermittelt

    BTW, ü ist kein Sonderzeichen, sondern ein ganz normaler Buchstabe.

    Qapla'

    --
    „Talente finden Lösungen, Genies entdecken Probleme.“ (Hans Krailsheimer)
  3. hi Andreas,

    s. mal auch hier: http://forum.de.selfhtml.org/archiv/2014/5/t217437/#m1493705

    mfg

    tami