Okazało się, że p.getInputStream() blokował z powodu sposobu w jaki łączyłem się ze skrzynką:
store = session.getStore("imaps");
store.connect();
folder.add( (IMAPFolder)store.getFolder("INBOX") );
a w ustawieniach podawałem:
props.setProperty("mail.imaps.partialfetch", "false");
czyli wyłączone było pobieranie kawałek po kawałku.
Gdy zamiast tego łączę się w ten sposób:
folder.add( (IMAPFolder) session.getFolder(server) );
p.getInputStream() już nie blokuje i można zrobić prawidłowe paski postępu :)
Ale pojawił się pewien problem - po ściągnięciu 73% pliku pojawią się błąd:
BASE64Decoder: Error in encoded stream: needed 4 valid base64 characters but only got 1 before EOF, the 10 most recent characters were: "DUp09Nn/Xd"
Wydaje mi się, że dobre wyjaśnienie jest tutaj: http://stackoverflow.com/a/5292975/909539.
Błąd jest właśnie przez to, że pobieranie załącznika jest teraz wykonywanie kawałek po kawałku, a niektóre serwery IMAP nie mają prawidłowo zaimplementowanego takiego pobierania kawałek po kawałku.
Żeby to obejść trzeba wrócić chyba niestety do tego, czego korzystałem do tej pory, czyli:
store = session.getStore("imaps");
store.connect();
folder.add( (IMAPFolder)store.getFolder("INBOX") );
oraz ustawić, żeby załącznik nie był pobierany w częściach:
props.setProperty("mail.imaps.partialfetch", "false");
wtedy nie ma już tego błędu.
Szkoda, bo te paski postępu by mi się przydały :) Chyba, że jest jakiś inny sposób? Jedyne co mi przychodzi do głowy, to poszperać w kodzie źródłowym tej metody getInputStream() i może tam by się udało dotrzeć do aktualnego rozmiaru ściąganego załącznika?
Antoniossss, zmienna p jest tworzona w ten sposób:
Object content = message.getContent();
if(content instanceof Multipart){
Multipart mp = (Multipart) content;
int count = mp.getCount();
for(int k=0;k<count;k++){
Part p = mp.getBodyPart(k);
........
Antoniossss, dodanie getDataHandler():
part.getDataHandler().getInputStream();
nic nie zmieniło.