8

从邮件服务器读取带有附件文件的邮件时,我不知道为什么会出现以下异常:

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<n; i++) {
      handlePart(multipart.getBodyPart(i));
    }
  }
  public static void handlePart(Part part) 
      throws MessagingException, IOException {
    String disposition = part.getDisposition();
    System.out.println("Disposition "+disposition);
    String contentType = part.getContentType();
    System.out.println("contentType "+contentType);
    if (disposition == null) { // When just body
      System.out.println("Null: "  + contentType);
      // Check if plain
      if ((contentType.length() >= 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();
  }
}
4

2 回答 2

10

我刚刚遇到了同样的问题。边界在 Multipart Content-Type 中指定。您可以在此来源中找到更多信息。getContentType()您还可以使用该功能观看当前消息之一。就我而言,我得到了这个结果:

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

所以该getCount()函数使用这个边界来分隔组成多个部分的所有部分。看起来可能存在此边界已损坏的情况。

mail.mime.multipart.ignoreexistingboundaryparameter 系统属性可以设置为 true 以导致忽略任何边界,而是像使用 mail.mime.multipart.ignoremissingboundary 参数一样在消息中搜索边界线。

我按照此说明进行操作,一切正常。我添加了以下代码:

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

希望能帮助到你!

于 2011-01-05T14:00:30.210 回答
0

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

于 2016-03-10T21:40:18.193 回答