teisipäev, 6. oktoober 2015

Probleemid QQ webmailiga

QQMail on üks suurimaid Hiina e-maili pakkujaid. Ei julge täpset kasutajanumbrit pakkuda, aga mõnisada miljonit kasutajat võiks sellel ikka olla (kokku on QQ kasutajaid miljardi ringis, aga kõik ei ole neist e-maili kasutajad, QQ toodete portfell on päris suur). Igatahes on see üks maailma suurtest Gmaili, Hotmaili ja Yahoo kõrval ja seega tuleb e-maili tarkvara luues ka QQ'ga arvestada.

Huvitaval kombel ongi QQ webmailil üks spetsiifiline probleem ja seda nimelt manuste unikood failinimedega. Aarvestades et Hiinas on unikood au sees ja ASCII mitte, siis on see tõesti imelik.

Kui standardi järgi asub failinimi Content-Disposition päisekirje filename argumendina, siis paljud e-posti rakendused (etteruttavalt, ka QQ webmail) kasutavad mittestandardset name argumenti Content-Type päises. Mitte-ASCII sümbolite kasutamiseks failinimes tuleb see kodeerida ja korrektseks kodeeringuks on RFC2231 Parameter Value Continuation, mis võimaldab jaotada pikemaid failinimesid väiksemateks osadeks (et mitte rikkuda rea pikkuse piirangut) ning nendes olevad mitte-ASCII sümbolid kodeerida urlencoding-laadses kodeeringus.

Failinime "😁😂.jpg" kodeerimine käiks sellisel juhul nii:
Content-Disposition: attachment;
    filename*0*=utf-8''%F0%9F%98%81%F0%9F%98%82.jpg

RFC2047 kirjeldab veidi vanema kodeeringu mehhanismi, encoded-word kodeeringu mis võimaldab koderida päiseridade väärtusi.

Kirja pealkiri "Spämm 😁😂" võiks välja näha nii:
Subject: =?UTF-8?Q?Sp=C3=A4mm_=F0=9F=98=80?=

Encoded-word nagu ka continuation on atom tüüpi väärtused, mis tähendab, et neid ei saa, vähemalt standardi järgi, kasutada päisekirjete argumentide puhul jutumärkide vahel. Mittestandardselt saab muidugi küll ja seda QQ teebki.

Ühesõnaga, selle asemel et kasutada korrektset continuation kodeeringut, kasutab QQ failinimede puhul encoded-word väärtusi jutumärkide vahel. Veel huvitavam, lisaks sellele, et QQ ei genereeri väljuvaid kirju standardi järgi, ei oska QQ ka sissetulevaid kirju õigesi käsitleda.

Näiteks kui manuse päises on failinimi defineeritud vastavalt standardile:
Content-Disposition: attachment;
    filename*0*=utf-8''%F0%9F%98%81%F0%9F%98%82.jpg

Siis QQ webmailis seda kirja vaadates, kuvatakse manuse linki nii:


Seega tuleb kirjadele lisada failinimi kaks korda. Ühe korra standardi järgi filename argumendina ja ühe korra mittestandardse name argumendina:
Content-Disposition: attachment;
    filename*0*=utf-8''%F0%9F%98%81%F0%9F%98%82.jpg
Content-Type: image/jpeg;
    name="=?UTF-8?Q?=F0=9F=98=81=F0=9F=98=82=2Ejpg?="

Ja nüüd saab ka QQ kõigest aru:

Kommentaare ei ole: