使用附件文件读取邮件时缺少启动边界exception

我不知道为什么当从邮件服务器读取带有附件文件的邮件时,我收到以下exception:

Exception in thread "main" javax.mail.MessagingException: Missing start boundary at javax.mail.internet.MimeMultipart.parsebm<MimeMultipart.java:872) at javax.mail.internet.MimeMultipart.parse<MimeMultipart.java:493) at javax.mail.internet.MimeMultipart.getCount<MimeMultipart.java:240) at GetParts.handleMultipart(GetParts.java:57) at GetParts.main(GetParts.java:42) 

我用来读取这些消息的文件是:

 import java.io.*; import java.util.Properties; import javax.mail.*; import javax.mail.internet.*; public class GetParts { public static void main (String args[]) throws Exception { String host = args[0]; String username = args[1]; String password = args[2]; // Get session Properties props=new Properties(); props.put("mail.mime.multipart.ignoremissingboundaryparamete",true); Session session = Session.getInstance( props, null); ContentType ct=new ContentType(); // Get the store Store store = session.getStore("pop3"); store.connect(host, username, password); // Get folder Folder folder = store.getFolder("INBOX"); folder.open(Folder.READ_ONLY); BufferedReader reader = new BufferedReader ( new InputStreamReader(System.in)); // Get directory Message message[] = folder.getMessages(); for (int i=0, n=message.length; i<n; i++) { System.out.println(i + ": " + message[i].getFrom()[0] + "\t" + message[i].getSubject()); //message[i].setHeader("Content-Type","multipart/mixed"); System.out.println("Do you want to get the content? [YES to read/QUIT to end]"); String line = reader.readLine(); if ("YES".equals(line)) { Object content = message[i].getContent(); if (content instanceof Multipart) { handleMultipart((Multipart)content); } else { handlePart(message[i]); } } else if ("QUIT".equals(line)) { break; } } // Close connection folder.close(false); store.close(); } public static void handleMultipart(Multipart multipart) throws MessagingException, IOException { System.out.println(multipart.getCount()); for (int i=0, n=multipart.getCount(); i= 10) && (contentType.toLowerCase().substring( 0, 10).equals("text/plain"))) { part.writeTo(System.out); } else { // Don't think this will happen System.out.println("Other body: " + contentType); part.writeTo(System.out); } } else if (disposition.equalsIgnoreCase(Part.ATTACHMENT)) { System.out.println("Attachment: " + part.getFileName() + " : " + contentType); saveFile(part.getFileName(), part.getInputStream()); } else if (disposition.equalsIgnoreCase(Part.INLINE)) { System.out.println("Inline: " + part.getFileName() + " : " + contentType); saveFile(part.getFileName(), part.getInputStream()); } else { // Should never happen System.out.println("Other: " + disposition); } } public static void saveFile(String filename, InputStream input) throws IOException { if (filename == null) { filename = File.createTempFile("xx", ".out").getName(); } // Do no overwrite existing file File file = new File(filename); for (int i=0; file.exists(); i++) { file = new File(filename+i); } FileOutputStream fos = new FileOutputStream(file); BufferedOutputStream bos = new BufferedOutputStream(fos); BufferedInputStream bis = new BufferedInputStream(input); int aByte; while ((aByte = bis.read()) != -1) { bos.write(aByte); } bos.flush(); bos.close(); bis.close(); } } 

我刚遇到同样的问题。 边界在Multipart Content-Type中指定。 您可以在此来源中找到更多信息。 您还可以使用getContentType()函数查看当前消息之一。 在我的情况下,我得到了这个结果:

 multipart/mixed; boundary=--boundary_25_2d74d02b-d0d6-4f28-a311-4d1b7d107417 

因此getCount()函数使用此边界来分隔组成多个部分的所有部分。 看起来可能存在此边界被破坏的情况。

mail.mime.multipart.ignoreexistingboundary参数System属性可以设置为true以使任何边界被忽略,而是在mail.mime.multipart.ignoremissingboundaryparameter中搜索消息中的边界线。

我遵循了这些指示,一切正常。 我添加了以下代码:

 System.setProperty("mail.mime.multipart.ignoreexistingboundaryparameter", "true"); 

希望能帮助到你!

尝试在multipartEntityBuilder ex上设置模式:multipartEntityBuilder.setMode(HttpMultipartMode.RFC6532);