Добрый день!Задача - восстанавливать в скрипте (для последующей проверки) заголовки писем вида:
Subject: =?utf-8?B?0K3RgtC+INC+0YTQuNCz0LjRgtC10LvRjNC90L4g0LTQu9C40L3QvdGL0Lkg0YI=?=
=?utf-8?B?0LXQutGB0YIg0L/QviDRgNGD0YHRgdC60LguINCi0YPRgiDQtdGB0YLRjCDRhg==?=
=?utf-8?B?0LjRhNGA0YsgLSDQstC+0YIg0L7QvdC4ICIxMiAzNCA1NiA3OCA5MCIg?=
=?utf-8?B?0Lgg0LXRidGRINC00L4g0YTQuNCz0LAg0YfQtdCz0L4g0YLQvi4g0J3QsNC/?=
=?utf-8?B?0YDQuNC80LXRgCDQstC+0YIg0Y3RgtC+IC0gItC60LDRgNC7INGDINC60Ls=?=
=?utf-8?B?0LDRgNGLINGD0LrRgNCw0Lsg0LrQvtGA0YDQsNC70Ysi?=я попробовал убрать "=?utf-8?B?", "=", "?=", получаем файл вида:
# cat in.txt
0K3RgtC+INC+0YTQuNCz0LjRgtC10LvRjNC90L4g0LTQu9C40L3QvdGL0Lkg0YI0LXQutGB0YIg0L/QviDRgNGD0YHRgdC60LguINCi0YPRgiDQtdGB0YLRjCDRhg0LjRhNGA0YsgLSDQstC+0YIg0L7QvdC4ICIxMiAzNCA1NiA3OCA5MCIg0Lgg0LXRidGRINC00L4g0YTQuNCz0LAg0YfQtdCz0L4g0YLQvi4g0J3QsNC/0YDQuNC80LXRgCDQstC+0YIg0Y3RgtC+IC0gItC60LDRgNC7INGDINC60Ls0LDRgNGLINGD0LrRgNCw0Lsg0LrQvtGA0YDQsNC70Ysiно он не декодируется! пробовал и с помощью cat in.txt | base64 -d -i
и cat in.txt | perl -e 'use MIME::Base64 qw(decode_base64);print decode_base64(<>);'раскодируется буквально несколько слов - дальше мусор.
пробовал перед декодированием прогонять файл через фильтр | td -d "\r" | tr -d "\n" - не помогло.
причём я заметил - если просто набрать текст заголовка в файл и сконвертить его в консоли в base64, то с base64 из subject совпадает только 1-я строка.
проверял на нескольких письмах.
как правильно сначала собрать base64 заголовк письма из нескольких строк, а затем его раскодировать?
заранее спасибо!
>[оверквотинг удален]
> раскодируется буквально несколько слов - дальше мусор.
> пробовал перед декодированием прогонять файл через фильтр | td -d "\r"
> | tr -d "\n" - не помогло.
> причём я заметил - если просто набрать текст заголовка в файл и
> сконвертить его в консоли в base64, то с base64 из subject
> совпадает только 1-я строка.
> проверял на нескольких письмах.
> как правильно сначала собрать base64 заголовк письма из нескольких строк, а затем
> его раскодировать?
> заранее спасибо!
$ cat in.txt
=?utf-8?B?0K3RgtC+INC+0YTQuNCz0LjRgtC10LvRjNC90L4g0LTQu9C40L3QvdGL0Lkg0YI=?=
=?utf-8?B?0LXQutGB0YIg0L/QviDRgNGD0YHRgdC60LguINCi0YPRgiDQtdGB0YLRjCDRhg==?=
=?utf-8?B?0LjRhNGA0YsgLSDQstC+0YIg0L7QvdC4ICIxMiAzNCA1NiA3OCA5MCIg?=
=?utf-8?B?0Lgg0LXRidGRINC00L4g0YTQuNCz0LAg0YfQtdCz0L4g0YLQvi4g0J3QsNC/?=
=?utf-8?B?0YDQuNC80LXRgCDQstC+0YIg0Y3RgtC+IC0gItC60LDRgNC7INGDINC60Ls=?=
=?utf-8?B?0LDRgNGLINGD0LrRgNCw0Lsg0LrQvtGA0YDQsNC70Ysi?=$ cat in.txt | sed 's/=?utf-8?B?\|?=//g' | base64 -di
Это офигительно длинный текст по русски. Тут есть цифры - вот они "12 34 56 78 90" и ещё до фига чего то. Например вот это - "карл у клары украл корралы"
>[оверквотинг удален]
> =?utf-8?B?0LXQutGB0YIg0L/QviDRgNGD0YHRgdC60LguINCi0YPRgiDQtdGB0YLRjCDRhg==?=
> =?utf-8?B?0LjRhNGA0YsgLSDQstC+0YIg0L7QvdC4ICIxMiAzNCA1NiA3OCA5MCIg?=
> =?utf-8?B?0Lgg0LXRidGRINC00L4g0YTQuNCz0LAg0YfQtdCz0L4g0YLQvi4g0J3QsNC/?=
> =?utf-8?B?0YDQuNC80LXRgCDQstC+0YIg0Y3RgtC+IC0gItC60LDRgNC7INGDINC60Ls=?=
> =?utf-8?B?0LDRgNGLINGD0LrRgNCw0Lsg0LrQvtGA0YDQsNC70Ysi?=
> $ cat in.txt | sed 's/=?utf-8?B?\|?=//g' | base64 -di
> Это офигительно длинный текст по русски. Тут есть цифры - вот они
> "12 34 56 78 90" и ещё до фига чего то.
> Например вот это - "карл у клары украл корралы"
>
хм.. ещё до вашего ответа попробовал проделать всё тоже самое но на другой машине (а именно на ubuntu 11.04 x86_64) - всё работает. А вот там где я делал изначально (centos 5.6 x86) не работает. И ваша команда тоже не отрабатывает:
$ cat in.txt | sed 's/=?utf-8?B?//; s/?=//' | base64 -di
Это офигительно длинный тbase64: invalid input
> хм.. ещё до вашего ответа попробовал проделать всё тоже самое но на
> другой машине (а именно на ubuntu 11.04 x86_64) - всё работает.
> А вот там где я делал изначально (centos 5.6 x86) не
> работает. И ваша команда тоже не отрабатывает:
> $ cat in.txt | sed 's/=?utf-8?B?//; s/?=//' | base64 -di
> Это офигительно длинный тbase64: invalid inputТогда, думаю, имеет смысл удостовериться в том, что на обеих машинах на вход base64
подается одинаковый текст и если после этого проблема не исчезнет, то останется
грешить на саму утилиту - может в версии для CentOS есть какой-нибудь баг. Кстати,
каковы версии base64 в обоих дистрибутивах?
>[оверквотинг удален]
>> А вот там где я делал изначально (centos 5.6 x86) не
>> работает. И ваша команда тоже не отрабатывает:
>> $ cat in.txt | sed 's/=?utf-8?B?//; s/?=//' | base64 -di
>> Это офигительно длинный тbase64: invalid input
> Тогда, думаю, имеет смысл удостовериться в том, что на обеих машинах на
> вход base64
> подается одинаковый текст и если после этого проблема не исчезнет, то останется
> грешить на саму утилиту - может в версии для CentOS есть какой-нибудь
> баг. Кстати,
> каковы версии base64 в обоих дистрибутивах?в centos5 довольно таки старая версия coreutils 5.97
в ubuntu coreutils 8.5более того, я попробовал через perl на ubuntu - не работает, тоже вываливается, и через openssl base64 тоже вываливается и там и там. Походу общий баг. Работает только через base64 из новых coreutils на новой убунту.
так что вот так :)
спасибо за помощь!
>[оверквотинг удален]
>> Это офигительно длинный текст по русски. Тут есть цифры - вот они
>> "12 34 56 78 90" и ещё до фига чего то.
>> Например вот это - "карл у клары украл корралы"
>>
> хм.. ещё до вашего ответа попробовал проделать всё тоже самое но на
> другой машине (а именно на ubuntu 11.04 x86_64) - всё работает.
> А вот там где я делал изначально (centos 5.6 x86) не
> работает. И ваша команда тоже не отрабатывает:
> $ cat in.txt | sed 's/=?utf-8?B?//; s/?=//' | base64 -di
> Это офигительно длинный тbase64: invalid inputfor a in $(cat in.txt); do b=$(echo "$a" | cut -d\? -f4); echo $b | base64 -d; done
или
for a in $(cat in.txt); do b=$(echo "$a" | sed 's/=?utf-8?B?//; s/?=//'); echo $b | base64 -d; done
>[оверквотинг удален]
> раскодируется буквально несколько слов - дальше мусор.
> пробовал перед декодированием прогонять файл через фильтр | td -d "\r"
> | tr -d "\n" - не помогло.
> причём я заметил - если просто набрать текст заголовка в файл и
> сконвертить его в консоли в base64, то с base64 из subject
> совпадает только 1-я строка.
> проверял на нескольких письмах.
> как правильно сначала собрать base64 заголовк письма из нескольких строк, а затем
> его раскодировать?
> заранее спасибо!я бы пошел другим путем. взял бы libvmime и с ее помощью написал бы простенькую прогу, которая осуществляет необходимую фильтрацию (проверку) ну а результат в код возврата