2015-01-14 5 views
-3

ПРИМЕЧАНИЕ: Этот вопрос НЕ является DUPLICATE. Другой вопрос относится к InputStream, в то время как этот вопрос является общим для JavaMail вложений. Два ОЧЕНЬ различные вопросы. Удалите флаг.Преобразование приложения JavaMail в blob?

Вот этот вопрос:
Как использовать javamail преобразовать файл, вложенный в сообщение электронной почты в persistable java.sql.blob? В моем коде попытка ниже, eclipse отладчик и SYSO команд определить, что действительно есть xml вложение, которое делает извергаются как InputStream, но все же blob и content переменные остаются пустыми, несмотря на попытки Кодекса о передаче в InputStream в них. Что я могу изменить для правильной передачи InputStream в формат blob?

 for(int y=1;y<=msg_count;y++){ 
      Message msg = inbox.getMessage(y); 
      System.out.println("msg# is: "+y); 
      Address[] in = msg.getFrom(); 
      for (Address address : in) {System.out.println("FROM:" + address.toString());} 
      System.out.println("SENT DATE:" + msg.getSentDate());System.out.println("SUBJECT:" + msg.getSubject()); 
      if(msg.getContent() instanceof String){System.out.println("msg.getContent()(String!) is: "+msg.getContent());} 
      if(msg.getContent() instanceof Multipart){ 
       Multipart mp = (Multipart) msg.getContent(); 
       for(int a=0;a<mp.getCount();a++){ 
        BodyPart bp = mp.getBodyPart(a); 
        System.out.println("a, FILENAME (Multipart!) are: " +a+", "+ bp.getFileName()); 
        System.out.println("a, CONTENTTYPE (Multipart!) are: "+a+", "+bp.getContentType()); 
        if(bp.getFileName()!=null){ 
         if(bp.getFileName().endsWith(".xml")){ 
          System.out.println("a, CONTENT, class.name (Multipart!) are: " +a+", "+ bp.getContent()+", "+bp.getClass().getName()); 
          if(bp.getContent() instanceof InputStream){ 
           InputStream myis = (InputStream)bp.getContent(); 
           DocumentPreImport docpre = new DocumentPreImport(); 
           SomeDocument cd = mf.unmarshal(new StreamSource(myis), schemaFile); 
           docpre.setDocTitle(cd.getTitle()); 
           List<IItempId> ids = cd.getTemplateId(); 
           for(int u=0;u<ids.size();u++){docpre.setDocTemplateId(ids.get(0).getRoot());} 
           PatientRole pr = cd.getRecordTarget().get(0).getPatientRole(); 
           docpre.setPatientRoleRoot(pr.getId().get(0).getRoot()); 
           docpre.setPatientRoleExtension(pr.getId().get(0).getExtension()); 
           Blob blob = null; 
           byte[] content = IOUtils.toByteArray(myis); 
           try { 
            blob = new SerialBlob(content); 
            docpre.setContent(blob); 
           } 
           catch (SerialException e) {e.printStackTrace();} 
           catch (SQLException e) {e.printStackTrace();} 
           docpre.setSourceEmailAddress(msg.getFrom()[0].toString()); 
           docpre.setMsgSentDate(msg.getSentDate().toString()); 
           docpre.setMsgSubject(msg.getSubject()); 
           docpre.setImported(false); 
           this.clinicService.saveDocPreImport(docpre); 
          } 
         } 
        } 
       } 
      } 
      msg.setFlag(Flags.Flag.DELETED, true);//flags this message as deleted, which does not yet fully expunge it from server 
     } 
     inbox.close(true);//expunges from server all the messages which were flagged as deleted. this line is required to actually delete. 
+0

@EJP Этот вопрос не является дубликатом. Удалите свой флаг. Другой вопрос специфичен для входного потока. Этот вопрос является общим для приложений JavaMail. Два очень разных вопроса. Пожалуйста, ответьте с подтверждением, что вы соответствующим образом удалили свой флаг. И, пожалуйста, ответьте на вопрос, если у вас есть ответ. – CodeMed

ответ

0

Ваша проблема не при преобразовании, по крайней мере, я тестировал следующий код и он отлично работает для меня:

BodyPart bp = mp.getBodyPart(i); 
InputStream stream = (InputStream)bp.getInputStream(); 
byte[] content = IOUtils.toByteArray(stream); //content.length shows correct length 
Blob blob = null; 
blob = new SerialBlob(content); // blob.length() shows correct length 

Взгляните: Why does JavaMail BodyPart.getInputStream() return an empty stream when using IMAP, but not when using POP3?

Если вы действительно используя IMAP, попробуйте добавить следующее свойство: props.setProperty("mail.imap.partialfetch", "false");

+0

Это не отвечает на мой вопрос. В нем просто говорится, что у вас что-то работает в вашей конфигурации, не объясняя, что делает вашу конфигурацию отличной от моей. Я попробовал 'props.setProperty (« mail.imap.partialfetch »,« false »);' и изменил 'bp.getContent()' на 'bp.getInputStream()'. Отладчик все время говорил, что у входного потока есть вещи, поэтому это другая проблема, чем ссылка, которую вы дали. Я благодарен, что вы потратили время на это. Спасибо. Но, пожалуйста, поймите, что я постоянно задаю новые вопросы, если корень вопроса не решен – CodeMed

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