ugrás a tartalomhoz

Mail küldése PHP-ben (naná, hogy probléma)

Blackfriar · 2008. Jan. 1. (K), 10.39
Sziasztok!
Hát nagy fába vágtam ismét a fejszém. Aki olvasta azt a kevés hozzászólást amit ezidáig írtam, az tudja, hogy ez nem vicc.
Nos az alábbi, eléggé bonyolult PHP kóddal kívánok e-mailt küldeni.
<?php
$to = "akarki##kukac##freemail.hu";
$from = "valaki##kukac##freemail.hu";
$subject = "éáűúőí";
$message = "ez az üzenet: éáűúőóí";
$headers = "From: $from";
mail($to, $subject, $message, $headers);
?>
A mail el is megy, a postafiókba érkező eredmény már különböző, attól függően, hogy hová küldtem.
gmail: ékezetek rendben
freemail: ékezetes betűk helyén kriksz-krakszok
chello: ékezetes betűk helyén kérdőjelek

2 teljes napot szántam rá, hogy a megoldást megtaláljam, naná, hogy eredmény nélkül (Rain man). A neten gyakorlatilag nem találtam érdemleges írást a témában (meglehet, rosszul kerestem). Valami hasonló problémával foglalkozó beírást találtam itt a fórumon. Az ott leírtakat is kipróbáltam, persze eredmény nélkül :-)).
Khmm..., ha belegondolok, hogy ez egy néhány soros kód, a Windows pedig néhány gigán érkezik, akkor elborzadok.
Naná, hogy hálás lennék, ha valaki felvilágosítaná a setét agyam a probléma megoldásával kapcsolatban.

Üdv
 
1

Karakterkódolás

janoszen · 2008. Jan. 1. (K), 10.50
Az hogy a PHP fájlban hogy szerepelnek az ékezetek meg a levelezőprogram hogy értelmezi őket, az két külön dolog. Két problémával nézel szembe, ebből az egyik könnyen javítható.

1. Meg kell adnod egy Content-Type fejlécet. Ez megoldja a tartalom problémát.
2. A subjectet mondjuk quoted printable kódolásba kell tenned és meg kell fejelned egy karakterkódolás előtaggal, pl így: =?UTF-8?Q?Subject...?=
+1 ha a fejléceid a felhasználótól jönnek, mint pl a from, akkor mindenképp vigyázz vele, mert ha csak úgy natúrban tud beszúrni bármit oda, akkor remekül spamelésre lehet majd használni a végeredményt.

Ja, és BUÉK.
2

válasz

Blackfriar · 2008. Jan. 1. (K), 11.14
Köszi a választ. Csak azt nem értem, ezeket, amiket leírtál, nekem honnan kéne tudnom. Ha pedig ezek nem maguktól értedődő dolgok, akkor miért nem bukkantam rájuk valahol?

És köszi az újévi jókívánságot, csak valahogy röhejesnek érzem, hogy kívángatunk egymásnak mindenféle jókat, miközben minden csak egyre rosszabb lesz.

Üdv
3

A jó szakember...

s_volenszki · 2008. Jan. 1. (K), 12.18
Szia!

A jó szakember nem mindig tudja a megoldást fejből, de amit tud az az, hogy melyik könyvet kell levenni a polcról!

Tehát neked csak annyit kell tudnod, hogy vannak olyan könyvek => weboldalak, ahol megleled a megoldást!

pl.:

wikipedia.org E-mail
Php manuál Mail
google.hu php+email+format

s_volenszki

off:
Hogy hogyan éled meg az új évet (a poharad már félig üres vagy még félig tele van) az kizárólag rajtad múlik!
BUÉK
4

válasz

Blackfriar · 2008. Jan. 1. (K), 12.48
Kedves s_volenszki!

Kérlek mutasd meg, hogy az általad ajánlott

1. Php manuál Mail-ben hol szerepel az hogy, a helyes formátumú üzenet megjelenítéséhez szükséges a $headers = "Content-Type: text/plain; charset=utf-8"; sor. Ne keresgélj, mert sehol. Csak az van benne, hogy html tartalom esetén mi legyen benne.

2. A "google.hu php+email+format"-ot ugye te sem gondolod komolyan? Az ott kapott találatok nem foglalkoznak a magyar ékezetes karakterek problémájával.

3. Hab a tortán: ha a Google-ba beütöd a keresett megoldást, egyből ezer találatod lesz. Érdekes, nem?

Valóban, nem vagyok se informatikus mérnök, se számítástechnikai szakember, de a középiskolánál azért egy kicsit feljebb jutottam.

Egyébiránt hasonló jó éveket kívánok, mint az előzőek voltak!

Üdv
5

intuíció

