Re: lug-bg: mail > forum
- Subject: Re: lug-bg: mail > forum
- From: Peter Pentchev <roam@xxxxxxxxxxx>
- Date: Fri, 25 Jun 2004 16:40:51 +0300
On Fri, Jun 25, 2004 at 03:45:18PM +0300, Ivajlo Josifov wrote:
> Здравейте група,
>
> Пиша Ви за 1ви път.
> Понеже останах с впечатлението, че всички се познавате ще кажа 2 думи за себе си...
> казвам се Ивайло Йосифов; фен съм на линукс; занимавам професионално
> от около година; администрирам няколко сървъра; чета ви от известно
> време и аплодирам идеята.
>
> Правя сайт на малка фирмичка, в който има и форум. Хората пожелаха да
> направя възможно с изпращането на имейл към forum@xxxxxxxx
> съдържанието на имейла да попада във форума. Реализирах го, но почти.
> Ще обесня за да бъда по-ясен a и за тези, на които им е интересно:
> 1. пристига имейл до forum@xxxxxxxx
> 2. задейства се .qmail скрипт стоящ в
> /home/vpopmail/domains/sait/forum/.qmail със следното съдържание:
> |preline /scripts/m2forum.sh ## bash скрипт, който взема тялото,
> субджекта, подателя и датата на имейла и прави запис в mysql база в
> съответните полета.
>
> Ето и проблема:
> Когато изпращам писма до спомантия акаунт на латиница всичко е
> тип-топ, но когато изпратя на кирилица се появяват маймунки. Знам че
> става въпрос за декодване, което btw. не ми е много ясно... Реших че
> мога да погледна все пак при Squirrel mail как е реализирано, но се
> оплетох в PHP скриптове, които не разгадах и в крайна сметка си
> загубих времето...
>
> Има ли някакъв хитър начин да декодвам през bash скрипт, perl или php?
> Някаква команда, функция или нещо вече написано....
Всъщност основното, което трябва да направиш, е да намериш малко
информация за MIME - Multipurpose Internet Mail Extensions. Едно от
хубавите места за четене са самите RFC-та, от 2045 до 2049:
http://www.faqs.org/rfcs/rfc2045.html
http://www.faqs.org/rfcs/rfc2046.html
http://www.faqs.org/rfcs/rfc2047.html
http://www.faqs.org/rfcs/rfc2048.html
http://www.faqs.org/rfcs/rfc2049.html
Но всъщност има и доста други места, на които можеш да попрочетеш за
това какво е MIME и как се обработват такива съобщения.
През shell script едва ли ще стане. За Perl имаш купчина модули, които
се занимават с това: мога да ти препоръчам MIME::Tools, които инсталират
куп модули като MIME::Parser, MIME::Entity, MIME::Body и още два-три,
които едва ли ще ти трябват. MIME::Parser се справя достатъчно добре с
разбиване на multipart съобщение на съставните му части и след това
представяне на тези части така, че да можеш да ги използваш... с пълна
информация за encodings :) Има и други варианти, примерно Simon Cozens
има интересни модулчета Email::Simple, Email::Attachment и т.н., само че
още не съм си играл достатъчно с тях и не мога да дам мнение.
Иначе, след като си извадил самото съобщение от съответната MIME част, и
след като си разбрал в какъв точно encoding е това съобщение, трябва да
го обърнеш в енкодинга, който ще показваш във форума. Това може да
стане с модулите от групата Encode или, ако ползваш достатъчно нова
версия на Perl, с модулчето utf8 (ако, разбира се, решиш да представяш
нещата във форума в UTF-8).
> Още нещо... Koe e тялото на имейла? Tова което стои между
Ами.. никое от изброените :) Тялото на самото e-mail съобщение е
всичко, което е след хедъра (заглавката?). Самият хедър свършва с
празен ред - т.е. всичко след първия празен ред е тяло на e-mail
съобщението.
Следващата стъпка е обработката на MIME multipart съобщения: тялото е
едно, дефинирано от RFC 821/822, но в това тяло може да има повече от
една част, MIME същност (entity). Типичен пример е мейл с един-два
прикачени файла, или такъв, който е и в текстов вид, и в HTML, или пък
такъв като този, който четеш в момента - с прикачен PGP подпис. Тогава
в хедъра на мейла трябва да има Content-type: multipart/нещо-си (да, и
тук има различни варианти, но в момента не те интересуват), а самото
тяло на мейла да се състои от MIME parts като тези, които си показал.
> ------=_NextPart_000_000D_01C45AC4.351EFE50
> Content-Type: text/plain;
> charset="koi8-r"
> Content-Transfer-Encoding: base64
Това е заглавката на първата част (MIME part) от съобщението; всичко
между тези редове и следващата ------=_NextPart със същия код е текстова
част от съобщението.
> и това:
>
> ------=_NextPart_000_000D_01C45AC4.351EFE50
> Content-Type: text/html;
> charset="koi8-r"
> Content-Transfer-Encoding: quoted-printable
Това е просто следваща част от съобщението :) И двете са части от
тялото. В такива случаи - когато имаш и текстова, и HTML част - трябва
да решиш коя ще показваш във форума. Аз бих предложил показване на
текстовата част (ще имаш много по-малко проблеми с нормализиране и
"изчистване" на HTML), и остава само да се надяваш да не попаднеш на
някой хитрец, който да ти изпрати съобщение, при което текстът е в HTML
частта, но отпред има текстова част от типа на "Твоят мейлър е прекалено
тъп и не разбира от MIME съобщения; вземи си по-добър мейлър." Абе
идиотиииииии, ако моят мейлър не разбираше от MIME съобщения, щях ли
изобщо да чета това? :))) Това, което искате да кажете, е, че моят MUA
не разбира от *HTML* съобщения, което дори не е вярно - той прекрасно си
разбира, само че съм му обяснил, че не искам да ми ги показва :)))
> или това което е затворено в
> <body></body>
> таговете по-надолу.
Ъххх.. Ако имаш HTML част, не можеш да третираш нейното тяло (това,
което е в <body> тага) като нещо различно и съвсем отделно от нейната
заглавка, най-малкото защото в заглавката ще има много, ама много важна
информация за.. таковата.. ами за енкодинга, в който е представено
тялото :) Тук вече - ако решиш да показваш HTML частта - ще ти трябва и
нещо, което да parse-ва HTML, да вади от него истинския текст, и да..
абе.. мрън.. ще ти трябва нещо от класа на браузър.. според мен по-добре
обработвай текстовата част, а за съобщения, които имат само HTML част,
ползвай нещо като 'lynx -dump' (мда, съвсем сериозно).
> Посъветвайте ме как да продължа.
>
> Ако има някакво значение сървъра е qmail.
>
> Извинявам се за дългото писмо. Опитах се да бъда максимално ясен.
Въх.. то моето излезе едно такова, малко по-дългичко май... Надявам се
поне малко да проясни нещата :)
Поздрави,
Петър
--
Peter Pentchev roam@xxxxxxxxxxx roam@xxxxxxxx roam@xxxxxxxxxxx
PGP key: http://people.FreeBSD.org/~roam/roam.key.asc
Key fingerprint FDBA FD79 C26F 3C51 C95E DF9E ED18 B68D 1619 4553
This sentence would be seven words long if it were six words shorter.
Attachment:
pgpYD5gNrOxxF.pgp
Description: PGP signature
|