PHP Sendmail, kyrillische Zeichen, E-Mail-Betreff

Hi All,

ich habe ein kleines Problem. Ich versuche kyrillische Zeichen mit einer Mailklasse bzw. mit PHPs-sendmail zu versenden. Bei beiden erhalte dieselben Resultate. Die Zeichen werden (in Outlook) nur als die Zeichenrepräsentation dargestellt! Ich habe keinen anderen Ansatz gefunden als die vom Übersetzer eingegebenen kyrillischen Zeichen als folgende Zeichen in der mySQL-Datenbank zu speichern (mySQL macht dies automatisch):

Beispiel von zwei Zeichen: Вх

Es sind glaub ich HTML-Entitäten die die kyrillischen Zeichen abbilden, ausser das dies so recht umständlich ist, bekomm ich beim automatisierten versandt von E-Mails (z. B. Anmelde-Bestätigung etc.) einen Mail-Subject mit genau diesen Zeichen :frowning: Der Body ist ok, ich versende diese Mails einfach als HTML mit Content-Type: text/html; charset=iso-8859-1 und sogar Outlook stellt sie ordentlich dar -> im Sourcode der E-Mail sind aber nach wie vor die Entitäten! Frage ist nun. Gibt es einen weg kyrillische Zeichensätze auch im Betreff richtig darstellen zu lassen? Ich habe es schon mit div. Umwandlungen versucht. Leider nix :frowning:

Danke für Tripps

Timo

ah sorry scheinbar hat wer-weiss-was die zeichen umgewandelt vor dem speichern…

ich versuchs nochmal, die sehen so aus (nur ohne leerstellen):

& # 1042 ;

& # 1086 ;

hallo,

entweder das email-programm interpretiert dein html im betreff auch als solches oder du hast wohl gelitten. schon mal gefragt, was passiert, wenn sich jemand aus hinter-indien registriert, der nur indische zeichensätze auf seinem pc installiert hat und vielleicht gar nicht outlook sonder BeOS benutzt?

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Yo

klar hab ich mich das gefragt. aber ich habe mal gelesen, dass man den Subject auch mime-encoden können soll, also so ne art content-type-deklaration nur eben für den subject und wenn man den wirklich setzen kann, dann könnte es doch sein das Outlook auch den betreff richtig darstellt, so wie er es ja im body schon tut :smile:

Hi !

Hi All,

ich habe ein kleines Problem. Ich versuche kyrillische Zeichen
mit einer Mailklasse bzw. mit PHPs-sendmail zu versenden. Bei
beiden erhalte dieselben Resultate. Die Zeichen werden (in
Outlook) nur als die Zeichenrepräsentation dargestellt! Ich

Charset-Header wird wohl falsch sein. Normalerweise geht das, sogar als text/plain, nur MIME - Header samt passenden Charset (z.B. ISO-8859-5) braucht es natürlich.

habe keinen anderen Ansatz gefunden als die vom Übersetzer
eingegebenen kyrillischen Zeichen als folgende Zeichen in der
mySQL-Datenbank zu speichern (mySQL macht dies automatisch):

Das geht natürlich auch, bei den Unicode Entitäten sollte dem Mailprogramm der Charset Header egal sein, das geht natürlich nur in HTML.

Es sind glaub ich HTML-Entitäten die die kyrillischen Zeichen
abbilden, ausser das dies so recht umständlich ist, bekomm ich
beim automatisierten versandt von E-Mails (z. B.
Anmelde-Bestätigung etc.) einen Mail-Subject mit genau diesen
Zeichen :frowning: Der Body ist ok, ich versende diese Mails einfach

Logisch, im Subject geht kein HTML. Da muss man nach RFC 2047 codieren:
=?iso-8859-5?q? im Sourcode der

E-Mail sind aber nach wie vor die Entitäten! Frage ist nun.

