ALT Linux sysadmins discussion
 help / color / mirror / Atom feed
* [Sysadmins] CP1251 и фильтры в procmail
@ 2009-05-19 13:50 Михаил Шувалов
  2009-05-19 15:19 ` Afanasov Dmitry
  0 siblings, 1 reply; 7+ messages in thread
From: Михаил Шувалов @ 2009-05-19 13:50 UTC (permalink / raw)
  To: ALT Linux Community general discussions, ALT Linux sysadmin discuss

Добрый день!

Извините за кросспост, но срочно нужно решить проблема.

Почта принимается fetchmail, далее обрабатывается фильтрами в
gprocmail и копия письма кладется в ящик. Все бы ничего, но некоторые
файлы приходят с кириллицей в именах. Сами файлы представляют собой
rar архив в котором файл с таким же именем. Нужно вытащить из письма
этот файл, сохранить его, проанализировать имя файла, содержашее дату,
извлечь из архива файл и положить в предварительно созданную папку.
Если в имени файла латиница - все нормлаьно, а вот с кирилицей засада.
Привожу фильтр и обрабатывающиескрипты:

фильтр procmail:
:0 HBc
* ^From.*<e-mail>
* ^Content-Disposition: attachment;
| /home/RcvReestr/GetArcAMK


Скрипты:
=========================================================================================================
$ cat /home/RcvReestr/GetArcAMK
#!/bin/sh

# корневая папка, где находятся все скрипты и подкаталоги с полученными архивами
RootPath=/home/RcvReestr

export LANG=ru_RU.UTF-8
export LC_CTYPE="ru_RU.UTF-8"
export LC_NUMERIC="ru_RU.UTF-8"
export LC_TIME="ru_RU.UTF-8"
export LC_COLLATE="ru_RU.UTF-8"
export LC_MONETARY="ru_RU.UTF-8"
export LC_MESSAGES="ru_RU.UTF-8"
export LC_PAPER="ru_RU.UTF-8"
export LC_NAME="ru_RU.UTF-8"
export LC_ADDRESS="ru_RU.UTF-8"
export LC_TELEPHONE="ru_RU.UTF-8"
export LC_MEASUREMENT="ru_RU.UTF-8"
export LC_IDENTIFICATION="ru_RU.UTF-8"
export LC_ALL=

# логфайл
LogFile=${RootPath}/GetArcAMK.log

echo `date +"%d.%m.%Y %H:%M:%S"`"--- start script ---">>$LogFile

# ---------======= Пути ======------------
# куда помещаем для обработки полученные архивы
AllFile=/home/RcvReestr/ALL/AMK

/usr/bin/ripmime -i - -d "$AllFile"

rm -f ${AllFile}/text*

for i in $AllFile/*.rar
do
	echo `date +"%d.%m.%Y %H:%M:%S"` "start of reestrAMK $i ">>$LogFile
	$RootPath/reestrAMK $i
done

# очищаем папку
rm -f ${AllFile}/*.*
echo `date +"%d.%m.%Y %H:%M:%S"`"--- stop script ---">>$LogFile
echo >>$LogFile
==============================================================================================

$ cat /home/RcvReestr/reestrAMK
#!/bin/sh

export LANG=ru_RU.UTF-8
export LC_CTYPE="ru_RU.UTF-8"
export LC_NUMERIC="ru_RU.UTF-8"
export LC_TIME="ru_RU.UTF-8"
export LC_COLLATE="ru_RU.UTF-8"
export LC_MONETARY="ru_RU.UTF-8"
export LC_MESSAGES="ru_RU.UTF-8"
export LC_PAPER="ru_RU.UTF-8"
export LC_NAME="ru_RU.UTF-8"
export LC_ADDRESS="ru_RU.UTF-8"
export LC_TELEPHONE="ru_RU.UTF-8"
export LC_MEASUREMENT="ru_RU.UTF-8"
export LC_IDENTIFICATION="ru_RU.UTF-8"
export LC_ALL=

# Создаем логфайл, если он не существует.
LF=/home/RcvReestr/`basename $0`.log
if [ ! -f $LF ]
then touch $LF
fi

echo `date +"%d.%m.%Y %H:%M:%S"` Start>>$LF

# В качестве параметра должен передаваться архивный файл (*.rar)
if [ $# -lt 1 ]
then	echo "Строка запуска: $0 <filename>"
	echo "Строка запуска: $0 <filename>">>$LF
	exit
fi

# Подпапка с реестрами
CTLGNAME=AMK/FIL/

EXT=.rar

RCVPATH=/home/RcvReestr/ALL/AMK/
SRCPATH=/home/RcvReestr/$CTLGNAME

# Если не подмонтирована папка, то монтируем
mnt=$"`mount | grep SERVER`"
[ "$mnt" ] || sudo ncpmount -S SERVER -U user -P password -m -u 500 -y
utf8 -p cp866 /mnt/SERVER

DSTPATH=/mnt/SERVER/pub/tsr/reestr/$CTLGNAME
FN=`basename $1`

if [ ! -f $RCVPATH$FN ]
then	echo "Отсутствует файл"
	echo "Отсутствует файл">>$LF
	exit
fi

FN=`basename $FN $EXT`

# Получаем дату реестра из имени файла
SPY=`expr $(echo "len($FN)" | m4) - 8`
SPM=`expr $(echo "len($FN)" | m4) - 4`
SPD=`expr $(echo "len($FN)" | m4) - 2`

y=`echo "substr($FN,$SPY,4)" | m4`
m=`echo "substr($FN,$SPM,2)" | m4`
d=`echo "substr($FN,$SPD,2)" | m4`

# Определяем номер филиала
FIL=`echo "substr($FN,0,2)" | m4`

# Куда помещаем полученный архив
SP=$SRCPATH$FIL/$y/$m/$d/

# Куда разархивируем реестры
DP=$DSTPATH$FIL/$y/$m/$d/

if [ ! -d $SP ]
then mkdir -p $SP
fi

if [ ! -d $DP ]
then mkdir -p $DP
fi

unrar e -y ${RCVPATH}${FN}${EXT} ${DP}>>${LF}

mv ${RCVPATH}${FN}${EXT} ${SP}

echo `date +"%d.%m.%Y %H:%M:%S"` --- Stop --->>$LF
echo "">>$LF
=====================================================================================================

-- 
С уважением,
Михаил Шувалов

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [Sysadmins] CP1251 и фильтры в procmail
  2009-05-19 13:50 [Sysadmins] CP1251 и фильтры в procmail Михаил Шувалов
@ 2009-05-19 15:19 ` Afanasov Dmitry
  2009-05-19 22:04   ` Михаил Шувалов
  0 siblings, 1 reply; 7+ messages in thread
From: Afanasov Dmitry @ 2009-05-19 15:19 UTC (permalink / raw)
  To: sysadmins

[-- Attachment #1: Type: text/plain, Size: 477 bytes --]

On Tue, May 19, 2009 at 05:50:32PM +0400, Михаил Шувалов wrote:
> Добрый день!
> 
> Если в имени файла латиница - все нормлаьно, а вот с кирилицей засада.
> Привожу фильтр и обрабатывающиескрипты:
а в чем заключается "засада"?

> /usr/bin/ripmime -i - -d "$AllFile"
подозреваю, засада после него. файлы в кодировке письма сохраняются, в
системную не переименовываются?

если, то просто придется переименовывать. либо сваять свой ripmime :)

-- 
С любовью,
Дима

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 198 bytes --]

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [Sysadmins] CP1251 и фильтры в procmail
  2009-05-19 15:19 ` Afanasov Dmitry
@ 2009-05-19 22:04   ` Михаил Шувалов
  2009-05-20  6:33     ` Afanasov Dmitry
  0 siblings, 1 reply; 7+ messages in thread
From: Михаил Шувалов @ 2009-05-19 22:04 UTC (permalink / raw)
  To: Afanasov Dmitry, ALT Linux sysadmin discuss

В Втр, 19/05/2009 в 19:19 +0400, Afanasov Dmitry пишет:
> On Tue, May 19, 2009 at 05:50:32PM +0400, Михаил Шувалов wrote:
> > Добрый день!
> > 
> > Если в имени файла латиница - все нормлаьно, а вот с кирилицей засада.
> > Привожу фильтр и обрабатывающиескрипты:
> а в чем заключается "засада"?
> 
Засада, видимо, в том, что описано ниже: файлы, сохраненные в кодировке
письма (СР1251) :(

> > /usr/bin/ripmime -i - -d "$AllFile"
> подозреваю, засада после него. файлы в кодировке письма сохраняются, в
> системную не переименовываются?
> 
> если, то просто придется переименовывать. 

и как посоветуете перекодировать имена файлов из 1251 в юникод? (про
гугл я знаю :) )

> либо сваять свой ripmime :)

Шуточки у вас, батенька :)

-- 
С уважением,
Михаил Шувалов



^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [Sysadmins] CP1251 и фильтры в procmail
  2009-05-19 22:04   ` Михаил Шувалов
@ 2009-05-20  6:33     ` Afanasov Dmitry
  2009-05-20 20:06       ` Михаил Шувалов
  0 siblings, 1 reply; 7+ messages in thread
From: Afanasov Dmitry @ 2009-05-20  6:33 UTC (permalink / raw)
  To: ALT Linux sysadmin discuss

[-- Attachment #1: Type: text/plain, Size: 1211 bytes --]

On Wed, May 20, 2009 at 02:04:58AM +0400, Михаил Шувалов wrote:
> В Втр, 19/05/2009 в 19:19 +0400, Afanasov Dmitry пишет:
> > On Tue, May 19, 2009 at 05:50:32PM +0400, Михаил Шувалов wrote:
> > > /usr/bin/ripmime -i - -d "$AllFile"
> > подозреваю, засада после него. файлы в кодировке письма сохраняются, в
> > системную не переименовываются?
> > 
> > если, то просто придется переименовывать. 
> 
> и как посоветуете перекодировать имена файлов из 1251 в юникод? (про
> гугл я знаю :) )
сначала надо перекодировать из mime'ового бреда (uuencode ли quoted
printable) в нормальную кодировку, затем на этот текст
iconv -f charset -t utf8
ну и потом mv oldname newname

что за звери эти uuencode и quoted printable надо самому вспоминать, благо
память по имени google рядом :)

> > либо сваять свой ripmime :)
> 
> Шуточки у вас, батенька :)
ну почему же. была когда-то задача архивирования приходящей почты,
проверки на вирусы/спам. тогда столкнулся с тем же.

одно но - использовал perl. сриптик был простой, экрана на два. из ripmime
всего-то нужно выдрать From, To, Subject и mime-части. для этого
достаточно модулей MIME::Parser и MIME::Entity.
-- 
С уважением
Афанасов Дмитрий

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 198 bytes --]

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [Sysadmins] CP1251 и фильтры в procmail
  2009-05-20  6:33     ` Afanasov Dmitry
@ 2009-05-20 20:06       ` Михаил Шувалов
  2009-05-21  5:47         ` Afanasov Dmitry
  0 siblings, 1 reply; 7+ messages in thread
From: Михаил Шувалов @ 2009-05-20 20:06 UTC (permalink / raw)
  To: Afanasov Dmitry, ALT Linux sysadmin discuss

В Срд, 20/05/2009 в 10:33 +0400, Afanasov Dmitry пишет:
> On Wed, May 20, 2009 at 02:04:58AM +0400, Михаил Шувалов wrote:
> > В Втр, 19/05/2009 в 19:19 +0400, Afanasov Dmitry пишет:
> > > On Tue, May 19, 2009 at 05:50:32PM +0400, Михаил Шувалов wrote:
> > > > /usr/bin/ripmime -i - -d "$AllFile"
> > > подозреваю, засада после него. файлы в кодировке письма сохраняются, в
> > > системную не переименовываются?
> > > 
> > > если, то просто придется переименовывать. 
> > 
> > и как посоветуете перекодировать имена файлов из 1251 в юникод? (про
> > гугл я знаю :) )
> сначала надо перекодировать из mime'ового бреда (uuencode ли quoted
> printable) в нормальную кодировку, затем на этот текст
> iconv -f charset -t utf8
> ну и потом mv oldname newname
> 
> что за звери эти uuencode и quoted printable надо самому вспоминать, благо
> память по имени google рядом :)
> 
Это все, как я понял относится к _содержимому_ файла. Здесь все
нормально. Нужно перекодировать именно _имя_ файла.

> > > либо сваять свой ripmime :)
> > 
> > Шуточки у вас, батенька :)
> ну почему же. была когда-то задача архивирования приходящей почты,
> проверки на вирусы/спам. тогда столкнулся с тем же.
> 
> одно но - использовал perl. сриптик был простой, экрана на два. из ripmime
> всего-то нужно выдрать From, To, Subject и mime-части. для этого
> достаточно модулей MIME::Parser и MIME::Entity.

