Javamail скачать вложение base64

Я пытаюсь загрузить все новые вложения электронной почты из моего письма с помощью javamail и через imap. Все работает нормально, хотя некоторые вложения находятся в pdf и декодируются как BASE64, что мое утверждение

if (msg.getContent() instanceof Multipart) 

не ловит, так как его com.sun.mail.util.BASE64DecoderStream@33c7e1bb.

Как получить это вложение и загрузить его на жесткий диск?

До сих пор пробовал, и первый оператор IF ловит вложения с декодированием Base64.

for (Message msg : messages) {
        Address[] fromAddress = msg.getFrom();
        String from = fromAddress[0].toString();
        String subject = msg.getSubject();
        String sentDate = msg.getSentDate().toString();

        String messageContent = "";
        String attachFiles = "";

        System.out.println(msg.getContent());


        if (msg.getContent() instanceof BASE64DecoderStream)
        {
            BASE64DecoderStream base64DecoderStream = (BASE64DecoderStream) msg.getContent();
            byte[] byteArray = IOUtils.toByteArray(base64DecoderStream);
        }
        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();
                    attachFiles += fileName;
                    File fileToSave = new File(fileName);
                    mimeBodyPart.saveFile(saveDirectory + File.separator + fileToSave);
                    System.out.println("saved attachment: " + fileName + " to disk at: " + saveDirectory);
                }
            }
        }
        System.out.println("\t From: " + from);
        System.out.println("\t Subject: " + subject);
        System.out.println("\t Sent Date: " + sentDate);
        System.out.println("\t Attachments: " + attachFiles);
        System.out.println("");
    }
}

Можно также использовать NodeJS, если есть простой и легкий способ загрузить вложения на мой диск. Пробовал node-imap, но там я получил ту же ошибку.

1 ответ

Вам не нужно обрабатывать base64 как особый случай. Метод saveFile, который вы уже используете, декодирует содержимое и сохраняет его. Просто удалите свое первое утверждение "если".

И вы не хотите использовать instanceof для проверки multipart, поскольку это может быть очень дорого, если это не multipart. Вместо этого используйте if (msg.isMimeType("multipart/*")),

Также обратите внимание, что ваш составной цикл будет обрабатывать только самые простые сообщения. Это не удастся с сообщениями, которые содержат несколько частей, вложенных в несколько частей. обычно это будут только подписанные или зашифрованные сообщения, которые вы, возможно, не захотите обрабатывать. И он потерпит неудачу с "вложениями", которые не имеют ожидаемого заголовка Content-Disposition или не указывают имя файла. (Надеюсь, это редкость в наши дни, но некоторые люди все еще используют старые или сломанные почтовые программы.)

Наконец, вы никогда не должны использовать имя файла, включенное в почтовое сообщение "как есть". Этому имени никогда нельзя доверять. Это может быть использовано для перезаписи файлов на вашем диске.

Другие вопросы по тегам