ugrás a tartalomhoz

php mail() nem hajlandó utf-8 levelet küldeni

laji · 2006. Jan. 10. (K), 19.36
Tudom, hogy valószínűleg a spanyolviasz titkát keresem, de hát egy újszülöttnek minden vicc új. Már 4 órája keresgélek a lapon. Folytatom, de hátha kisegít valaki - úgy tűnik, én végleg megakadtam.

Több száz hozzászólást találtam fejlécek betűkészletének (karakterkódolásának) beállítására. Kell majd az is, de egyelőre a levél törzsével van bajom.

A felállás: php+MySQL a lapom, utf-8 betűkészlettel, mert kétnyelvű (meg amúgy is, miért ne lehetne minden nyelvet egy megoldással kezelni? szerintem is az utf-é a jövő). Ingyenes tárhelyen elhelyezve (uw), ami a hirdetőcsík miatt keretrendszerbe teszi a lapomat. A keretrendszer beállítása iso-8859-2. Ezt nem tudom fölülírni jávasorral sem, mert az uw minden elküldött oldalam legelejére beszúr egy saját jávasorukat meghívó parancsot, ami bármilyen, a főkeretet érintő változtatás esetén visszafrissít.

Az oldalam megfelelő megjelenését sikerült elérnem a következő beszúrásával:
<?php
header("Content-Type: text/html; charset=utf-8");
?>
Így tehát már a lap jó, a levél írásakor is helyesen látszódik, ami az űrlapmezőkbe kerül - pontosabban, már be se kell kerülnie, előre gyártott a levél (a küldő kijavít rajta, amit akar). Ráadásul még onnan be is teszem egyúttal MySQL-ba (mint mentést), s ott is helyes. Viszont megérkezéskor már olvashatatlan a levéltörzs (s persze, a tárgysor is). Eleve nem is utf-8-cal jön, arra magamnak kell átállítanom az Outlookban a levelet. De még így se lesz jó az Ő és az Ű (meg a cirill betűk - ami itt most nekem a lényeg). Semmilyen betűkészlettel nem lehet elolvasni rendesen a levelet.

A levelet egyébként php mail() függvénnyel küldöm, sima szöveges (nem html) levélként. Már több mindennel próbálkoztam, pl. ezzel is:
<?php
$cimzett="en##kukac##otthon.hu";
$targy="a levél tárgya";
$torzs="a levél törzse, szövege";
$fejlec="From: ".$felado_neve." <".$felado_cime.">"."\r\n"."Content-type: text/plain; charset=utf-8";
mail($cimzett, $targy, $torzs, $fejlec);
?>
Bár már eleve nem bíztam a dologban, mert úgy értettem, hogy "Content-type...stb." csak html-levelekre vonatkozik. Nem is jött be, az uw el se küldte a levelet.

A Morva kézikönyv (http://php.morva.net) nem ír semmit sem a sima szöveges levél törzsének betűkészlet-beállításáról - pedig ez fontosabb lenne, mint a tiritarka html-levelek küldésének részletezgetése... - vagy legalábbis elsődlegesebb.

Hogy a csudába kéne elküldeni php mail()-lel egy sima szöveges utf-8 levelet?
 
1

Ha ez segít...

Nagy Péter · 2006. Jan. 10. (K), 20.37
Evolution levelező szerint egy utf8 levél az alábbiakat tartalmazza:
Subject: =?iso-8859-2?Q?=C1rv=EDzt=FBr=F5?=
        =?ISO-8859-1?Q?_t=FCk=F6rf=FAr=F3g=E9p?=
From: Nagy =?ISO-8859-1?Q?P=E9ter?= <nagyp-ll##kukac##hunaxon.hu>
To: =?ISO-8859-1?Q?P=E9ter?= Nagy <nagyp-ll##kukac##hunaxon.hu>
Content-Type: text/plain; charset=UTF-8
Mime-Version: 1.0
Content-Transfer-Encoding: 8bit

Egyébként javaslom a PhpMailer osztály használatát, Igen hasznos és egy csomó dolgot levesz a válladról.

Még egyszer újraolvasva a leveled, még egy dolog eszembe jutott: a MySQL-ből még jól jönnek ki az adatok? Mert ott is lehet bibi. Milyen verziójú a MySQL és milyen konverziókat csinálsz mielőtt leteszed bele a szövegeket?
--
NP
2

Nem megy keresztül a MySQL-on a levél szövege

laji · 2006. Jan. 10. (K), 21.24
Tartottam tőle, hogy helyenként félreérthető leszek, csak nem akartam még bővebb lére ereszteni...

Tkp. a levélhez a MySQL-nak az oldalamon nincs semmi köze. Egyszerűen az űrlapon már eleve megjelenik egy felkínált levélszöveg, amit egy előre megírt php változóval íratok ki a szövegmezőbe - s aztán a tisztelt levélíró már maga eldönti, hogy akar-e változtatni a szövegen. Ez a szöveg nem MySQL adattárból jön elő (pontosabban csak egy része), hanem a php-ben írt lapomon szerepel egy változó értékeként. Továbbá elküldéskor sem megy keresztül a levél a MySQL-on; pont azért, mert nem tudom elolvasni a leveleket, kénytelen voltam gyorsan legyártani egy MySQL táblát, amibe minden levelet, amit küld a mail(), egyúttal elmentek, hogy legalább ott olvasható legyen (s időnként rákukkantok arra a táblára). Csak hát ez persze kőkorszaki, csakis ideiglenes megoldás.
Egyébként az uw.hu MySQL-ja "MySQL 4.1.15-Debian_1-log".
A PhpMailer-ről olvasgattam Hojtsy Gábor itt lévő cikkében is (bár abból nem kaptam választ a kérdésemre), de attól tartok, hogy az uw-nál nem fognak működni az ilyen szintű dolgok. Levelet is csak napi 20-at engednek küldeni, magyarán már maga a mail() függvény is alaposan meg van szorítva a használatában - mi lehet még akkor a továbbfejlesztett dolgokkal?

Csak gyorsan akartam válaszolni, de persze most megpróbálkozom megint a PhpMailer-rel.
Üdv: laji
3

Talán az én Outlook-omnak is van köze hozzá?

laji · 2006. Jan. 10. (K), 21.34
Most nézem, ami a keretben van Nálad: "To: =?ISO-8859-1?Q?P=E9ter...". Nekem az Inviteltől érkező levelek (tőlük van adsl-em), melyek egy elküldött levelem visszaigazolásaként jönnek, pont ilyen "helytelen" kinézettel jelenítik meg a címzettet! Pedig, gondolom, az Invitel nem ilyennek szánja. Lehet, hogy nálam van tökre rosszul beállítva az Outlook? Bár, másrészt, mindenki mástól simán megjönnek a cirill betűs levelek, különféle kódolásokkal is (igaz, utf-8-ra nem emlékszem közűlük).
Üdv: laji
4

Megoldódott: set names utf8

laji · 2006. Jan. 12. (Cs), 08.42
Tronic, köszönöm a segítséget. Tényleg a MySQL-nak volt köze hozzá - bár képtelen vagyok felfogni, miért (talán az uw-sok végigkergetik egy adattáron a levelet, mielőtt elküldenék?). A megoldás, ugyanaz, mint a másik gondomra: http://weblabor.hu/forumok/temak/11281 .

További szép napot!
Üdv: laji