Prosty klient Imap w Delphi

0

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:

  1. TdIAMP4 - IMAPClient
    Host := 'imap.gmail.com';
    Port := 993;
    Username := '[email protected]';
    Password := '....';
    IOHandler :=  IdSSLIOHandlerSocketOpenSSL1
    UseTLS := utUseImplicitTLS;
  1. 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;
0

Dołożyłem fragment kodu, może to coś wyjaśni, a przynajmniej będzie prościej

0

To wina Indy, zaktualizuj Indy http://www.indyproject.org/sockets/download/svn.en.aspx z SVN lub ZIP z http://indy.fulgan.com/ZIP/ i powinno być ok. Z Delphi XE5 (nie wiem w której najstarszej) instalowana jest już wersja której nie trzeba aktualizować i wszystko działa jak powinno natomiast w Delphi 7 miałem wersję 10.1.5 (dawno nie aktualizowałem bo oryginalnie jest 9.x) i był ten sam problem dzisiaj zaktualizowałem do 10.6.0.5073 (ze źródła ZIP do którego dałem link i nie ma co się przejmować że plik nazywa się Indy10_5073.zip) wszystko działa bez problemu :)

0 użytkowników online, w tym zalogowanych: 0, gości: 0