Keskustelut - PHP - Merkistöongelmia X-Maileris


editoitu: 10:00 19.1.10
ikaroz 10:00 19.1.10 
Tein pienen palaute-koodin tässä, ja törmäsin ongelmaan merkistön kanssa.

Olen säätänyt kaiken defaultille utf-8, mutta kun lähetän viestin, Thunderbird osaa lukea sen oikein utf-8, ä on ä ja ö on ö, mutta kun kirjaudun webmailiin (Horde), ä onkin ä ja ö on ö eli perus merkistötuhrausta. Jos vaihdan merkistön iso-8859-1 molemmat tuhraavat ä ja ö -kirjaimet.

Osaisiko joku auttaa tässä ongelmassa että saisin tekstin oikein molemmissa ohjelmissa? Pistän koodit alapuolelle:

palaute.php
      <p>Nimesi</p>
      <input name="nimi" size="26" class="palaute" type="text" />

      <br /><br /><p>Puhelinnumerosi</p>
      <input name="puh" size="26" class="palaute"  type="text" />

      <br /><br /><p>S&auml;hk&ouml;postisi</p>
      <input name="sahkoposti" size="26" class="palaute" type="text" />

      <br /><br />
      <p><input type="checkbox" name="palaute" size="26" value="yes" class="palaute"/> Haluan, ett&auml; minuun otetaan yhteytt&auml;</p>

      <br /><p>Viesti</p>
      <textarea name="viesti" cols="25" class="palaute"  rows="7">Kirjoita viestisi t&auml;h&auml;n</textarea><br />
      <input value="L&auml;het&auml;" type="submit" />
   </form>


palautelahetys.php
<?php
$to = "sahkoposti@mail.fi";
 
$topic = "Palauteta " .
date("d.m.Y H:i", mktime());
 
$headers  .= "From: {$_POST['sahkoposti']}" . "\r\n";
$headers  .= "Reply-to: {$_POST['sahkoposti']}" . "\r\n";
$headers  .= "Content-type: text/plain; charset=utf-8" .  "\r\n";
$headers  .= "X-Mailer: PHP5";

$palaute = !empty($_POST["palaute"]) ? 'Kyllä' : 'Ei';   
   
$body    =
"
Lähettäjä: {$_POST['nimi']}

Haluan, että minuun otetaan yhteyttä: ". $palaute ."

Sähköpostiosoite:  {$_POST['sahkoposti']}
Puhelin: {$_POST['puh']}

Viesti: {$_POST['viesti']}

";
 
mail($to, $topic, $body, $headers);

echo 'Kiitos palautteestasi! Sinut ohjataan takaisin  5 sekunnin kuluttua'

?>

<meta HTTP-EQUIV="REFRESH" content="5; url=index.php?id=palaute">
Runoltaja 10:21 19.1.10 
Merkistöihin en just nyt muista vastausta kuin pearin mail-mimen käyttö, mutta kerronpa sinulle että tulet saamaan kovasti roskapostia tuolla.
timoh 10:43 19.1.10 
Lisää noihin headereihin mime-versio ja content-transfer-encoding, jotenkin tyyliin:
MIME-Version: 1.0
Content-Transfer-Encoding: 8bit

Ja validoi varsinkin noita käyttäjän syötteitä mitä istutat headereihin (karsi ainakin \r ja \n ja \0 pois). Tuosta viestin bodyynkin menevästä syötteestä kannattaa ainakin stripata \0 -merkit pois.
editoitu: 11:36 19.1.10
ikaroz 11:19 19.1.10 
\0 ? ja kumpikaan näistä header ehdoista ei auttanut. Itse asiassa näiden \r\n tagien poisto aiheutti vain että alemmat headerin tagit eivät toimineet. Eikä roskaposti nyt kiinnosta, teen siihen myöhemmin jotakin.
timoh 11:42 19.1.10 
Tarkoitin tuolla \r ja \n (ja \0) merkkien poistolla, että poista ne tuosta käyttäjältä tulevalta syötteeltä minkä laitat header-osaan: $_POST['sahkoposti']. Eli tietysti sinne headereihin jää ne rivinvaihdot erottamaan tietueita tisistaan, mutta käyttäjän syötteessä niitä ei tule olla.

Sitten nuo muut inputit mitä viet viestin bodyyn ($_POST['nimi'], $_POST['sahkoposti'], $_POST['puh'] ja $_POST['viesti']), niin strippaa niistä pois ainakin tuo \0 -merkki (null byte), sitä ei siellä missään nimessä käyttäjän syöttämänä tarvita.
editoitu: 12:28 19.1.10
ikaroz 12:05 19.1.10 
Jooh ymmärrän ilmeisesti (en ole koodannut PHP kovinkaan paljoa). Eli korvata {$_POST['tagi']} koodiin $sahkoposti = $_POST['sahkoposti'] ja laittaa ne vain $sahkoposti, tuonne headereihin ja bodyyn. Mutta tämä ei minun alkuperäistä ongelmaani ratkaise millään lailla.

Mutta yrittänyt jopa ISO-8859-1 merkistöllä. Webmail ei enää valita että olisi väärä merkistö, mutta nyt myös thunderbird tulostaa ä ja ö roskana.
ikaroz 12:31 19.1.10 
Haa sainpas toimimaan . Piti vain lisätä nämä HTML meta tagit charsettien kanssa tuohon palautelahetys.php kun se ei ollut liitettynä tuohon normi index.php.