пытаюсь настроить конвертацию текста сообщений, прилетающих на e-mail.
Коротко структура
getmail - забирает письмо и отправляет его в procmail.
в procmail текст сообщения отправляется в исполняемый bash-файл
:0b
| /path/to/bash-файлв bash-файле текст письма записывается в файл и должна произвестись конвертация
#!/bash/sh
tmp=$(mktemp /tmp/tmp.XXXXXX)
cat >$tmp
OUTFILE=$(mktemp /tmp/tmp.decode.XXXXX)awk '{print $0}' < $tmp | perl -e 'use MIME::Decoder; $decoder = new MIME::Decoder "quoted-printable"; $decoder->decode(\*STDIN, \*STDOUT);' | iconv -f CP1251 > $OUTFILE
но этого не происходит, причем если я в командной строке исполню awk... то все нормально.
Пример текста сообщения:
test:=D0=CA=D1=C8, 16:30:28, =C3=EE=
=F0=E1=F3=ED=EE=E2 =D1=E5=F0=E3=E5=E9, =E2=FB=F5=EE=E4что я делаю не так?
> #!/bash/sh
намекаешь на #!/usr/bin/perl ?
дело в том , что отдельно, сам по себе bash-файл работает... а в связке с procmail - нет
> дело в том , что отдельно, сам по себе bash-файл работает... а
> в связке с procmail - нетИдея указать полные пути ко всему, что используется в скрипте, просто вопиёт
>> дело в том , что отдельно, сам по себе bash-файл работает... а
>> в связке с procmail - нет
> Идея указать полные пути ко всему, что используется в скрипте, просто вопиётИли нормальный PATH= в начале написать.
+
Намёк, видимо, на то, что с /bin/sh в шебанге запускается не [совсем] баш.++
cat, написанный на awk-е и заявка "в командной строке исполню awk" поражают воображение.
> cat, написанный на awk-е ...Это ж олдскул, где-то скопипастил видимо.
вы чо сразу во все его носом ткнули - тут же можно было две недели лулзы ловить с одного только
awk '{print $0}' < $tmp |
а через месяцок пришли бы к пониманию конвейера как такового :)
вот как раз с awk - я просто разобрался благодаря вот этому ресурсу -> http://rus-linux.net/MyLDP/consol/awk.html
> вот как раз с awk - я просто разобрался благодаря вот этому
> ресурсу -> http://rus-linux.net/MyLDP/consol/awk.htmlпохвально то, что вы пытаетесь разбираться, но таки лучший ресурс
man awk, а по ссылке просто голимые примеры.
может напишите безвозмездно за вознаграждение? )
не совсем копипаст, но собирал из различных примеров, да )
> что я делаю не так?MIME Decoder ниасилил на баше.
Ладно, зайдем по-другому, за вознаграждение может кто напишет?
> Ладно, зайдем по-другому, за вознаграждение может кто напишет?О, а что ж раньше молчал. Сумма?
#!/bin/bash# Usage:
#
# Encode
# $ ./base64.sh < file > binary-file.base64
# Decode
# $ ./base64.sh -d < file.base64 > file
#
base64_charset=( {A..Z} {a..z} {0..9} + / = )
text_width=64function display_base64_char {
printf "${base64_charset[$1]}"; (( width++ ))
(( width % text_width == 0 )) && printf "\n"
}function encode_base64 {
declare -a -i c8 c6
c8=( $(printf "ibase=16; ${1:0:2}\n${1:2:2}\n${1:4:2}\n" | bc) )
(( c6[0] = c8[0] >> 2 ))
(( c6[1] = ((c8[0] & 3) << 4) | (c8[1] >> 4) ))
case ${#c8[*]} in
3) (( c6[2] = ((c8[1] & 15) << 2) | (c8[2] >> 6) ))
(( c6[3] = c8[2] & 63 )) ;;
2) (( c6[2] = (c8[1] & 15) << 2 ))
(( c6[3] = 64 )) ;;
1) (( c6[2] = c6[3] = 64 )) ;;
esacfor char in ${c6[@]}; do
display_base64_char ${char}
done
}function decode_base64 {
declare -a -i c8 c6
for current_char in ${1:0:1} ${1:1:1} ${1:2:1} ${1:3:1}; do
[ "${current_char}" = "=" ] && break
position=0
while [ "${current_char}" != "${base64_charset[${position}]}" ]; do
(( position++ ))
donec6=( ${c6[*]} ${position} )
done(( c8[0] = (c6[0] << 2) | (c6[1] >> 4) ))
case ${#c6[*]} in
3) (( c8[1] = ( (c6[1] & 15) << 4) | (c6[2] >> 2) ))
(( c8[2] = (c6[2] & 3) << 6 )); unset c8[2] ;;
4) (( c8[1] = ( (c6[1] & 15) << 4) | (c6[2] >> 2) ))
(( c8[2] = ( (c6[2] & 3) << 6) | c6[3] )) ;;
esacfor char in ${c8[*]}; do
printf "\x$(printf "%x" ${char})"
done
}if [ "$1" = "-d" ]; then # decode
content=$(cat - | tr -d "\n" | sed -r "s/(.{4})/\1 /g")
for chars in ${content}; do decode_base64 ${chars}; doneelse
content=$(cat - | xxd -ps -u | sed -r "s/(\w{6})/\1 /g" | tr -d "\n")
for chars in ${content}; do encode_base64 ${chars}; done
echo
fi
>> Ладно, зайдем по-другому, за вознаграждение может кто напишет?
> О, а что ж раньше молчал. Сумма?Pavlinux - ты таки извращенец! Хотя после шахмат на awk-е меня уже ничем не прошибёшь :)))
>>> Ладно, зайдем по-другому, за вознаграждение может кто напишет?
>> О, а что ж раньше молчал. Сумма?
> Pavlinux - ты таки извращенец! Хотя после шахмат на awk-е меня уже
> ничем не прошибёшь :)))Не, я - ленивое говно, которое читает доки =)
Advanced Bash-Scripting Guide: Example A-54. Base64 encoding/decodingНо код ещё можно за оптимизить, куски с xxd и sed тоже на баше переписать.
> Не, я - ленивое говно, которое читает доки =)противоречие, однако :)
не сработал твой скрипт )))
кидай почту, договоримся
> не сработал твой скрипт )))Патамуша я дятел, вместо MIME quoted printable декодил из base64 %-)
$ echo -e $(echo 'test:=D0=CA=D1=C8, 16:30:28, =C3=EE=F0=E1=F3=ED=EE=E2 =D1=E5=F0=E3=E5=E9, =E2=FB=F5=EE=E4' | sed 's/=/\\x/g') | iconv -f cp1251;
test:РКСИ, 16:30:28, Горбунов Сергей, выход
и чем тАдА это отличается от моего варианта? )))я на основе твоего варианта сделал так:
#/bin/sh
tmp=$(mktemp /tmp/tmp.XXXXXX)
cat >$tmp
OUTFILE=$(mktemp /tmp/tmp.decode.XXXXX)
echo -e $(cat $tmp | sed 's/=/\\x/g') | iconv -f CP1251 | awk 'BEGIN {FS = ":"; RS = ""} {printf "To: "$1; print ""; print ""; printf $2":"; printf $3":"; print $4}' > $OUTFILEПолучилось:
To: test
\xD0\xCA\xD1\xC8, 11:03:13, \xC3\xEE\x \xF0\xE1\xF3\xED\xEE\xE2 \xD1\xE5\xF0\xE3\xE5\xE9, \xE2\xFB\xF5\xEE\xE4
а в коммандной строке работает ... только "\x " предательский вылазит ...To: test
РКСИ, 11:03:13, Го\x рбунов Сергей, выход
-------------------------------
1000р - нормально будет?
> ... только "\x " предательский вылазит ...пробелы надо игнорить
> -------------------------------
> 1000р - нормально будет?По 4.29 руб за байт;
#!/usr/bin/perluse strict;
use utf8;
use MIME::QuotedPrint qw(decode_qp);
use Encode qw(decode);
use open ':std',':encoding(UTF-8)';my $in;
my $out;foreach $in (<>) {
$out = decode_qp($in);
print decode("cp1251", $out);
}
вот теперь порядок, работает! )
Куда золото отправлять? могу тебе на телефон положить.
> Куда золото отправлять?В Опеннет http://www.opennet.me/contact.shtml, а то у него сервера грохаются. :)