drifter · 2008. Jan. 1. (K), 13.25
Én valahogy így gondolkodnék: ha a "magyar ékezetek" valamiért nem jönnek át valahol, első gondolatom az hogy a karakterkódolással lehet valahol gond. Nem kell hogy fejből tudjam az 822-es és 2045-ös RFC-ket, de valahol sejtem hogy az e-mail valahol tartalmazhatja a kódolást is. Innen több úton is elindulhatok, pl. eszembe jut hogy a levelezőprogramnak van "view message source" opciója, és megnézem egy működő ékezetes levél forrását. Abban találok pl. ilyesmit:

Content-Type: text/plain;
charset=WINDOWS-1250;

ilyenkor már tudom hogy mire keressek rá.

Mellesleg 1. pont: php manuál mail-nél ott van amit keresel, de lenn a kommentek között. Sokszor érdemes ott kutakodni, sok szokásos problémára találsz megoldást. Szerintem teljesen rendben van hogy ez ott szerepel csak - nem a PHP dokumentálók feladata hogy mellékeljék a teljes MIME, SMTP, HTTP, HTML stb. szabványokat.
6

A dokumentáció nem oldja meg a problémádat,

s_volenszki · 2008. Jan. 1. (K), 16.03
csak elhint néhány fontos információt, úgy, ahogyan azt "drifter" le is írta.

Elemezzed a folyamatot, vizsgáld a különbséget jó és rossz kimenet, valamint jó és rossz kimenetet produkáló eljárások között!

Az ilyen helyzeteket nem csak és kizárólag informatikai és programozói tudással lehet megközelíteni! Én is gyártástechnológiából tanultam! ;)

Ha visszariaszt a google több ezer találata akkor próbáld meg a weblabor keresőjében a php+levélküldés keresőszavakat! Az első találat lesz a megoldás!
Php levelezés.

s_volenszki

ps.:
Köszönöm a jókívánságokat, Én mindent megteszek, hogy ez az évem legalább olyan jó legyen mint az előző! Sőt, még jobb!
7

emailek feépítése

Hodicska Gergely · 2008. Jan. 1. (K), 17.42
http://weblabor.hu/cikkek/emailekfelepiteselepesrollepesre


Üdv,
Felhő
8

Vess erre egy pillantást, ékezetek tekintetében

vbence · 2008. Jan. 1. (K), 18.29
http://weblabor.hu/forumok/temak/19697
9

kérdés

engineer · 2011. Május. 23. (H), 00.09
Sziasztok.

Nekem is a mail-lel volna gondom, méghozzá a következő.
A neten összeszedett infókból az alábbi php kódot sikerült összehoznom:

$cim = $_POST['eml'];
$targy = "XXX regisztráció aktiválás";
$szoveg = "
Kedves " . $_POST['nev'] . "!
A regisztrációd megerősítéséhez kattints az alábbi linkre, vagy másold be azt a böngésződ címsorába!
http://www.XXX.hu/azonositas.php?azonosito=" . $azonosito . "
Amenniyben 48 órán belül nem erősíted meg a regisztrációdat, adataid törlésre kerülnek az adatbázisból.
...";
$vonal = "\r\n";
$mailkitol = "XXX register";
$mailhonnan = "noreply##kukac##XXX.hu";
$targy = "=?UTF-8?B?" . base64_encode($targy) . "?=";
$mailkitol = "=?UTF-8?B?" . base64_encode($mailkitol) . "?=";
$fejlec = "";
$fejlec .= "MIME-Version: 1.0" . $vonal;
$fejlec .= "Content-type: text/plain; charset=UTF-8 " . $vonal;
$fejlec .= "From: " . $mailkitol . "<" . $mailhonnan . ">" . $vonal . $vonal;
if (mail($cim, $targy, $szoveg, $fejlec))
{  print("Elküldve"); }
else
{ print("<p>Az e-mail küldése sikertelen.</p>"); }

A fenti megoldással majdnem mindenhol szépen megy át az összes ékezetes karakter, a tárgyban és az üzenetben is, azonban a Mozilla Thunderbird a következőt produkálja:

Tárgy jó,
Feladó: -
Üzenet:
Content-type: text/plain; charset=UTF-8

From: =?UTF-8?B?SEkgcmVnaXN0ZXI=?=<noreply##kukac##XXX.hu>

Message-Id: <20110522213230.782235801E##kukac##mail.XXX.hu>
Date: Sun, 22 May 2011 23:32:30 +0200 (CEST)

Kedves Engineer!
A regisztråciód meger�sítÊsÊhez kattints az alåbbi linkre, vagy måsold be azt a bÜngÊsz�d címsoråba!
http://www.XXX.hu/azonositas.php?azonosito=1253708698
Amenniyben 48 órån belßl nem er�síted meg a regisztråciódat, adataid tÜrlÊsre kerßlnek az adatbåzisból.
...


