Bug v Nette\Web\Mail
- Patrik Votoček
- Člen | 2221
Pokud předám pomocí Mail::setHtmlBody()
řetězec který
končí novím řádkem tak se zaciklí while na řídku 235 v MailMimePart do
nekonečna.
Editoval vrtak-cz (26. 5. 2009 8:38)
- Patrik Votoček
- Člen | 2221
Narazil jsem na další chybyčku místo toho aby HTML mail dorazil v pohodě dorazí:
=A=A=A=meta http-equiv="Content-Type" content="text/html; charset=utf-8" />=A=meta http-equiv="Content-Language" content="en" />=A=A=meta name="description" content="Nette Framework web application skeleton" />=A=D=D=9=A=A= =body>=A=h1>It works!
=A=p>Hello World
=A
=A
Pokud ale v metodě Mail::injectHtml()
změním kódování
z ENCODING_QUOTED_PRINTABLE na ENCODING_BASE64 tak dorazí v pořádku. Čím
to může být?
- kravčo
- Člen | 721
vrtak-cz napsal(a):
… Čím to může být?
Je to chybičkou v implementácii quoted-printable kódovania:
Nette\Web\MailMimePart.php@r326:232
$s = preg_replace('#[=\x00-\x1F\x7F-\xFF]#e', '"=" . strtoupper(dechex(ord("\0")))', $this->body);
nahradzovací kód treba upraviť tak, aby vždy doplnil 2 hexa číslice, napríklad:
'sprintf("=%02X", ord("$0"))'
alebo
'(ord("$0") & 0xf0 ? "=" : "=0") . strtoupper(dechex(ord("$0"))'
Edit: ten istý problém má i metóda encodeHeader()
Editoval kravco (26. 5. 2009 13:17)
- David Grudl
- Nette Core | 8229
Díky za report, rutinu pro quoted-printable kódování jsem přepsal a měla by být ok.
- Ondřej Brejla
- Člen | 746
Nevím co dělám špatně…předem říkám, že v kódování mailů a v mailování obecně se moc nevyznám, tak se budu snažit popsat problém co nejlépe…možná to je jen nějaká prkotina, uvidíme, já už jsem zoufalej :-)
Takže takhle…pomocí následujícího kódu zkouším odeslat mail:
$mail = new Mail();
$mail->addTo('test@mail.tld', 'xxx');
$mail->setFrom('muj@mail.tld', 'Ondřej Brejla');
$mail->setSubject('Předmět');
$mail->setBody('test - ěščřžýáíé');
$mail->send();
Emil dorazí, ale – místo odesílatele mám
=?UTF-8?Q?Ond=C5=99ej=20Brejla=20
…hlavičky
vypadají takto:
To: "xxx" <test@mail.tld>
Subject: =?UTF-8?Q?P=C5=99edm=C4=9Bt?=
MIME-Version: 1.0
X-Mailer: Nette Framework
Content-Transfer-Encoding: 7bit
From: "=?UTF-8?Q?Ond=C5=99ej=20Brejla=20" <muj@mail.tld>
Message-ID: <4c531d60017ebf5238aab85d03129df3@admin>
Content-Type: text/plain; charset=UTF-8
…dobře tedy…když nejde quoted printable, zkusíme base64…zkusil jsem tedy toto:
$mail = new Mail();
$mail->setEncoding(Mail::ENCODING_BASE64);
$mail->addTo('test@mail.tld', 'xxx');
$mail->setFrom('muj@mail.tld', 'Ondřej Brejla');
$mail->setSubject('Předmět');
$mail->setBody('test - ěščřžýáíé');
$mail->send();
Email opět dorazí, ale – místo odesílate je opět
=?UTF-8?Q?Ond=C5=99ej=20Brejla=20
(imho u base64 by v tom stringu
místo Q mělo být B…?) a hlavičky vypadají takto:
To: "xxx" <test@mail.tld>
Subject: =?UTF-8?Q?P=C5=99edm=C4=9Bt?=
MIME-Version: 1.0
X-Mailer: Nette Framework
Content-Transfer-Encoding: 7bit
From: "=?UTF-8?Q?Ond=C5=99ej=20Brejla=20" <muj@mail.tld>
Message-ID: <3e0134c8c8e1793947cb33d0d010582e@admin>
Content-Type: text/plain; charset=UTF-8
tzn. úplně stejné jako když jsem kódování nenastavoval…imho by teď
mělo být Content-Transfer-Encoding: base64
?
To překódování odesílatele nefunguje ani v Thunderbirdu, ani ve SquirrelMailu ani v IlohaMailu…
Dělám něco špatně? Nebo je něco špatně v Nette\Mail případně jinde?
Díky moc…
Revize Nette – 332
PHP Version 5.2.6–3ubuntu4.1
Apache 2
- Ondřej Brejla
- Člen | 746
měl by být, je to netbeans projekt nastaveny na utf8..zobrazení šablon v utf je ok, tělo mailu při změně kódování v tb taky ok
- kravčo
- Člen | 721
Warden napsal(a):
Emil dorazí, ale – místo odesílatele mám
=?UTF-8?Q?Ond=C5=99ej=20Brejla=20
…hlavičky vypadají takto:From: "=?UTF-8?Q?Ond=C5=99ej=20Brejla=20" <muj@mail.tld>
To čo príde je trochu upravená podoba toho, čo sa naozaj odoslalo – chyba je pri kódovaní odosielateľa. V skutočnosti sa posiela:
From: =?UTF-8?Q?Ond=C5=99ej=20Brejla=20<muj@mail.tld>?=
To nie je podľa normy a niekde na ceste sa to upravilo do podoby, ktorá vyhovuje norme… no nefunguje tak, ako by sme chceli… Správne by sa malo odosielať:
From: =?UTF-8?Q?Ond=C5=99ej=20Brejla?= <muj@mail.tld>
…dobře tedy…když nejde quoted printable, zkusíme base64…zkusil jsem tedy toto:
…
Email opět dorazí, ale – místo odesílate je opět
=?UTF-8?Q?Ond=C5=99ej=20Brejla=20
(imho u base64 by v tom stringu místo Q mělo být B…?)
$mail->setEncoding()
by malo nastaviť kódovanie mailu, nie
kódovanie hlavičiek, tam je quoted-printable reasonable
default a nemá veľmi zmysel ho meniť.
tzn. úplně stejné jako když jsem kódování nenastavoval…imho by teď mělo být
Content-Transfer-Encoding: base64
?
Áno, zatiaľ $mail->setEncoding()
nemá žiaden vplyv (ako
si zaregistroval, v oboch prípadoch zostáva „7bit“).
Dělám něco špatně? Nebo je něco špatně v Nette\Mail případně jinde?
Zrejme nie, Nette\Mail je nový a má zopár múch. Pracujem na väčšom bugreporte, pred víkendom by mohol byť hotový.
Tento typ problému sa týka špecificky hlavičiek, ktoré obsahujú adresu + meno odosielateľa/prijímateľa s diakritikou. Zatiaľ skús posielať maily ako „Ondrej Brejla“ :)
- David Grudl
- Nette Core | 8229
Pokusil jsem se to opravit, snad to bude OK.
kravco napsal(a):
Pracujem na väčšom bugreporte, pred víkendom by mohol byť hotový.
To by bylo super.
- Ondřej Brejla
- Člen | 746
Tak kódování odesílatele už funguje správně :-)
Jen mi to dělá ještě jednu neplechu, když je ve zprávě nějaká diakritika (klasicky „test – ěščřžýáíé“), tak Courier ten mail označí jako corrupted…nevím, jestli je to špatným nastavením Courieru, každopádně chyba je takováto:
CORRUPTED MESSAGE
This is the Courier Mail Server 0.60 on warden-laptop.
I received the following message for delivery to your address. This message contains several internal formatting errors. This is often caused by viruses that attempt to infect remote systems. Instead of blocking this message, I converted it to a safe, text-only attachment that can be safely read with a text editor.
This sometimes also happens when the sender's mail software has a bug that creates improperly-formatted messages. Although these kinds of formatting errors may often be ignored by other mail servers, this server detects and intercepts improperly-coded messages in order to prevent viruses from taking advantage of bugs in E-mail programs:
-----------------------------------------------------------------------------
This message contains improperly-formatted binary content, or attachment.
See <URL:ftp://ftp.isi.edu/in-notes/rfc2045.txt> for more information.
-----------------------------------------------------------------------------
Nemůže být někde chyba v kódování těla mailu Nette\Mailem?
- David Grudl
- Nette Core | 8229
Moc děkuji Kravčovi za perfektní bugreport a patch, který mi poslal emailem!
Pokusil jsem se vše kolem kódování opravit, takže teď by to snad už mělo fungovat spolehlivě.
Poprosil bych vás tedy o důkladné otestování. Díky.
- ondrique
- Člen | 16
při použití současné stable verze 0.9 mám problém s kódováním HTML e-mailu. Většině adresátů e-mail přijde v pohodě, nicméně klientovi stále všechny e-maily chodí rozsekané. Nejsem s ním v přímém kontaktu, takže vím jen, že používá outlook, poštovní server neznámý.
hlavička vypadá následovně:
Return-Path: <anonymous@duffman.onebit.cz>
X-Envelope-To: xxx@regroup.cz
Date: Mon, 31 Aug 2009 13:21:16 +0200
X-Spam-Status: No, hits=0.0 required=4.4
tests=BAYES_00: -1.665,MISSING_DATE: 0.001,MISSING_MID: 0.001,
RDNS_NONE: 0,TOTAL_SCORE: -1.663,autolearn=ham
X-Spam-Level:
Received: from duffman.onebit.cz ([89.185.231.32])
by mail.regroup.cz
for xxx@regroup.cz;
Mon, 31 Aug 2009 13:21:12 +0200
Received: (qmail 27775 invoked by uid 48); 31 Aug 2009 11:20:42 -0000
To: xxx@regroup.cz
Subject: =?UTF-8?Q?Va=C5=A1e=20registrace=20na=20poji=C5=A1t=C4=9Bn?=
a pokračuje body:
=?UTF-8?Q?=C3=AD=20pro=20cizince?=
MIME-Version: 1.0
X-Mailer: Nette Framework
Date: Mon, 31 Aug 2009 13:20:42 +0200
From: =?UTF-8?Q?Luk=C3=A1=C5=A1=20Sudacki?= <xxx@xxx.cz>
Message-ID: <817e57661a7685e7672a67be39fa6624@webalizator.cz>
Content-Type: multipart/alternative;
boundary="--------9bd196eafeac51314833fea1b936f51f"
----------9bd196eafeac51314833fea1b936f51f
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
DobrĂ˝ den,
VaĹĄe registrace na portĂĄle pojiĹĄtÄ nĂ pro cizince probÄ hla ĂşspÄ ĹĄnÄ a nynĂ je
nutnĂŠ ji aktivovat.
Problém by mohl být v předmětu, protože na něm se to sekne a jeho část už přejde do těla zprávy. Správně by měl být „Vaše registrace na pojištění pro cizince“.
Díky!
- David Grudl
- Nette Core | 8229
kravčo napsal(a):
Mohol by si, prosím ťa, skúsiť, či to bude fungovať s touto úpravou?
V súbore Nette/Mail/MailMimePart.php nahraď všetky (tri) výskyty
self::EOL . ' '
zaself::EOL . "\t"
.
Naprosto nechápu, jak jsi na tohle přišel :-O
- Honza Marek
- Člen | 1664
U mě přetrvává dosti podobný problém jako měl ondrique. Hosting a i stroj budeme mít podle hlaviček tipuju stejný.
Zdroj zprávy u mě vypadá takto:
X-Message-Delivery: Vj0xLjE7dXM9MDtsPTA7YT0wO0Q9MjtTQ0w9NA==
X-Message-Status: n:0
X-SID-PRA: Honza Marek <mail@janmarek.net>
X-Message-Info: 6sSXyD95QpV1M8r6afzx//YulEDj0TKlHzfjZf9mHiaVqc91vfguNHBeaOA4tPHeOlQaO0PSDQpDllOYBlKYHtFlrayY663d
Received: from duffman.onebit.cz ([89.185.231.32]) by bay0-pamc1-f4.bay0.hotmail.com with Microsoft SMTPSVC(6.0.3790.2444);
Mon, 14 Sep 2009 07:01:20 -0700
Received: (qmail 23072 invoked by uid 48); 14 Sep 2009 14:01:18 -0000
To: mail@janmarek.net
Subject: =?UTF-8?Q?P=C5=99=C3=ADtelkyn=C4=9B=20Honza=20Marek=20V?= =?UTF-8?Q?=C3=A1m=20doporu=C4=8Duje=20web=20www.dianthe.cz?=
MIME-Version: 1.0
X-Mailer: Nette Framework
Date: Mon, 14 Sep 2009 16:01:18 +0200
Content-Transfer-Encoding: 8bit
From: Honza Marek <mail@janmarek.net>
Message-ID: <b849a53826a661b7c1541583fe0192dd@venesis.janmarek.net>
Content-Type: text/plain; charset=UTF-8
Return-Path: anonymous@duffman.onebit.cz
X-OriginalArrivalTime: 14 Sep 2009 14:01:21.0147 (UTC) FILETIME=[D682FCB0:01CA3543]
DobrĂ˝ den,
vaše pĹ™ĂtelkynÄ› Honza Marek Vám doporuÄŤuje web http://www.dianthe.cz/.
Na ÄianthÄ“ najdete vĹľdy nejvÄ›tšà vĂ˝bÄ›r nejvÄ›tšà vĂ˝bÄ›r spoleÄŤenskĂ˝ch, plesovĂ˝ch, koktejlovĂ˝ch šatĹŻ a kostĂ˝mkĹŻ.
Mailový klient (Windows Live Mail a Outlook) se tváří, že tělo začíná tímto: =?UTF-8?Q?=C3=A1=20V=C3=A1m=20doporu… V tom live mailu je navíc rozhozená diakritika.
Edit 1:
Hodnotou předmětu by mělo být správně toto:
"Přítelkyně " . $values["name"] . " Vám doporučuje web www.dianthe.cz"
Edit 2:
Pokud udělám ten předmět kratší, tak mail dojde v pořádku. Nette jsem zkoušel poslední build.
Editoval Honza M. (14. 9. 2009 16:23)
- kravčo
- Člen | 721
Honza M. napsal(a):
U mě přetrvává dosti podobný problém jako měl ondrique. Hosting a i stroj budeme mít podle hlaviček tipuju stejný.
Problém vyzerá byť rovnaký, len riešenie asi nebude :)
Mailový klient (Windows Live Mail a Outlook) se tváří, že tělo začíná tímto: =?UTF-8?Q?=C3=A1=20V=C3=A1m=20doporu…
Pri pohľade do dumpnutého mailu by text mal začínať
=?UTF-8?Q?=C3=A1m=20doporu=C4=8Duje ≡ „ám doporučuje“
ty si napísal
=?UTF-8?Q?=C3=A1=20V=C3=A1m=20doporu=C4=8Duje ≡ „á Vám doporučuje“
to by bolo dosť zvláštne, môžeš overiť, že telo mailu začína presne na druhom kódovanom slove?
V tom live mailu je navíc rozhozená diakritika.
Keďže podľa Outlooku začalo telo mailu v riadku so
Subject
om, neberie do
úvahy Content-Type: ...; charset=...
Dôležité je, že dvojica kódových slov v predmete má byť v tomto
prípade oddelená sekvenciou "\r\n\t"
, v dumpe to tak nevyzerá
(" \t"
), over prosím ťa aj toto.
$part = new MailMimePart;
$values = array('name' => 'Honza Marek');
$part->setHeader('Subject', "Přítelkyně " . $values["name"] . " Vám doporučuje web www.dianthe.cz");
$out = $part->getEncodedHeader('Subject');
$ref = "=?UTF-8?Q?P=C5=99=C3=ADtelkyn=C4=9B=20Honza=20Marek=20V?=\r\n\t=?UTF-8?Q?=C3=A1m=20doporu=C4=8Duje=20web=20www.dianthe.cz?=";
echo $out === $ref ? 'PASS' : 'FAIL';
Ak predsa len bude všetko v poriadku, budem potrebovať dump emailu s dlhým predmetom s diakritikou, ktorý Outlook spracuje správne.
- Honza Marek
- Člen | 1664
kravčo napsal(a):
to by bolo dosť zvláštne, môžeš overiť, že telo mailu začína presne na druhom kódovanom slove?
Je to tak, vždycky tělo začíná tím druhým =?UTF-8…
Dôležité je, že dvojica kódových slov v predmete má byť v tomto prípade oddelená sekvenciou
"\r\n\t"
, v dumpe to tak nevyzerá (" \t"
), over prosím ťa aj toto.
Ano. Korektně zobrazené maily mají odřádkování a tabulátor.
$part = new MailMimePart; $values = array('name' => 'Honza Marek'); $part->setHeader('Subject', "Přítelkyně " . $values["name"] . " Vám doporučuje web www.dianthe.cz"); $out = $part->getEncodedHeader('Subject'); $ref = "=?UTF-8?Q?P=C5=99=C3=ADtelkyn=C4=9B=20Honza=20Marek=20V?=\r\n\t=?UTF-8?Q?=C3=A1m=20doporu=C4=8Duje=20web=20www.dianthe.cz?="; echo $out === $ref ? 'PASS' : 'FAIL';
Test neprošel, $out
odpovídá
"=?UTF-8?Q?P=C5=99=C3=ADtelkyn=C4=9B=20Honza=20Marek=20V?=\r\n =?UTF-8?Q?=C3=A1m=20doporu=C4=8Duje=20web=20www.dianthe.cz?="
.
- kravčo
- Člen | 721
kravčo napsal(a):
Problém vyzerá byť rovnaký, len riešenie asi nebude :)
Beriem späť… problém rovnaký, riešenie rovnaké…
V súbore Nette/Mail/MailMimePart.php nahraď všetky (tri) výskyty
self::EOL . ' '
zaself::EOL . "\t"
.
Stavím sa, že tam máš tie medzery :)
Honza M napsal(a):
Nette jsem zkoušel poslední build
V stable 0.9.0 tento bug Outlooku fixnutý nie je, v aktuálnom 0.9-dev z nette.org i github.com áno.
- Honza Marek
- Člen | 1664
Ale já bral dnešní 0.9-dev z nette.org… Ty mezery byly první, co jsem v tom zdrojáku hledal, nemysli si.
Editoval Honza M. (14. 9. 2009 21:24)
- Honza Marek
- Člen | 1664
Moment… ten test jsem asi já mamlas dělal s blbou verzí nette. Provedu opakované měření.