[如何使用JavaMail将附加到电子邮件的文件转换为可持久的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.
我不认为这个问题是重复的。另一个问题特定于InputStream
,而该问题普遍适用于JavaMail
附件。
您的问题不在转换时,至少我已经测试了以下代码,并且对我来说很好用:
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
如果您确实在使用IMAP,请尝试添加以下属性:props.setProperty("mail.imap.partialfetch", "false");