Logisch, wenn du Entitäten schickst, kommen die auch an und werden vom Client umgewandelt. Ansonsten in iso-8859-5 schicken und die Zeichen direkt verwenden.
Statt iso-8859-5 geht auch koi8-r, etc.

Gibt es einen weg kyrillische Zeichensätze auch im Betreff
richtig darstellen zu lassen? Ich habe es schon mit div.
Umwandlungen versucht. Leider nix :frowning:

Siehe oben. Zeichen umwandeln in den entsprechenden Zeichensatz am besten mit einem Editor, der verschiedene Zeichensätze speichern kann, mit fällt außer dem etwas komplizierten vim leider keiner ein.

Alexander

wow

erstmal danke. aber da diese antwort-emails vom server automatisch gesendet werden kann ich doch kein editor wie vim etc. einsetzen oder? ich müsste da ne php-funktion finden, aber ich versuche es erstmal mit den von Dir genannten character-sets.

danke erstmal

timo

Hi nochmal,

also ich habe mir die RFC mal angesehen. Genauso wie DU es beschrieben hast auch umgesetzt, mein Subject wird folgendermaßen gefüllt:

„=?iso-8859-5?q?“.str_replace(" „,“=20is",$aVoc[$session_data[lang]][486])."?="

Das Array $aVoc ist ein Spracharray, dort werden die jeweiligen Zeichen ausgegeben, laut RFC ersetze ich Whitespace mit =20is, leider kommen die Subjects so auch nicht besser an, weder im Outlook noch in einem webbasierten Freemailer-Account, wobei mich das dort wundert, der Browser müsste doch bei einem webbasierten System die Subject genauso umwandeln wie den Body oder?

Komisch :smile:

Also ich suche mal weiter, danke nochmals.

Timo

Hallo Timo !

wow

erstmal danke. aber da diese antwort-emails vom server
automatisch gesendet werden kann ich doch kein editor wie vim
etc. einsetzen oder? ich müsste da ne php-funktion finden,
aber ich versuche es erstmal mit den von Dir genannten
character-sets.

Wenn du die Daten com Browser bekommst, und die „absendende“ Seite das Charset passend eingestellt hat, bekommst du die Daten im richtigen Charset und musst gar nichts konvertieren.

Alexander

nochmal zum verständnis, die absendende seite, also mein php-script, bastel die nötigen header zusammen, sind es die header-deklarationen die wichtig sind? zur info. der bereich sieht so aus:

$headers = „From:blush:my_envVars[email]\n“;
$headers .= „X-Sender: \n“;
$headers .= „X-Mailer: PHP\n“;
$headers .= „X-Priority: 1\n“;
$headers .= „Return-Path: \n“;
$headers .= „Content-Type: text/html; charset=iso-8859-1\n“;

$my_envVars sind dabei mein gescopten Post-Daten aus dem Formular welche ich erst einmal globaliseren (Register Globals = Off), Rest sollte bekannt sein.

Danke nochmals

Timo

Hi nochmal,

also ich habe mir die RFC mal angesehen. Genauso wie DU es
beschrieben hast auch umgesetzt, mein Subject wird
folgendermaßen gefüllt:

„=?iso-8859-5?q?“.str_replace("
„,“=20is",$aVoc[$session_data[lang]][486])."?="

Nur Leerzeichen ersetzen reicht nicht, man muss alles was nicht 7bit ist ersetzen. Da PHP wohl keine Funktion dazu hat, tut es die Alternative base64 auch (auf der PHP Webseite gibt es aber auch einen quotet printable encoder, evtl tut es auch ein str_replace("%","=", urlencode($text)), base64 ist einfacher zu tippen :wink: :

">

if ($_POST[„a“]) {
mail(„[email protected]“,
„=?iso-8859-5?b?“.base64_encode($_POST[„a“])."?=",
„Body“);
}
?>

Das Array $aVoc ist ein Spracharray, dort werden die
jeweiligen Zeichen ausgegeben, laut RFC ersetze ich Whitespace
mit =20is, leider kommen die Subjects so auch nicht besser an,
weder im Outlook noch in einem webbasierten
Freemailer-Account, wobei mich das dort wundert, der Browser
müsste doch bei einem webbasierten System die Subject genauso
umwandeln wie den Body oder?

Naja, siehe RFCs, im Body ist das Ganze etwas anders, da geht auch mehr. Im Header sind explizit nur 7bit Zeichen zulässig.

Alexander

nochmal zum verständnis, die absendende seite, also mein
php-script, bastel die nötigen header zusammen, sind es die
header-deklarationen die wichtig sind? zur info. der bereich
sieht so aus:

$headers = „From:blush:my_envVars[email]\n“;
$headers .= „X-Sender: \n“;
$headers .= „X-Mailer: PHP\n“;
$headers .= „X-Priority: 1\n“;
$headers .= „Return-Path: \n“;
$headers .= „Content-Type: text/html; charset=iso-8859-1\n“;

Russich ist aber iso-8859-5 oder koi8-r, das sollte dann auch statt der iso-8859-1 da stehen. Mit iso-8859-1 geht es nur, wenn du alle Entitäten als yyyy; angiebst.

Alexander

hmm also ich habe iso…-1 angegeben, da es bei mir so auch korrekt dargestellt wird und ich davon ausgehe, dass die installierte windows etc. basis mit diesem zeichensatz höher ist als die mit -5…ich hatte das „gefühl“ das der -1er Zeichensatz die Zeichen von -5 integriert hat (?), wie auch immer, ich gebe sie immer in dem von Dir genannten Format auch an, bzw. so speichert es die mySQL (4) Datenbank scheinbar durchgängig automatisch, wenn meine Kunden über das CMS Ihre Daten über den Webbrowser pflegen.

Wow. Danke erstmal. ICh teste jetzt erstmal dein vorletzten Artikel.

Best

Timo

hmm hab ich jetzt alles so versucht mit base64_encode:

$sendecheck = mail(„[email protected]“,"=?iso-8859-5?b?".base64_encode($aVoc[$session_data[lang]][723])."?=",$mailString,$headers,"[email protected]");

aber es kommt wieder nicht so an, kann es sein dass php eine einstellung haben muss, in der dies irgendwie aktiviert sein sollte bzw. sendmail von cgi? kein plan bin da jetzt nicht mehr so fit mit sendmail-themen. any ideas? oder rafft das einfach outlook nimmer?

sorry falls es nervt, du musst nicht :smile:

danke trotzdem!

timo

hmm hab ich jetzt alles so versucht mit base64_encode:

$sendecheck =
mail(„[email protected]“,"=?iso-8859-5?b?".base64_encode($aVoc[$session_data[lang]][723])."?=",$mailString,$headers,"[email protected]");

aber es kommt wieder nicht so an, kann es sein dass php eine
einstellung haben muss, in der dies irgendwie aktiviert sein
sollte bzw. sendmail von cgi? kein plan bin da jetzt nicht
mehr so fit mit sendmail-themen. any ideas? oder rafft das
einfach outlook nimmer?

Hat nichts mit sendmail zu tun. Das, was in „$aVoc[$session_data[lang]][723]“ steht, muss auch in dem entsprechenden Zeichensatz (entweder iso-8859-5 oder koi8-r, ja nachdem, was angegeben ist) codiert sein.
In -5 sind „normale“ 7bit ASCII-Zeichen enthalten, aber z.B. keine deutschen Umlaute. Die kyrillischen Zeichen sind ab Zeichencode 128 in -5 enthalten, wo eben in -1 z.B. deutsche (äüö) und französische Sonderzeichen stehen. -1 geht daher eben nur im HTML, und dort auch nur deshalb, weil xxx; auf Unicode umschaltet und der angegebene Zeichensatz dann egal ist.
Wenn in $aVoc[$session_data[lang]][723] (gespeicherte) Eingaben aus einem Formular stehen, müssen diese eben beim Speichern schon im richtigen Zeichensatz sein, zur Not per „accept-charset“ im -Tag. Stehen da jetzt Unicode Umscreibungen drin, musst du diese passend umwandeln (unter Linux gibt es da iconv, allerdings müssen dann wahrscheinlich vorher die Entitäten in „richtiges“ (binäres) UTF-16 umgewandelt werden).
Schicke ggfs. mal ein paar mehr Infos, z.B. was in der Variable steht bzw. wie du an diese Daten kommst.

Alerxander

wow hmm jetzt wirds mir bischen hoch :smile:

Also es ist so. In einem CMS gibt ein Russischr Übersetzer, Arthur :smile: über ein „normales“ europäisches Windows seine Daten ein, das wäre bswp. das Wort „Hallo Timo“:

халло Тимо

mySQL speichert diese (leider?) folgendermaßen ab:

халло Тимо

Da ich die Mail als HTML versende wandelt Outlook diese Ansicht richtig um, aber nur im Body, komisch ist, wenn ich mir den Quelltext in Outlook ansehen stehen dort tatsächlich die kyrlischen Zeichen, nicht so im Web, dort stehen im Sourcode die Entitäten. Im Betreff der E-Mail stehen auch die Entitäten. Schickt mir Arthur eine E-mail steht im Betreff auch халло Тимо lesbar da. Hilft das jetzt weiter?

Was weiterhin vielleicht gesagt werden muss, auch wenn ich die Daten direkt über phpMyAdmin die Datenbank schreibe, also die kyrillischen Zeichen, werden diese von mySQL umgewandelt, entweder verwendet jetzt phpMyAdmin (neueste Version) kein accept-charset, oder man muss, falls das geht, die Einstellungen von Apache bzw. mySQL ändern? Any ideas? Und nächste Frage, falls das alles möglich ist, müsste ich somit einen kleinen Konverter schreiben der mir die Sprachentabelle, bzw. die Spalte für Kyrillisch komplett ausliest, umwandelt und als „richtige“ kyrillische Zeichen wieder in die Datenbank schreiben proggen oder?

Besten Dank

Timo

so: халло Т
1093; 1072; 1083; 1083; 1086; 1058; 1080; 1084; 1086;

nachtrage
sorry, das forum hat mir im vorherigen artikel die zeichen auch umgewandelt, dachte ich kann das mit pre-verhindern, wie auch immer, ich habs nochmal in einen eigenen artikel geschrieben.

warum kann man hier eigentlcih artikel nicht mehr nachträglich editieren?
komisch :smile:

wow hmm jetzt wirds mir bischen hoch :smile:

Also es ist so. In einem CMS gibt ein Russischr Übersetzer,
Arthur :smile: über ein „normales“ europäisches Windows seine Daten
ein, das wäre bswp. das Wort „Hallo Timo“:

Ok, wenn im CMS da kein passendes Charset gesetzt ist, kommt es als Unicode-Entitäten an und mySQL speichert (utf-16) diese.

Dann versuche mal im Betreff folgendes (nicht gestestet):

  • die einzelnen Entitäten &1234; in =12=34 etc. wandeln (str_replace)
  • Das ganze dann wie oben geschrieben mit utf-16 als Charset, Quoted Printable als Codierung in den Betreff
  • Das hat den Nachteil, das du bei allen nichtrussischen Zeichen aus dem UTF-16 raus musst (?=), oder die aber umkodieren (=00a) musst

Unicode zu iso-8859-5 zu wandeln geht sicher auch und ist die andere Variante, da musst du allerdings erst mal eine Tabelle Unicode-Zeichen->iso-8859-5 Zeichen bauen und diese Zeichen dann per
iso-8859-5 in den Betreff codieren (siehe Beispiel weiter oben).

Alexander