Увы, я с перлом не знаком :(

-- 
С уважением,
Михаил Шувалов



^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [Sysadmins] CP1251 и фильтры в procmail
  2009-05-20 20:06       ` Михаил Шувалов
@ 2009-05-21  5:47         ` Afanasov Dmitry
  2009-05-21 14:12           ` Alexey I. Froloff
  0 siblings, 1 reply; 7+ messages in thread
From: Afanasov Dmitry @ 2009-05-21  5:47 UTC (permalink / raw)
  To: ALT Linux sysadmin discuss


[-- Attachment #1.1: Type: text/plain, Size: 1209 bytes --]

On Thu, May 21, 2009 at 12:06:21AM +0400, Михаил Шувалов wrote:
> В Срд, 20/05/2009 в 10:33 +0400, Afanasov Dmitry пишет:
> > On Wed, May 20, 2009 at 02:04:58AM +0400, Михаил Шувалов wrote:
> > > и как посоветуете перекодировать имена файлов из 1251 в юникод? (про
> > > гугл я знаю :) )
> > сначала надо перекодировать из mime'ового бреда (uuencode ли quoted
> > printable) в нормальную кодировку> > 
> Это все, как я понял относится к _содержимому_ файла. Здесь все
> нормально. Нужно перекодировать именно _имя_ файла.
неа, не только :) вчера поразвлекался, вспомнил:
например возмем крякозябру
Subject: Re: [room] =?koi8-r?b?89fR3cXOzsnLINrBzsnNwcXU09Eg0M/E09TSxcvB1MXM?= =?koi8-r?b?2NPU18/NIMsg0MnSwdTT1NfV?=
классическая 7bit'ная кодировка, в которой и имена файлов кодируются в
mime-аттачах.

формат этого бреда следующий:
=?charset?encoding?encoded-text?=

=? и ?= : органичители
encoding: b - base64, q - quoted printable, uuencode вроде не встречался.

на перле таким занимается модулек MIME::Words


хха, я тут набаловался, в аттаче скриптинка, что этот бред, взятый из
stdin'а, переводит и выводит на stdout :) требует perl-MIME-tools
-- 
С уважением
Афанасов Дмитрий

[-- Attachment #1.2: decoder --]
[-- Type: text/plain, Size: 465 bytes --]

#!/usr/bin/perl -w

use MIME::Words qw/decode_mimewords/;
use Text::Iconv;
use I18N::Langinfo qw(langinfo CODESET);

my $localcharset = langinfo(CODESET());

while(<>)
 {
  my @text;
  foreach $pair (decode_mimewords($_))
   {
    my ($text, $charset) = @$pair;
    unless($charset)
     {
      push @text, $text;
      next;
     }
    my $converter = Text::Iconv->new($charset, $localcharset);
    push @text, $converter->convert($text);
   }

  print @text;
 }

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 198 bytes --]

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [Sysadmins] CP1251 и фильтры в procmail
  2009-05-21  5:47         ` Afanasov Dmitry
@ 2009-05-21 14:12           ` Alexey I. Froloff
  0 siblings, 0 replies; 7+ messages in thread
From: Alexey I. Froloff @ 2009-05-21 14:12 UTC (permalink / raw)
  To: sysadmins

[-- Attachment #1: Type: text/plain, Size: 429 bytes --]

* Afanasov Dmitry <AfanasovDmitry@> [090521 09:49]:
> Subject: Re: [room] =?koi8-r?b?89fR3cXOzsnLINrBzsnNwcXU09Eg0M/E09TSxcvB1MXM?= =?koi8-r?b?2NPU18/NIMsg0MnSwdTT1NfV?=
> классическая 7bit'ная кодировка, в которой и имена файлов кодируются в
> mime-аттачах.
Ващщета это RFC2047, но имена аттачей им никогда не кодировались,
это делают только кривые аутлуки.  Для аттачей надо читать
RFC2231.

-- 
Regards,
Sir Raorn.

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 197 bytes --]

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2009-05-21 14:12 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2009-05-19 13:50 [Sysadmins] CP1251 и фильтры в procmail Михаил Шувалов
2009-05-19 15:19 ` Afanasov Dmitry
2009-05-19 22:04   ` Михаил Шувалов
2009-05-20  6:33     ` Afanasov Dmitry
2009-05-20 20:06       ` Михаил Шувалов
2009-05-21  5:47         ` Afanasov Dmitry
2009-05-21 14:12           ` Alexey I. Froloff

ALT Linux sysadmins discussion

This inbox may be cloned and mirrored by anyone:

	git clone --mirror http://lore.altlinux.org/sysadmins/0 sysadmins/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 sysadmins sysadmins/ http://lore.altlinux.org/sysadmins \
		sysadmins@lists.altlinux.org sysadmins@lists.altlinux.ru sysadmins@lists.altlinux.com
	public-inbox-index sysadmins

Example config snippet for mirrors.
Newsgroup available over NNTP:
	nntp://lore.altlinux.org/org.altlinux.lists.sysadmins


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git