Polskie znaki w treści meila JavaMail

0

Nadal mam problem z polskimi znakami w JavaMail, nie wyświetlaja sie ;/ w temacie meila jest ok problem jest z treścią.

Taki o kod:

Pobieranie:

public void receive(String popServer, String popUser, String popPassword)
  {
    Store store=null;
    Folder folder=null;
    try
        {
         String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory";
         Properties pop3Props = new Properties();
         pop3Props.setProperty("mail.pop3.socketFactory.class", SSL_FACTORY);
         pop3Props.setProperty("mail.pop3.socketFactory.fallback", "false");
         pop3Props.setProperty("mail.pop3.port",  port_pop);
         pop3Props.setProperty("mail.pop3.socketFactory.port", port_pop);
         pop3Props.setProperty("mail.pop3.charset", "UTF-8" );
       
         URLName url = new URLName(typ_serwera_przychodzacego, serwer_pop, Integer.valueOf(port_pop), "",login, haslo);
         Session  session = Session.getInstance(pop3Props, null);
         store = new POP3SSLStore(session, url);
         store.connect();
         folder = store.getDefaultFolder();
         if (folder == null) throw new Exception("No default folder");
         folder = folder.getFolder("INBOX");
         if (folder == null) throw new Exception("No POP3 INBOX");
         folder.open(Folder.READ_WRITE);
         Message[] msgs = folder.getMessages();

        for (int msgNum = 0; msgNum < msgs.length; msgNum++)
         {
          printMessage(msgs[msgNum]);
          licznik_meili++;
          msgs[msgNum].setFlag(Flags.Flag.DELETED, true);
         }

      folder.close(true);

    } catch (Exception ex) { ex.printStackTrace(); }
    finally
    {
      try {if (store!=null) store.close();}
      catch (Exception ex2) {ex2.printStackTrace();}
    }
  }

Wyświetlanie:

      String from=((InternetAddress)message.getFrom()[0]).getPersonal();
      if (from==null) from=((InternetAddress)message.getFrom()[0]).getAddress();
      String od_kogo_nazwisko=from;
      String temat=message.getSubject();
      String data_wyslania=String.valueOf(message.getSentDate());
      meil=((InternetAddress)message.getFrom()[0]).getAddress().toString();//<- Tutaj pobiera adres
      //Wiadomosc w czesciach
      Part messagePart=message;
      Object content=messagePart.getContent();
      if (content instanceof Multipart)
      {
        messagePart=((Multipart)content).getBodyPart(0);
      }
      
      String contentType=messagePart.getContentType();      
      
      String zawartosc="";
      if (contentType.startsWith("text/plain")||contentType.startsWith("text/html"))
      {
        InputStream is = messagePart.getInputStream();
        BufferedReader reader=new BufferedReader(new InputStreamReader(is));
        String thisLine=reader.readLine();
        while (thisLine!=null)
        {
          zawartosc=zawartosc+thisLine;
          thisLine=reader.readLine();         
        }
      }
      System.out.println(zawartosc);

No i w wyniku teść meila czyli zmienna zawartość drukuje sie bez polskich znaków ;/ kombinowałem coś z message.setContent(message,"text/plain; charset=UTF-8"); ale kicha nic mi nie wyszło ;/ Męczę sie z tym juz kilka godzin i brak mi pomysłu i wiedzy jak to pokonać. Prosze o jakąś rade

0

Wydaje mi sie ze tutaj moze byc problem (drugi fragment):

InputStream is = messagePart.getInputStream();
BufferedReader reader=new BufferedReader(new InputStreamReader(is));

new InputStreamReader() domyslnie uzywa kodowania danej platformy, wiec np pod win xp jest to zdaje sie cp1252 czy cos podobnego. Jesli tekst jest w rzeczywiscosci kodowany UTF8 to beda fifole.
Na slepo rowniez nie powinienes uzywac UTF8 bo nie zawsze w takim kodowaniu ten mail bedzie. Masz linijke gdzie sprawdzacz czy content-type zaczyna sie na text/plain czy html, wiec dalej powinno byc kodowanie. Jesli jest, uzyj tego jakos parametr do InputStreamReadera.

W kodzie na pobieranie masz:
pop3Props.setProperty("mail.pop3.charset", "UTF-8" );
nie wiem co to robi, zakladam ze ustawia jakies domyslne kodowanie czy cos. Co natomiast wiem to to, ze nigdy nie mozesz byc pewny ze dany mail jest w utf8, chyba ze jedyne maile sa od Twojego programu, ktory tylko tak je wysyla. Zatem, mozesz sobie ustawic ten UTF8, ale odczytujac maila powinienes sie postarac i wysilic jak najbardziej i sprawdzic jego kodowanie, i go uzyc. Dopiero jak nie ma jawnej deklaracji to uzywaj jakiegos fallbacka - nic nie zrobisz raczej przeciw krzakom (ok, mozesz sciagnac sobie liba, np mozilli czy ibm, do zgadywania kodowan, ale to tez ma wady i nie masz kontroli), ale to nie wina Twojego programu czytajacego, tylko jakiegos wysylajacego.

Przy wysylaniu maila, jesli sam to robisz aby testowac, upewnij sie ze deklarowane kodowanie jest zgodne z tym ktore jest faktycznie uzyte. Pewnie to jest automatyczne (jak np w servletach, ustawiasz kodowanie na utf8 i servlet sam wie ze ma go uzyc, nie musisz sam zamieniac stringow na bajty w danym kodowaniu i wysylac), ale nie wiem do konca, musisalbyc sprawdzic.

0

A nie można jakoś przekonwertować odebranej wiadomośc np na UTF8?

0

Np tak:

BufferedReader reader=new BufferedReader(new InputStreamReader(is,"UTF-8"));

Wieczorame przetestuje i dam znać.

0

Działą ale z innym kodowaniem:

BufferedReader reader=new BufferedReader(new InputStreamReader(is,"ISO-8859-2"));

Może komuś sie przyda ;) Pozdrawiam

0

No to teraz wyslij maila zakodowanego w utf8 i juz nie zadziala. Napisalem przeciez ze musisz odczytywac kodowanie z naglowkow. Ehh...

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