无法使用JavaMail下载PDF附件和java

时间:2012-01-19 11:00:58

标签: java pdf imap javamail email-attachments

我正在使用JavaMail API创建电子邮件客户端。一切正常,就像我能够连接到邮件服务器(使用IMAP),删除邮件,检索收到的邮件并将其显示给用户等。

现在出现了下载“PDF附件”的问题。 PDF文件没有完全下载...它缺少一些包含。

如果我使用IE或任何其他网络浏览器下载附件时某些PDF附件的大小为38 Kb,但是当我使用我的java代码下载它时它的大小为37.3 Kb。它不完整 因此,当我尝试使用Adobe Reader打开它时,它会显示错误消息“文件已损坏......”

以下是我编写的用于下载附件的代码:

public boolean saveFile(String filename,Part part) throws IOException, MessagingException {
    boolean ren = true;
    FileOutputStream fos = null;
    BufferedInputStream fin = null;
    InputStream input = part.getInputStream();

    File pdffile = new File("d:/"+filename);
    try{
        if(!pdffile.exists()){
            fos = new FileOutputStream(pdffile);
            fin = new BufferedInputStream(input);
            int size = 512;
            byte[] buf = new byte[size];
            int len;

            while ( (len = fin.read(buf)) != -1 ) {
                fos.write(buf, 0, len);
            }

            input.close();
            fos.close();
        }else{
            System.out.println("File already exists");
        }
    }catch(Exception e ){
        ren = false;
    }
    return ren;
 }

我错过了什么吗?任何有用的帮助表示赞赏。

2 个答案:

答案 0 :(得分:4)

花了几个小时才最终弄清楚了。

props.setProperty("mail.imaps.partialfetch", "false");

为我做了。与上面的@Shantanu几乎相同,但因为我正在使用

store = session.getStore("imaps");

我也需要使用“imap s ”进行偏取。

像魅力一样。

以下完整代码:

// Load mail properties
Properties mailProperties = System.getProperties();
mailProperties.put("mail.mime.base64.ignoreerrors", "true");
mailProperties.put("mail.imaps.partialfetch", "false");

// Connect to Gmail
Session session = Session.getInstance(mailProperties, null);
store = session.getStore("imaps");
store.connect("imap.gmail.com", -1, "username", "password");

// Access label folder
Folder defaultFolder = store.getDefaultFolder();
Folder labelFolder = defaultFolder.getFolder("mylabel");
labelFolder.open(Folder.READ_WRITE);

Message[] messages = labelFolder.getMessages();

saveAttachments(messages);

...

 private void saveAttachments(Message[] messages) throws Exception {

 for (Message msg : messages) {


    if (msg.getContent() instanceof Multipart) {
      Multipart multipart = (Multipart) msg.getContent();

      for (int i = 0; i < multipart.getCount(); i++) {
        Part part = multipart.getBodyPart(i);
    String disposition = part.getDisposition();

    if ((disposition != null) && 
       ((disposition.equalsIgnoreCase(Part.ATTACHMENT) || 
       (disposition.equalsIgnoreCase(Part.INLINE))))) {
        MimeBodyPart mimeBodyPart = (MimeBodyPart) part;
        String fileName = mimeBodyPart.getFileName();

        File fileToSave = new File(fileName);
        mimeBodyPart.saveFile(fileToSave);
     }
        }
      }
    }
}

答案 1 :(得分:1)

最后,我在JavaMail FAQ阅读邮件,IMAP部分找到了解决方案 Gmail服务器正在运行附件错误

首先,我尝试将partialfetch属性设置为false,但有时它有时会工作

    props.setProperty("mail.imap.partialfetch", "false");

在FAQ中列出的另一种方法是使用MimeMessage的复制构造函数并在某些tempmsg中存储orignal对象然后获取tempmsg的内容

    MimeMessage tempmsg = new MimeMessage(msg);
    Multipart part = (Multipart) tempmsg.getContent();

现在执行它应该工作的所有操作..

有关实际发生的事情的详细信息,请转到JavaMail FAQ阅读邮件,IMAP部分,您将找到所有答案..