Какой тип для part.getContent в JavaMail под другой ОС? - PullRequest
2 голосов
/ 13 августа 2011

Я использую JavaMail для получения почты.Сначала я занимаюсь разработкой под Mac OS X. Пример, который я нашел из Интернета, выглядит следующим образом:

public void getMailContent(Part part) throws Exception {   
        String contenttype = part.getContentType();   
        int nameindex = contenttype.indexOf("name");   
        boolean conname = false;   
        if (nameindex != -1)   
            conname = true;   
        System.out.println("CONTENTTYPE: " + contenttype);   
        if (part.isMimeType("text/plain") && !conname) {   
            bodytext.append((String) part.getContent());   
        } else if (part.isMimeType("text/html") && !conname) {   
            bodytext.append((String) part.getContent());   
        } else if (part.isMimeType("multipart/*")) {   
            Multipart multipart = (Multipart) part.getContent();   
            int counts = multipart.getCount();   
            for (int i = 0; i < counts; i++) {   
                getMailContent(multipart.getBodyPart(i));   
            }   
        } else if (part.isMimeType("message/rfc822")) {   
            getMailContent((Part) part.getContent());   
        } else {}   
    }

Но я обнаружил, что это не работает. Возвращаемое значение является расширением InputStream.Поэтому я использую это для решения проблемы.

InputStreamReader isr = new InputStreamReader((InputStream) part.getContent(), language);
BufferedReader br = new BufferedReader(isr);
String line = null;
StringBuilder sb = new StringBuilder();
while ((line = br.readLine()) != null) {
    sb.append(line).append("\n");
 }
result = MimeUtility.decodeText(sb.toString());

Но недавно я получил новый компьютер и запустил код выше под Windows 7, он также не работает. Исключением является java.lang.String cannot be cast to java.io.InputStream.part.getContent () возвращает строку в качестве примера в интернете.

Я просто не знаю причину. И как правильно работать на Mac и Windows или любым способом, чтобы избежать этой проблемы и получитьсодержание части.

Спасибо.

Ответы [ 3 ]

0 голосов
/ 17 августа 2011

Я решил собственную проблему с помощью instanceof, хотя до сих пор не знаю, почему это работает.

0 голосов
/ 31 марта 2013

Я столкнулся с той же проблемой, нашел причину (хотя, я полагаю, это не обязательно единственная причина, которая может привести к проблеме) и исправил ее, поэтому я решил опубликовать решение.

В моем случае я создавал приложение для Android. В Android некоторые классы отсутствуют в пакете javax.security, поэтому использовался вспомогательный пакет asmack , а библиотека JavaMail была построена из исходных кодов.

Проблема была в том, что я не упаковал необходимые ресурсы в javamail jar. В частности, следующие файлы должны быть упакованы при экспорте jar:

  • dsn.mf
  • javamail.charset.map
  • javamail.default.address.map
  • javamail.default.providers
  • javamail.imap.provider
  • javamail.pop3.provider
  • javamail.smtp.address.map
  • javamail.smtp.provider
  • mailcap

После исправления я получаю правильно декодированный контент только методом getContent. Подсказка была найдена на этой странице .

0 голосов
/ 13 августа 2011
Scanner sc=new Scanner(contenttype);
    while(sc.hasNext()){
        sc.next();
    }

используйте этот кусок кода ..... измените его в соответствии с вашими потребностями .... и вам не нужно выполнять приведение типов.

...