2012-11-22 10 views
7

Mój problem wygląda następująco:Pobieranie wiadomości e-mail zawierającej obrazy w wierszu w java

Mam konfigurację Mój kod do czytania wiadomości e-mail z określonego konta. Ta część działa idealnie.

Problem dotyczy parsowania wiadomości e-mail. Rozdzielanie załączników i treści wiadomości e-mail (zawierających obrazy wstawiane).

Mój kod wygląda tak:

Void readMessages(Folder folder){ 

      Message[] messages = folder.getMessages(); 
      // loading of message objects. 
       for (int messageNumber = 0; messageNumber < messages.length; messageNumber++) { 

      final Message currentMessage = messages[messageNumber]; 
       logger.info("Handling the mail with subject " + currentMessage.getSubject()); 
       logger.info("Content type for the current message is " +         currentMessage.getContentType()); 
       final String messageFileName = currentMessage.getFileName(); 
       logger.info("File name for the message " + messageFileName + ". File name is blank " 
               +      StringUtils.isBlank(messageFileName)); 


         Object messageContentObject = currentMessage.getContent(); 
         if (messageContentObject instanceof Multipart) { 
          Multipart multipart = (Multipart) messageContentObject; 

          // downloading all attachments.... 
          int attachmentCount = multipart.getCount(); 
          logger.info("Number of attachments "); 
          for (int i = 0; i < attachmentCount; i++) { 
           Part part = (Part) multipart.getBodyPart(i); 
           downloadAttachment(part, folderPath.toString()); 
          } 

         } 

        } 
       } 
      } 
     private void downloadAttachment(Part part, String folderPath) throws Exception { 
    String disPosition = part.getDisposition(); 
    String fileName = part.getFileName(); 
    String decodedText = null; 
    logger.info("Disposition type :: " + disPosition); 
    logger.info("Attached File Name :: " + fileName); 

    if (disPosition != null && disPosition.equalsIgnoreCase(Part.ATTACHMENT)) { 
     logger.info("DisPosition is ATTACHMENT type."); 
     File file = new File(folderPath + File.separator + decodedText); 
     file.getParentFile().mkdirs(); 
     saveEmailAttachment(file, part); 
    } else if (fileName != null && disPosition == null) { 
     logger.info("DisPosition is Null type but file name is valid. Possibly inline attchment"); 
     File file = new File(folderPath + File.separator + decodedText); 
     file.getParentFile().mkdirs(); 
     saveEmailAttachment(file, part); 
    } else if (fileName == null && disPosition == null) { 
     logger.info("DisPosition is Null type but file name is null. It is email body."); 
     File file = new File(folderPath + File.separator + "mail.html"); 
     file.getParentFile().mkdirs(); 
     saveEmailAttachment(file, part); 
    } 


} 
    protected int saveEmailAttachment(File saveFile, Part part) throws Exception { 

    BufferedOutputStream bos = null; 
    InputStream is = null; 
    int ret = 0, count = 0; 
    try { 
     bos = new BufferedOutputStream(new FileOutputStream(saveFile)); 
     part.writeTo(new FileOutputStream(saveFile)); 

    } finally { 
     try { 
      if (bos != null) { 
       bos.close(); 
      } 
      if (is != null) { 
       is.close(); 
      } 
     } catch (IOException ioe) { 
      logger.error("Error while closing the stream.", ioe); 
     } 
    } 
    return count; 
} 

Problem I get to kiedy uruchomić ten kod, otrzymuję plik HTML ale obrazy inline otrzymuje znak błędu obrazu, który wskazuje obraz z brak źródła.

Proszę mi pomóc. Daj mi znać, jeśli potrzebujesz więcej informacji.

Próbowałem też oszczędność ciało jako plik .eml zmieniając:

File file = new File(folderPath + File.separator + "mail.html"); 

do

File file = new File(folderPath + File.separator + "mail.eml"); 

ale mam takie same wyniki.

+0

"..przez znak dla obrazu błędu, który wskazuje obraz bez źródła." Czy na pewno źródło jest puste? Czy sprawdziłeś źródło HTML? – Janoz

+0

Sprawdź ten plik HTML. https://www.dropbox.com/s/5evk4pjq721yo8m/mail.html – GSG

+0

Ten kod HTML pokazuje brakujące źródło obrazu. – GSG

Odpowiedz

1

Napisałem poniższy kod, aby przekonwertować treść wiadomości e-mail na format PDF, w tym obrazy wstawione. w kodzie i zastąpiłem kod obrazu (np: cid: [email protected]) ze ścieżką do pobrania obrazu. Buduję "hashmap" dla klucza obrazu i ścieżki pobierania podczas pobierania obrazu.

HTMLWorker htmlWorker = new HTMLWorker(document); 
      if(bodyStr!=null) 
      { 

       //find inline images 
       inlineImages=downloadInLineImage(mostRecentMatch, dynamicOutputDirectory); 
       if(inlineImages!=null) 
       { 

        for (Map.Entry<String, String> entry : inlineImages.entrySet()) { 
         //System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue()); 
         bodyStr=bodyStr.replaceAll("cid:"+entry.getKey() , entry.getValue()); 
        } 
       } 
       htmlWorker.parse(new StringReader(bodyStr)); 

     } 

Pobierz obraz w wierszu z przekazaniem przedmiotu.

private HashMap<String,String> downloadInLineImage(Item item, String dynamicOutputDirectory) 
     throws Exception, ServiceLocalException { 
    //create output directory if not present 

     //bind the item to a new email message. if you do not bind, then the getHasAttachments() function will fail 
    EmailMessage mostRecentMatch = (EmailMessage)item; 
    String from = mostRecentMatch.getFrom().getAddress(); 
    String user =StringUtils.substringBefore(from, "@"); 
    AttachmentCollection collection=item.getAttachments(); 

    HashMap<String,String> inlineFiles=new HashMap<String,String>(); 

    if(collection.getCount()>0) 
    { 
     for (Attachment attachment : collection.getItems()) { 

      if(attachment.getIsInline()) 
      { 

       FileAttachment currentFile = (FileAttachment) attachment; 
       String filePath=dynamicOutputDirectory+"/"+user+currentFile.getName(); 
       File file=new File(filePath); 
       FileOutputStream fio=new FileOutputStream(file); 
       currentFile.load(fio); 
       inlineFiles.put(currentFile.getContentId(), filePath); 
       fio.close(); 
      } 
     } 
    } 
1

Odwołania do wstawionych obrazów są zastępowane przez cid: URNs takich jak <img src="cid:SOMEID">, ponieważ w wiadomościach e-mail nie ma żadnych nazw plików. SOMEID odnosi się do Content-ID wieloczęściowych "obiektów".

Aby to działało, należy przechowywać załączniki wieloczęściowe w plikach (np. Nazwy tymczasowe) i zastępować URN cid przez rzeczywiste nazwy plików.

+0

Oczywiście! Spróbuję tego. – GSG

+0

Jak to jest możliwe, mam ten sam problem. Mam pobrany obraz w wierszu z powodzeniem, ale nie mogę odpowiedzieć src: cid z moją oryginalną ścieżką proszę podać mi rozwiązanie, jeśli to możliwe i tak szybko, jak to możliwe. –

+0

Nie działa również dla mnie. Nadal szukam wyjścia. – GSG

Powiązane problemy