Перекодировка MIME в карантине DSPAM

И всё прочее, что касается HTML
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Аватара пользователя
Lazy caT
мл. сержант
Сообщения: 101
Зарегистрирован: 2008-09-11 9:59:17
Откуда: Местные мы...
Контактная информация:

Перекодировка MIME в карантине DSPAM

Непрочитанное сообщение Lazy caT » 2010-04-07 14:07:46

Салют всем.
Решился тут, недавно таки постараться перевести из MIME в удобоваримый текст "from" и "subj" на странице "карантина" в DSPAM'e.
(Для тех кто не в курсе, кириллические поля там отображаются как "=?windows-1251?B?0SDSIMAgyy..." или "=?koi8-r?B?88vMwcTTy...")

Нарыл на каком-то форуме код который всё это должен перекодировать, и постарался прикрутить его к DSPAM'у.
Поставил MIME::Words внес поправки в dspam.cgi... вроде ОК... но не всё "ОК" а только часть... :(

Код, что добавлял:

Код: Выделить всё

use MIME::Words qw (:all);
use Convert::Cyrillic;
use strict; 

...[skip]...

    my $From=join("", map {xcode(${$_}[1], ${$_}[0])} decode_mimewords($row->{'From'}));
    my $Subj=join("", map {xcode(${$_}[1], ${$_}[0])} decode_mimewords($row->{'Subject'})); 

...[skip]...

# процедура перекодирования из чарсета, используемого в сообщении
# в koi8
sub xcode {
        my ($charset, $src) = @_;
        my %charsets = (
                'windows-1251'=>'WIN',
                'iso8859-5'=>'ISO',
                'koi8-r'=>'KOI8',
                'koi8r'=>'KOI8',
                'koi8-u'=>'KOI8',
                'utf-8'=>'UTF8',
                'utf8'=>'UTF8'
        );
        return $src unless ($charsets{lc($charset)});
        Convert::Cyrillic::cstocs($charsets{lc($charset)}, 'KOI8', $src);
} 
В том коде что нарыл был ещё более простой вариант, перекодировал только KOI... А в "карантине" есть и KOI и WIN и ISO и UTF...
и я решил пойти более сложным путем, с надеждой что этот код будет перекодировать всё в KOI...

Но, каменный цветок не вышел... Перекодируется не всё...

Вопрос на засыпь, знающим perl. В чем может быть косяк?

Да, и, если не сложно, объясните пожалуйста принцип работы вот этого куска "{xcode(${$_}[1], ${$_}[0])}" тут меня больше интересует что вот это такое(${$_}[1] и ${$_}[0])?...
Как я понимаю функции xcode передается $charset и $src, где тогда тут $src? и если $src это decode_mimewords($row->{'Subject'}), почему тогда оно вынесено ЗА скобки?...

Если я пойму чего и как куда передается, может я сам соображу почему он у меня "не всё" перекодирует...

Заранее спасибо... :smile:

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Аватара пользователя
ProFTP
подполковник
Сообщения: 3388
Зарегистрирован: 2008-04-13 1:50:04
Откуда: %&й
Контактная информация:

Re: Перекодировка MIME в карантине DSPAM

Непрочитанное сообщение ProFTP » 2010-04-08 1:53:22

Код: Выделить всё

    my $From=join("", map {xcode(${$_}[1], ${$_}[0])} decode_mimewords($row->{'From'}));
$row->{'From'} - что это такое? надо полнолстью показывать... это просто хеш?

из decode_mimewords выходит массив с несколько элементами, вроде бы

xcode(${$_}[1], ${$_}[0])} дальше эти элементы - это $_

${$_}[1], ${$_}[0]) - 2 элемента передается xcode, как структура по-моиму хеш-массив, зачем так сделано не знаю, надо смотерть

map "выносит" массив

join с массив а стоит строку

xcode принимает 2 элемента, $charset, $src вроде бы это просто строки... можно посмотреть...

===

ну так что не работает...?
(вообще-то код не маленький, надо сомтреть)
Pеrl FAQ
perl -e 'print join"",map $$_[rand@$_],([0..9,'a'..'z','A'..'Z'])x30'
ИзображениеИзображение

Аватара пользователя
Lazy caT
мл. сержант
Сообщения: 101
Зарегистрирован: 2008-09-11 9:59:17
Откуда: Местные мы...
Контактная информация:

Re: Перекодировка MIME в карантине DSPAM

Непрочитанное сообщение Lazy caT » 2010-04-08 13:49:32

ProFTP писал(а): $row->{'From'} - что это такое? надо полнолстью показывать... это просто хеш?
:pardon: я в perl'е полный ноль... так что могу предположить что $row->{'From'} и $row->{'Subject'} это строковые (символьные) элементы массива $row
в котором содержатся данные о выводимой на экран строке...
Содержат они как раз вот это вот "=?windows-1251?B?0SDSIMAgyy..." или "=?koi8-r?B?88vMwcTTy..."
ProFTP писал(а):из decode_mimewords выходит массив с несколько элементами, вроде бы

xcode(${$_}[1], ${$_}[0])} дальше эти элементы - это $_

