我正在尝试使用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,但是在那里出现了相同的错误。

最佳答案

您不需要处理base64作为特殊情况。您已经在使用的saveFile方法将解码内容并保存。只需删除您的第一个“ if”语句。

而且,您不想使用instanceof来检查多部分内容,因为如果不是多部分内容,它可能会非常昂贵。而是使用if (msg.isMimeType("multipart/*"))

还要注意,多部分循环将只处理最简单的消息。对于包含嵌套在多部分中的多部分的消息,它将失败。通常,这只会是您可能不想处理的经过签名或加密的消息。如果没有“附件”,则该附件没有预期的Content-Disposition标头或未指定文件名。 (希望这几天很少见,但是有些人仍然使用旧的或损坏的邮件。)

最后,永远不要使用“按原样”包含在邮件消息中的文件名。永远不要信任该名称。它可能用于覆盖磁盘上的文件。

10-07 19:58
查看更多