Kérdésem, hogy mi a probléma, illetve hogy mit keres a fejléc az üzenet törzsében?
10

Mail küldő osztály

Poetro · 2011. Május. 23. (H), 00.14
Tényleg jobban jársz, ha használsz egy már kész email küldő osztályt, mint amilyen a PHPMailer vagy a SwiftMailer. Valószínűleg több újsor karakter került be a dokumentumba egyébként, mint amennyit szerettél volna. Érdemes lenne megnézni a levél forrását.
11

forrás

engineer · 2011. Május. 23. (H), 08.14
From - Sun May 22 23:18:20 2011
X-Account-Key: account1
X-UIDL: UID766-1282199870
X-Mozilla-Status: 0001
X-Mozilla-Status2: 00000000
X-Mozilla-Keys:                                                                                
Return-Path: <XXX##kukac##XXX.hu>
X-Original-To: engineer##kukac##XXX.hu
Delivered-To: YYY##kukac##XXX.hu
Received: by mail.XXX.hu (Postfix, from userid 10104)
id 782235801E; Sun, 22 May 2011 23:32:30 +0200 (CEST)
To: engineer##kukac##XXX.hu
Subject: =?UTF-8?B?SEkgcmVnaXN6dHLDoWNpw7MgYWt0aXbDoWzDoXM=?=
MIME-Version: 1.0

Content-type: text/plain; charset=UTF-8

From: =?UTF-8?B?SEkgcmVnaXN0ZXI=?=<noreply##kukac##XXX.hu>

Message-Id: <20110522213230.782235801E##kukac##mail.XXX.hu>
Date: Sun, 22 May 2011 23:32:30 +0200 (CEST)






Kedves Engineer!
A regisztråciód meger�sítÊsÊhez kattints az alåbbi linkre, vagy måsold be azt a bÜngÊsz�d címsoråba!
http://www.XXX.hu/azonositas.php?azonosito=1253708698
Amenniyben 48 órån belßl nem er�síted meg a regisztråciódat, adataid tÜrlÊsre kerßlnek az adatbåzisból.
...
12

Üres sor

Poetro · 2011. Május. 23. (H), 09.41
Nem kellene hogy legyen egyetlen üres sor sem a Return-Path és az üzenet törzse között lennie. Ez okozhatja a problémát.
13

vagyis...

engineer · 2011. Május. 23. (H), 13.21
... mit kellene tennem?
14

A $vonal változót szedd ki a

bb0072 · 2011. Május. 23. (H), 13.45
A $vonal változót szedd ki a fejlécből például
15

ezzel nem oldódik meg

engineer · 2011. Május. 23. (H), 14.06
Azt gondolom, hogy azok a \r\n részek nem véletlenül vannak benne, de mivel nem értek hozzá, hát kipróbáltam. Kivettem őket egyesével, és megnéztem mi történik.
Szépen eltűntek a fejléc sorai az üzenetem törzséből, viszont mivel megszűnt közöttük a sortörés, nem is funkcionáltak többé.
Az ékezetes karakterek továbbra sem jöttek rendbe.
Egyéb ötlet?
16

2 $vonal

plip · 2011. Május. 23. (H), 14.13
$fejlec .= "From: " . $mailkitol . "<" . $mailhonnan . ">" . $vonal . $vonal;
Miért van a végén két $vonal? Az okozza az üres sort...
17

ha csak egy $vonal van ...

engineer · 2011. Május. 23. (H), 14.47
... akkor kisebb a hely a fejléc és a törzs között, de a probléma ugyanaz.
19

Márpedig valahol van egy

plip · 2011. Május. 25. (Sze), 01.48
Márpedig valahol van egy felesleges sortörés. A header sorait egy db sortöréssel kell elválasztani, a header végét pedig 2 db sortörés jelzi. A header közepére becsúszó felesleges sortörés miatt a header második felét szövegnek értelmezi a levelező rendszer.
Mondjuk ha kiíratnád a $fejlec változót viszonylag egyszerűen ki lehetne debugolni. Látszik, hogy az egyes sorok között is dupla sorközök vannak.
De ha megoldottad phpmailerrel, akkor ne foglalkozz vele.
20

lehet hogy ...

engineer · 2011. Május. 25. (Sze), 16.50
Most már kipróbálni nem akarom, csak a tanulság kedvéért felvetem, lehet hogy a fejléc egyes sorait sima \n kéne hogy elválassza, és csak a végére kell \r\n ?
Sok helyen olvastam, hogy annak ellenére, hogy a \r\n a szabvány, simán \n -el jobban működik a mail().
18

PHPmailer

engineer · 2011. Május. 23. (H), 22.04
Megoldottam PHPmailerrel.
Igazatok volt, ezzel csak feleannyit szívtam, és most már minden szépen működik.