使用附件文件读取邮件时缺少启动边界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);
- 引起:java.lang.NoClassDefFoundError:当tomcat / lib下存在类时?
- 序列化JFrame并通过网络发送
- Java:catch的意义(最终的SomeException e)?
- iText Java签名PDF DocumentException:空间不足
- JVM如何保证finally块的执行?
- 三层架构和例外
- 如何在InputMismatchException之后重试输入?
- Java NoSuchAlgorithmException – SunJSSE,sun.security.ssl.SSLContextImpl $ DefaultSSLContext
- Scala期货和`andThen`exception传播