2015-05-08 3 views
0

У меня есть сообщение электронной почты, который имеет contentType: TEXT/PLAIN; charset="=?utf-8?B?ICJVVEYtOCI=?="Извлечение MIME кодируются содержимого электронной почты с помощью JavaMail

Что мне нужно сделать extractContent, чтобы устранить java.io.UnsupportedEncodingException: =?utf-8?B?ICJVVEYtOCI=?=

Я попытался следующие:

import java.io.IOException; 
import javax.mail.BodyPart; 
import javax.mail.Message; 
import javax.mail.MessagingException; 
import javax.mail.internet.MimeMultipart; 

public class ExtractContentText 
{ 
    private static String extractContent(MimeMultipart mimeMultipartContent) throws MessagingException 
    { 
     String msgContentText = null; 

     Exception cause = null; 

     try 
     { 
      int numParts = mimeMultipartContent.getCount(); 

      for (int partNum = 0; msgContentText == null 
        && partNum < numParts; partNum++) 
      { 
       BodyPart part = mimeMultipartContent.getBodyPart(partNum); 
       System.out.println("BodyContent.PartNum: " 
         + partNum + " has contentType: " + part.getContentType()); 

       // TODO: Eliminate java.io.UnsupportedEncodingException: =?utf-8?B?ICJVVEYtOCI=?= 
       Object partContent = part.getContent(); 
       if (partContent instanceof MimeMultipart) 
       { 
        try 
        { 
         System.out.println("Processing inner MimeMultipart"); 
         msgContentText = extractContent((MimeMultipart) partContent); 
         System.out.println("Using content found in inner MimeMultipart"); 
        } 
        catch (MessagingException e) 
        { 
         System.out.println("Ignoring failure while trying to extract message content for inner MimeMultipart: " 
           + e.getMessage()); 
        } 
       } 
       else 
       { 
        try 
        { 
         msgContentText = (String) part.getContent(); 
         System.out.println("PartNum: " 
           + partNum + " content [" + msgContentText + "]"); 
        } 
        catch (ClassCastException e) 
        { 
         // If it is not a String, ignore the exception and continue looking 
         System.out.println("Ignoring Non-String message content: " 
           + e.getMessage()); 
        } 
       } 
      } 
     } 
     catch (MessagingException | IOException e) 
     { 
      cause = e; 
      System.out.println("Failure while trying to extract message content: " 
        + e.getMessage()); 
     } 
     finally 
     { 
      // Fail if content could not be extracted 
      if (msgContentText == null) 
      { 
       MessagingException ex; 
       if (cause == null) 
       { 
        ex = new MessagingException("Message content could not be extracted"); 
       } 
       else 
       { 
        ex = new MessagingException("Message content could not be extracted - " 
          + cause.getMessage(), cause); 
       } 
       System.out.println(ex); 
       throw ex; 
      } 
     } 

     return msgContentText; 
    } 

    public static void main(String[] args) throws MessagingException, IOException 
    { 
     Message m = null; 
     System.out.println(extractContent((MimeMultipart) m.getContent())); 
    } 
} 

ответ

1

См. Часто задаваемые вопросы по JavaMail: Why do I get the UnsupportedEncodingException when I invoke getContent() on a bodypart that contains text data? Вы можете использовать javax.mail.Part.getInputStream(), чтобы получить доступ к необработанным байтам и выполнить собственное декодирование.

Чтобы восстановить недопустимый заголовок типа контента, вы можете использовать javax.mail.internet.ContentType для извлечения параметра и использовать javax.mail.MimeUtility.decodeText для декодирования неструктурированных заголовков.

public static String cleanContentType(MimePart mp, String contentType) { 
    String ct = "TEXT/PLAIN; charset=\"=?utf-8?B?ICJVVEYtOCI=?=\""; 
    ContentType content = new ContentType(ct); 
    System.out.println(content.getBaseType()); 
    System.out.println(content.getParameter("charset")); 
    System.out.println(MimeUtility.decodeText(content.getParameter("charset"))); 
} 

В javax.mail.internet пакете есть список параметров, которые могут быть использованы для изменения некоторых поведения по умолчанию. Вы можете установить системное свойство mail.mime.parameters.strict на false, чтобы устранить некоторые из правил по типу контента. Вы также можете установить mail.mime.contenttypehandler, чтобы указать на полное имя класса, которое может устранить проблемы с типом контента. Пользовательский класс должен содержать метод следующую подпись:

public static String cleanContentType(MimePart mp, String contentType) { 
     try { 
      ContentType content = new ContentType(contentType); 
      String charset = MimeUtility.decodeText(content.getParameter("charset")); 
      charset = charset.replace("\"", ""); 
      content.setParameter("charset", charset); 
      return content.toString(); 
     } catch (MessagingException | UnsupportedEncodingException ex) { 
      return contentType; 
     } 
    } 
+0

Ваш код чистит тип содержимого, но я до сих пор не ясно, как я хотел бы использовать «UTF-8», чтобы получить содержание от моей «части» переменная. – bigleftie

+0

Обновлен ответ. Я думал, что если бы вы смогли отремонтировать этот заголовок, getContent, возможно, сработал бы для вас. – jmehrens

+1

И только чтобы быть ясным, заголовок, который вы просматриваете, является фиктивным и должен сообщаться человеку, который отправил сообщение и/или владельцу программы, создавшей сообщение. Кто-то взял имя кодировки (UTF-8), поместил туда двойные кавычки, поставил перед ним пробел и затем закодировал полученную строку с помощью utf-8, прежде чем устанавливать его как значение параметра charset в заголовке , Argh! Он должен был просто указать charset = «UTF-8». –

Смежные вопросы