Dyskusja na temat błędów kodowania trwa wśród użytkowników The Bat! od dość dawna, szczególnie dotyczy to alfabetów takich jak grecki lub cyrylica. Wiąże się to zapewne z wprowadzeniem Unicode na szerszą skalę. Mam nadzieję, że autorzy umożliwią wymuszanie domyślnego kodowania nawet wtedy, gdy wiadomość nie zawiera informacji na ten temat, czyli gdy jest błędnie sformatowana.
Na tym forum podobny problem pojawił się w innym wątku i również dotyczył wiadomości rozsyłanych przez serwer ze strony WWW. Jeśli są to wiadomości czysto tekstowe, czyli tak jak w przypadku omawianym tutaj, problem można obejść stosunkowo prosto za pomocą jednego filtru poczty przychodzącej. Powinien on reagować na charakterystyczne dane w błędnie sformatowanej wiadomości, np. adres nadawcy, temat, lub nawet brak wpisu w polu Content-Type. Filtr wykonuje kilka operacji charakterystycznych dla "poprawiania" odebranych wiadomości:
1. Eksport wiadomości do pliku w formacie skrzynki uniksowej (np. do D:\Dane\unix_msg.mbx).
2. Eksport wiadomości do zwykłego pliku tekstowego (np. D:\Dane\message.msg) według specjalnego szablonu (z zastąpieniem pliku o takiej samej nazwie, jeśli już taki plik istnieje). Istotą tego szablonu jest wykorzystanie wcześniej wyeksportowanego pliku unix_msg.mbx jako źródła do modyfikacji. W tym przypadku modyfikacja polega na podziale nagłówka, dopisaniu brakujących wierszy "kodujących" i następnie reszty wiadomości. Oto przykładowy szablon dla tej operacji ekportu:
%_OldMsg(%Put="D:\Dane\unix_msg.mbx")%-
%SetPattRegExp="(?ismU)(.*)(^Subject:\s*.*\n)(\w.*?)"%RegexpBlindMatch(%_OldMsg)%-
%SubPatt(1)%SubPatt(2)MIME-Version: 1.0
Content-Type: text/plain; charset=iso-8859-2
Content-Transfer-Encoding: 8bit
%SubPatt(3)%-
3. Import wiadomości z pliku D:\Dane\message.msg za pomocą wiersza poleceń, czyli uruchomienie w filtrze programu zewnętrznego, którym jest The Bat!, z następującym wierszem poleceń (warto także włączyć opcję czekania na zakończenie):
C:\Program Files\The Bat!\thebat.exe /IMPORTU="Nazwa konta";F="Nazwa folderu";X;W;I="D:\Dane\message.msg"
4. Ostatnią operacją w filtrze jest usunięcie oryginalnej wiadomości.
Działa to bez problemu, gdyby były jakieś niejasności - chętnie pomogę w ich wyjaśnieniu.
P.S. Dodam jeszcze drobne wyjaśnienie na temat zasady działania filtru do "poprawiania" przychodzących wiadomości. Jego najważniejszą częścią jest druga operacja eksportu danych do pliku (tutaj D:\Dane\message.msg), a w niej - szablon eksportu. W szablonie wykorzystano wyrażenie regularne dzielące treść pobraną z pliku, który powstał w wyniku wcześniejszej operacji eksportu wiadomości w formacie skrzynki uniksowej. Jako punkt podziału wiadomości wybrałem pole Subject w jej nagłówku, lecz równie dobrze może być to inne ściśle określone miejsce w źródłowej postaci danych. Zależy to od konkretnej potrzeby, np. gdy zamiast dodania pól określających kodowanie chcemy zmienić wartość jakiegoś pola nagłówka, wtedy jako punkt podziału trzeba przyjąć pole, które ma być zmieniane. W wyrażeniu regularnym (?ismU)(.*)(^Subject:\s*.*\n)(\w.*?) definiującym podział mamy zatem trzy podwyrażenia: (.*) oznacza dane od początku wiadomości do punktu podziału, (^Subject:\s*.*\n) oznacza wiersz, będący punktem podziału, a (\w.*?) pozostałą część wiadomości. Wydzielone (i zmodyfikowane w razie potrzeby) części wiadomości są następnie wpisywane do pliku za pomocą makr %SubPatt(n). Ważne jest przy tym zachowanie odpowiedniej kolejności poszczególnych elementów, szczególnie gdy między nie wstawia się dodatkowe dane (np. wiersze definiujące kodowanie).