Cześć
Chcę zrobić prostego klienta poczty który pobierze dane z serwera IMAP - w moim przypadku jest to gmail i zrobi kopie maili na dysku.
Z większością problemów już dałem sobie radę, ale...
gdy pobieram listę folderów poprzez ListMailBoxes (komponent TIdIMAP4) to gdy występują w ich nazwie polskie znaki dostaję śmieci kodowane w zmodyfikowanym UTF-7. Poniżej kilka przykładowych nazw... z tego co udało mi się wstępnie ustalić to problem leży po stronie
TIdMUTF7.Decode() z którego korzysta ListMailBoxes
podczas dekodowania pojawia się wyjątek 'US-ASCII char #%d in UTF7 sequence.' - obsłużony nieco wyżej przez try/except
Odpisa#7 - zamiast Odpisać
R&APMBfA-ne - zamiast Różne
Wa&AXw-ne - zamiast Ważne
Wa&AXw-ne/test - zamiast Ważne/test
Wys&AUI-ane - zamiast Wysłane
Używam Delphi 2010 i komponentów Indy
Jak to sensownie ruszyć? Może trzeba gdzieś tylko przestawić w którymś z komponentów. na tą chwilę nie zauważyłem takiej możliwości. Z góry dzięki za wszelkie sugestie...
Poniżej opis tego co mam... i ustawienia komponentów.
Na formatce jest memo i buttoon + 2 Komponenty Indy:
- TdIAMP4 - IMAPClient
Host := 'imap.gmail.com';
Port := 993;
Username := '....@gmail.com';
Password := '....';
IOHandler := IdSSLIOHandlerSocketOpenSSL1
UseTLS := utUseImplicitTLS;
- TIdSSLIOHandlerSocketOpenSSL1 - IdSSLIOHandlerSocketOpenSSL1
SSLOptions.Method := sslvSSLv3;
i fragment kodu podpięty na przycisk
procedure TfrmMain.BitBtn1Click(Sender: TObject);
var
res: Boolean;
UsersFolders: TStringList;
licznik:Integer;
begin
try
res := IMAPClient.Connect;
if not res then begin
memo1.Lines.Add( ' Unsuccessful connection.' );
exit;
end;
except
on e: Exception do begin
memo1.Lines.Add( ' Unsuccessful connection.' );
memo1.Lines.Add( ' (' + Trim( e.Message ) + ')' );
exit;
end;
end;
UsersFolders := TStringList.Create;
try
try
res := IMAPClient.ListMailBoxes( UsersFolders );
if not res then begin
memo1.Lines.Add( ' ListMailBoxes error.' );
exit
end;
except
on e: Exception do begin
memo1.Lines.Add( ' ListMailBoxes error.' );
memo1.Lines.Add( ' (' + Trim( e.Message ) + ')' );
exit;
end;
end;
UsersFolders.SaveToFile( 'folders.txt' );
for licznik := 0 to UsersFolders.Count - 1 do begin
memo1.Lines.Add( UsersFolders[licznik] );
end;
finally
FreeAndNil( UsersFolders );
end;
end;