Не удается загрузить вложение в формате PDF с использованием JavaMail - PullRequest
4 голосов
/ 19 января 2012

Я создаю почтовый клиент, используя JavaMail API. Все работает нормально, как я могу подключиться к почтовому серверу (используя IMAP), удалить почту, получать полученные письма и отображать их пользователю и т. Д.

Теперь проблема возникает в том, что касается загрузки «PDF-вложений». PDF-файлы загружаются не полностью ... в некоторых отсутствует.

Если какое-либо вложение PDF имеет размер 38 КБ, когда я загружаю вложение с помощью IE или любого другого веб-браузера, но когда я загружаю его с помощью своего Java-кода, оно имеет размер 37,3 КБ. Это не полный Следовательно, когда я пытаюсь открыть его с помощью 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 ]

4 голосов
/ 02 мая 2012

Потратил на это несколько часов и, наконец, понял.

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 голос
/ 22 января 2012

Наконец-то я нашел решение в FAQ по JavaMail Чтение почты, раздел IMAP На сервере Gmail работает ошибка с вложениями

Сначала я попытался установить свойство false, но иногда это работает, иногда это не такt

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

В FAQ есть еще один способ, который заключается в том, чтобы просто использовать конструктор копирования MimeMessage и сохранить оригинальный объект в некотором файле tempmsg, а затем получить содержимое файла tempmsg

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

и выполнитьвсе операции должны работать ..

Для получения подробной информации о том, что на самом деле происходит, перейдите на FAQ по JavaMail Чтение почты, раздел IMAP, вы найдете все ответы ..

...