2014-07-22 3 views
1

그래서 Apache Camel을 처음 사용합니다. 나는이 코드의 대부분이 아마도 가장 효율적인 방법은 아님을 알고 있지만 아파치 Camel을 사용하여 내 Gmail에 액세스하고 새 메시지를 잡고 첨부 파일에 첨부 파일을 지정된 디렉토리에 저장하는 코드를 만들었습니다. 내 경로는 본문 데이터를 해당 디렉토리의 파일로 저장합니다. DataHandler가 getContent() 메서드를 사용하려고 할 때마다 파일을 저장하거나 System.out에 본문을 인쇄하려고 할 때마다 FolderClosedIOException 또는 FolderClosed Exception이 발생합니다. 나는 그것을 고치는 법을 모른다. catch는 폴더를 다시 열지 만 다른 메시지를받은 후에 다시 닫힙니다. 무슨 잘못FolderClosedIOException을 해결하는 방법은 무엇입니까?

import org.apache.camel.*; 
import java.io.*; 
import java.util.*; 
import javax.activation.DataHandler; 
import javax.mail.Folder; 
import org.apache.camel.builder.RouteBuilder; 
import org.apache.camel.impl.DefaultCamelContext; 
import com.sun.mail.util.FolderClosedIOException; 

public class Imap { 
    public static void main(String[] args) throws Exception { 


     CamelContext context = new DefaultCamelContext(); 
     context.addRoutes(new RouteBuilder() { 
      public void configure() { 
       from("imaps://imap.gmail.com?username=********@gmail.com&password=******" 
        + "&debugMode=false&closeFolder=false&mapMailMessage=false" 
        + "&connectionTimeout=0").to("file:\\EMAIL"); 
      } 
     }); 

     Map<String,String> props = new HashMap<String,String>(); 
     props.put("mail.imap.socketFactory.class","javax.net.ssl.SSLSocketFactory"); 
     props.put("mail.imap.auth", "true"); 
     props.put("mail.imap.host","imap.gmail.com"); 
     props.put("mail.store.protocol", "imaps"); 

     context.setProperties(props); 
     Folder inbox = null; 
     ConsumerTemplate template = context.createConsumerTemplate(); 
     context.start(); 

     while(true) { 
      try { 
       Exchange e = template.receive("imaps://imap.gmail.com?username=*********@gmail.com&password=***********", 60000); 
       if(e == null) break; 

       Message m = e.getIn(); 

       Map<String, Object> s = m.getHeaders(); 
       Iterator it = s.entrySet().iterator(); 
       while(it.hasNext()) { 
        Map.Entry pairs = (Map.Entry)it.next(); 
        System.out.println(pairs.getKey()+" === "+pairs.getValue()+"\n\n"); 
        it.remove(); 
       } 
       if(m.hasAttachments()) { 
        Map<String,DataHandler> att = m.getAttachments(); 
        for(String s1 : att.keySet()) { 
         DataHandler dh = att.get(s1); 
         String filename = dh.getName(); 
         ByteArrayOutputStream o = new ByteArrayOutputStream(); 
         dh.writeTo(o); 
         byte[] by = o.toByteArray(); 
         FileOutputStream out = new FileOutputStream("C:/EMAIL/"+filename); 
         out.write(by); 
         out.flush(); 
         out.close(); 


        } 
       } 

      } catch(FolderClosedIOException ex) { 
       inbox = ex.getFolder(); 
       inbox.open(Folder.READ_ONLY); 
      } 
     } 

     context.stop(); 




    } 

}

은 누군가 가르쳐주세요!

이 오류는 여기서 발생합니다

dh.writeTo(o); 
+0

안녕하세요,이 솔루션을 찾으셨습니까? 정확하게 똑같은 문제를 다루고 있으며 똑같은 오류가 발생했습니다. –

답변

0

우리는 akka - 낙타에서 비슷한 문제를 해결하고 있었다

내가 믿는이 솔루션은 수동 승인을 사용하고 우리가 함께 할 한 후 승인을 보낼 수 있었다 메시지.

관련 문제