Sonderzeichen beim übermittlung werden falsch angezigt -> über
Andreas der Fragende
- php
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
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
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
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
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
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
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
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
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
@@Andreas der Fragende:
nuqneH
Alle Sonderzeichen werden falsch dargestellt:
übermittelt
BTW, ü ist kein Sonderzeichen, sondern ein ganz normaler Buchstabe.
Qapla'