PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Einmal mehr: PHP und Sonderzeichen



smofi
05-03-2006, 21:47
Hallo Leute,

nachdem ich viel über HTML-Entitäten, Codierungseinstellungen usw. recherchiert habe, bleibt mir eine Frage offen.

Ich sende mit PHP ein Mail, und im Text sind Sonderzeichen:

$brief = " ... Sie k ö nnen ... " ;
mail (... $brief ... );

Im Postfach kommt an:

" ... Sie können ... "

Mein Problem ist, dass der String in $brief einfach nur ein Literal ist. Soweit ich verstanden habe, kann nur der echo-Befehl mit HTML-Entitäten sinnvoll umgehen. Aber solange ich nur ein Literal habe, helfen mir die HTML-Entitäten und Codierungshinweise nicht weiter. Wenn ich schreibe:

$brief = " ... Sie k &#246&#59; nnen ... " ;
mail (... $brief ... );

dann kommt auch "... Sie k &#246&#59; nnen ..." im Postfach an. Es hilft auch nichts, die Codierung des Editors zu verändern.

Momentan löse ich das Problem so:

$brief = " ... Sie k" . chr(246) . "nnen ..." ;


Da das ziemlich hässlich ist, bin ich dankbar für einen Tipp: Kann man das eleganter lösen?

Danke für jeden Hinweis :D

undefined
05-03-2006, 22:28
Mail versand wird über 7 beziehungsweise 8Bit versendet. Daher kannst du schon mal keinen Zeichensatz verwenden der darüber liegt.
Siehe google us-ascii und Content-Transfer-Encoding

CoolPolo
06-03-2006, 02:10
Ich würde das E-Mail als HTML-E-Mail versenden. Das würde dan so aussehen:



$brief = "<html><body>";
$brief .= "... Sie k &ouml; nnen ...";
$brief .= "</body></html>";

$header = "Content-Type: text/html";

mail(... $brief, $header);


Ich hoffe ich konnte Dir bei Deinem Problem helfen.

MFG CoolPolo

Turbohummel
06-03-2006, 05:48
Oder als RTF (ich mag keine HTML-Mails). Dann kannst du das Sonderzeichen auch escapen (nicht verzagen, google fragen).
Komischerweise habe noch keine Probleme beim Mail-Versenden gehabt.

smofi
06-03-2006, 07:20
Vielen Dank für Eure Antworten :)

Bei HTML- und RTF-Mails bringen viele Mailprogramme eine Spamwarnung und stellen zunächst nur den Code dar. Das möchte ich wenn möglich vermeiden.

Irgendwie raffe ich noch nicht, wer in der Kette Editor - PHP-Interpreter - Mailserver - Mailprogramm warum welche Codierung hinzufügt oder wegnimmt und wie ich das steuern kann. Aber das muss ich mir selber mal zusammenstellen; der Hinweis auf Content-Transfer-Encoding ist ein guter Einstieg.

Nochmals danke und weiterhin viel Spass in der Informatik... :cool:

tomes
06-03-2006, 21:24
Content-Transfer-Encoding ist genau richtig ;)
Das Ganze ist relativ einfach. Du kannst dir ja deinen Mail-Header selber zusammen stellen --> http://de3.php.net/manual/de/function.mail.php
Um die Parameter rauszubekommen, mache ich das so.
Ich schicke mir selber ueber ein "normales" Mailprogramm eine solche Mail zu und schau mir dann den Quellcode an.
Dabei kommt dann das z.B. raus:

///////////////////////////////////
$headers="From: ".$from." < ".$email." >\n";
$headers.="Reply-to: ".$from." <".$email.">\n";
$headers.="Reply-path: ".$from." <".$email.">\n";
$headers.="MIME-Version: 1.0\n";
$headers.="Content-Type: text/plain;\n\t charset=\"utf-8\"\n";
$headers.="Content-Transfer-Encoding: 8bit\n";
$headers.="X-Sender: webserver@meine.domain.de\n";
$headers.="X-Mailer: PHP\n";
$headers.="X-Priority: 3\n";


tomes

smofi
07-03-2006, 08:24
@Tomes: Danke für Deinen Code! Das ist genau das Puzzlestück, das mir fehlte :D :D Da wir geografisch zu weit auseinander wohnen, kann ich Dir kein Bierchen spendieren.

Ich hab noch ein wenig herumprobiert. Sonderzeichen entstehen offensichtlich, wenn die Codierung des editierten PHP-Files und die Codierungsangabe im Mailheader sich unterscheiden.

Beide können UTF-8 sein oder beide können ISO-8859-1 sein, in jedem Fall kommen lesbare Zeichen an (...jedenfalls bezgl. unserer deutschen Umlaute).

Zusammenfassung @ alle, die das Problem auch haben: Hier überall zählen Codierungen.

Editor:
Codierung Eingabemethode
Codierung der Datei, wie sie effektiv gespeichert wird (bspw. beim XEmacs mit C-x C-m f einstellbar)

Mailtransport:
Der Mailserver tut wahrscheinlich nichts mit der Codierung selbst. Der transportiert Dateien und erweitert den Header. Spamassassins untersuchen die Dateien und erweitern ebenfalls den Header. Aufgrund des 7/8-Bit-Transportes dürften 16-Bit-Codierungen neue Probleme aufwerfen (-->undefined)
Codierung zum Mailen im Header mitgeben für den Mailclient!

Mailclient:
Codierung des Mailclients zur Darstellung: normalerweise gibt es bei der Einstellung einen Punkt "Auto". Das Mailprogramm liest bei "Auto" die Codierung aus dem Mailheader. Wenn man die Codierungen von Hand umstellt, sieht man, wie die lesbaren Zeichen kommen und gehen.
Codierungsangabe im Header

tomes
14-03-2006, 21:46
Schoen das ich helfen konnte.
Uebrigens:

7/8-Bit-Transportes dürften 16-Bit-Codierungen neue Probleme aufwerfen (-->undefined)
Die Zauberformel heisst hier:
Content-Transfer-Encoding: base64 ;)

Den Header richtig umzuschreiben ist immer spannend, aber dafuer gibt es auch mehrere Loesungen.
Wie gesagt, am besten sich ersteinmal aus den Thunderbird heraus eine Mail zuschicken. Dann sieht man wie der prof. Mailclient den Header schreibt.

tomes

sagi
14-03-2006, 23:00
Ich hab dazu mal ein Tutorial geschrieben:

http://sagmueller.net/php-tut/mails.html