Bug v Nette\Web\Mail

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Patrik Votoček
Člen | 2221
+
0
-

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
+
0
-

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
+
0
-

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 | 7769
+
0
-

Díky za report, rutinu pro quoted-printable kódování jsem přepsal a měla by být ok.

Patrik Votoček
Člen | 2221
+
0
-

Supa už to funguje tak jak má… Jdu testovat dále.

Ondřej Brejla
Člen | 746
+
0
-

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

romansklenar
Člen | 655
+
0
-

Jen pro jistotu: je ten soubor s definicí mailu uložený v UTF-8?

Ondřej Brejla
Člen | 746
+
0
-

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
+
0
-

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 | 7769
+
0
-

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
+
0
-

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?

kravčo
Člen | 721
+
0
-

Warden napsal(a):

Nemůže být někde chyba v kódování těla mailu Nette\Mailem?

Je to tak. Pred chvíľou som poslal report, zatiaľ by malo pomôcť, ak v Mail::build() zmeníš obe kódovania na quoted-printable.

Ondřej Brejla
Člen | 746
+
0
-

Je někde ten tvůj velký report k nahlédnutí? Na fóru ho nikde nevidím.

David Grudl
Nette Core | 7769
+
0
-

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
+
0
-

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!

kravčo
Člen | 721
+
0
-

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 . ' ' za self::EOL . "\t".

ondrique
Člen | 16
+
0
-

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 . ' ' za self::EOL . "\t".

Funguje, děkuji!

David Grudl
Nette Core | 7769
+
0
-

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 . ' ' za self::EOL . "\t".

Naprosto nechápu, jak jsi na tohle přišel :-O

kravčo
Člen | 721
+
0
-

Bola to prvá možná chyba, ktorá mi napadla – že foldovanie s medzerou proste niektoré servery/programy nemajú radi (napriek tomu, že je v špecifikácii)… Navyše podľa dobrého bugreportu bolo vidieť, že tabulátory prejdú bez problémov, stačilo vyskúšať…

Honza Marek
Člen | 1664
+
0
-

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
+
0
-

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 Subjectom, 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
+
0
-

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
+
0
-

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 . ' ' za self::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
+
0
-

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
+
0
-

Moment… ten test jsem asi já mamlas dělal s blbou verzí nette. Provedu opakované měření.

Honza Marek
Člen | 1664
+
0
-

Takže PASS. Omlouvám se.

kravčo
Člen | 721
+
0
-

Honza M. napsal(a):

Takže PASS. Omlouvám se.

Ja som z tohoto pochopil, že všetko už funguje ako má…

crempa
Člen | 198
+
0
-

malej bug… automaticke nastaveni predmetu z <title> tagu HTML mailu nefunguje pokud je nekde (obvykle tesne pred koncem tagu) odradkovani. Pokud to clovek pise rucne tak tam novej radek neda, ale rad se tam vlozi pri skladani vysledku z vice sablon pres bloky…

kravčo
Člen | 721
+
0
-

fixed