${$_}[1], ${$_}[0]) - 2 элемента передается xcode, как структура по-моиму хеш-массив, зачем так сделано не знаю, надо смотерть
ProFTP писал(а): map "выносит" массив
Куда "выносит"?...
ProFTP писал(а): join с массив а стоит строку
Ну, это я догадался... :)
ProFTP писал(а): xcode принимает 2 элемента, $charset, $src вроде бы это просто строки... можно посмотреть...

===

ну так что не работает...?
(вообще-то код не маленький, надо сомтреть)
Ну, я бы не сказал что он совсем не работает... Он работает... только не полностью...
После обработки этим скриптом всё равно остаются строки "=?koi8-r?B?88vMwcTTy..." и "=?UTF-8?B?0L/RgNC+0YHRj"
Причем, преимущественно KOI-8R и UTF-8... WIN-1251 нет...

Аватара пользователя
ProFTP
подполковник
Сообщения: 3388
Зарегистрирован: 2008-04-13 1:50:04
Откуда: %&й
Контактная информация:

Re: Перекодировка MIME в карантине DSPAM

Непрочитанное сообщение ProFTP » 2010-04-08 14:47:11

Lazy caT писал(а): Куда "выносит"?...
в

Код: Выделить всё

join("",
через void (join отбрабатывает массив...)


попробуйте принудительно чтобы только для WIN-1251 в качестве теста, написать Convert::Cyrillic::cstocs("WIN", 'KOI8', $src);

нужно пробовать...
Pеrl FAQ
perl -e 'print join"",map $$_[rand@$_],([0..9,'a'..'z','A'..'Z'])x30'
ИзображениеИзображение

Аватара пользователя
Lazy caT
мл. сержант
Сообщения: 101
Зарегистрирован: 2008-09-11 9:59:17
Откуда: Местные мы...
Контактная информация:

Re: Перекодировка MIME в карантине DSPAM

Непрочитанное сообщение Lazy caT » 2010-04-08 16:06:30

ProFTP писал(а): попробуйте принудительно чтобы только для WIN-1251 в качестве теста, написать Convert::Cyrillic::cstocs("WIN", 'KOI8', $src);
нужно пробовать...
Первые 10 строк "карантина"
без перекодировок:

Код: Выделить всё

 	 67%  	Apr 6 10:52a  	gp@sibtyre.ru  	=?utf-8?Q?=D0=9A=D0=BE=D0=BC=D0=B5=D1=80=D1=87=D0=...
	63% 	Apr 6 10:46a 	=?koi8-r?B?89fF1MzBzsEgIO3B0tTJzs/Xyd4=?= 	=?koi8-r?B?88vMwcTTy8nFINDPzcXdxc7J0SDOwSDMwMLPyiD...
	89% 	Apr 6 10:10a 	=?koi8-r?B?4dfEwcvP18Eg98XSwQ==?= <plumpestlni1@rb... 	=?koi8-r?B?8NLFxMzP1sXOydEgxMzRIMTJ0sXL1M/SwS4=?=
	93% 	Apr 6 09:25a 	=?windows-1251?B?zsrOzc3bySDMwNHSxdA=?= <gvor@74.r... 	=?windows-1251?B?0OXs7u3yIO/r4PHy6Oru4vv1IO7q7u0=?...
	68% 	Apr 6 09:14a 	=?koi8-r?B?9MnIz87P18Eg69PFzsnR?= 	=?koi8-r?B?8/T15OXu9Pkg8O/t7+f19CD34e0g9yDs4OLv6iD...
	80% 	Apr 6 08:47a 	=?windows-1251?B?0MDR0dvL3NnIyg==?= <pyponykop@ram... 	=?windows-1251?B?wuD44CDQxcrLwMzAIOzu5uXyIPHy7ujS3...
	58% 	Apr 6 08:29a 	=?koi8-r?Q?=F3=F7=E8_=EB=D2=C1=D3=CE=CF=D1=D2=D3=C... 	=?koi8-r?Q?=EB=F2=E1=F3=EE=EF=F1=F2=F3=EB!!!?=
	96% 	Apr 6 08:18a 	=?windows-1251?B?0dLO?= <doors@mail.ru> 	=?windows-1251?B?0SDSIMAgyyDcIM0g2yDFIMggwMvezMjNy...
	95% 	Apr 6 08:18a 	=?windows-1251?B?0dLO?= <axerypo@rambler.ru> 	=?windows-1251?B?0SDSIMAgyyDcIM0g2yDFIMggwMvezMjNy...
	56% 	Apr 6 07:53a 	=?koi8-r?B?IOvBzMHbzsnLz9fBIOzAwsE=?= <blakekyt@nm... 	=?koi8-r?B?cMFjY9nMy2Egb9QgzMnExXBv1w==?=
С перекодировкой:

Код: Выделить всё

 	 67%  	Apr 6 10:52a  	gp@sibtyre.ru  	=?utf-8?Q?=D0=9A=D0=BE=D0=BC=D0=B5=D1=80=D1=87=D0=...
	63% 	Apr 6 10:46a 	Светлана Мартинович 	=?koi8-r?B?88vMwcTTy8nFINDPzcXdxc7J0SDOwSDMwMLPyiD...
	89% 	Apr 6 10:10a 	Авдакова Вера <plumpestlni1@rb... 	Предложения для директора.
	93% 	Apr 6 09:25a 	ОКОННЫЙ МАСТЕР <gvor@74.r... 	=?windows-1251?B?0OXs7u3yIO/r4PHy6Oru4vv1IO7q7u0=?...
	68% 	Apr 6 09:14a 	Тихонова Ксения 	=?koi8-r?B?8/T15OXu9Pkg8O/t7+f19CD34e0g9yDs4OLv6iD...
	80% 	Apr 6 08:47a 	РАССЫЛЬЩИК <pyponykop@ram... 	=?windows-1251?B?wuD44CDQxcrLwMzAIOzu5uXyIPHy7ujS3...
	58% 	Apr 6 08:29a 	=?koi8-r?Q?=F3=F7=E8_=EB=D2=C1=D3=CE=CF=D1=D2=D3=C... 	КРАСНОЯРСК!!!
	96% 	Apr 6 08:18a 	СТО <doors@mail.ru> 	=?windows-1251?B?0SDSIMAgyyDcIM0g2yDFIMggwMvezMjNy...
	95% 	Apr 6 08:18a 	СТО <axerypo@rambler.ru> 	=?windows-1251?B?0SDSIMAgyyDcIM0g2yDFIMggwMvezMjNy...
	56% 	Apr 6 07:53a 	Калашникова Люба <blakekyt@nm... 	pаccылкa oт лидеpoв
с Convert::Cyrillic::cstocs("WIN", 'KOI8', $src);

Код: Выделить всё

 	 67%  	Apr 6 10:52a  	gp@sibtyre.ru  	=?utf-8?Q?=D0=9A=D0=BE=D0=BC=D0=B5=D1=80=D1=87=D0=...
	63% 	Apr 6 10:46a 	уЧЕФМБОБ нБТФЙОПЧЙЮ 	=?koi8-r?B?88vMwcTTy8nFINDPzcXdxc7J0SDOwSDMwMLPyiD...
	89% 	Apr 6 10:10a 	бЧДБЛПЧБ чЕТБ <plumpestlni1@rb... 	рТЕДМПЦЕОЙС ДМС ДЙТЕЛФПТБ.
	93% 	Apr 6 09:25a 	ОКОННЫЙ МАСТЕР <gvor@74.r... 	=?windows-1251?B?0OXs7u3yIO/r4PHy6Oru4vv1IO7q7u0=?...
	68% 	Apr 6 09:14a 	фЙИПОПЧБ лУЕОЙС 	=?koi8-r?B?8/T15OXu9Pkg8O/t7+f19CD34e0g9yDs4OLv6iD...
	80% 	Apr 6 08:47a 	РАССЫЛЬЩИК <pyponykop@ram... 	=?windows-1251?B?wuD44CDQxcrLwMzAIOzu5uXyIPHy7ujS3...
	58% 	Apr 6 08:29a 	=?koi8-r?Q?=F3=F7=E8_=EB=D2=C1=D3=CE=CF=D1=D2=D3=C... 	лтбуопстул!!!
	96% 	Apr 6 08:18a 	СТО <doors@mail.ru> 	=?windows-1251?B?0SDSIMAgyyDcIM0g2yDFIMggwMvezMjNy...
	95% 	Apr 6 08:18a 	СТО <axerypo@rambler.ru> 	=?windows-1251?B?0SDSIMAgyyDcIM0g2yDFIMggwMvezMjNy...
	56% 	Apr 6 07:53a 	лБМБЫОЙЛПЧБ мАВБ <blakekyt@nm... 	pБccЩМЛa oФ МЙДЕpoЧ

Аватара пользователя
Lazy caT
мл. сержант
Сообщения: 101
Зарегистрирован: 2008-09-11 9:59:17
Откуда: Местные мы...
Контактная информация:

Re: Перекодировка MIME в карантине DSPAM

Непрочитанное сообщение Lazy caT » 2010-04-08 16:18:29

Я пробовал вот тут xcode(${$_}[1], ${$_}[0])} поменять 0 на 1 т.е xcode(${$_}[0], ${$_}[1])} на странице появились вместо перевода "windows-1251" или "koi-8"

Это те же 10 строк что я привел выше:

Код: Выделить всё

 	 67%  	Apr 6 10:52a  	 	
	63% 	Apr 6 10:46a 	koi8-r 	
	89% 	Apr 6 10:10a 	koi8-r 	koi8-r
	93% 	Apr 6 09:25a 	windows-1251 	
	68% 	Apr 6 09:14a 	koi8-r 	
	80% 	Apr 6 08:47a 	windows-1251 	
	58% 	Apr 6 08:29a 		koi8-r
	96% 	Apr 6 08:18a 	windows-1251 	
	95% 	Apr 6 08:18a 	windows-1251 	
	56% 	Apr 6 07:53a 	koi8-r 	koi8-r