【问题标题】:Javamail download base64 attachmentJavamail下载base64附件
【发布时间】:2017-09-26 07:53:05
【问题描述】:

我正在尝试使用 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 但我在那里遇到了同样的错误。

【问题讨论】:

    标签: java node.js jakarta-mail imap node-imap


    【解决方案1】:

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

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

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

    最后,您应该切勿“按原样”使用邮件消息中包含的文件名。这个名字永远不应该被信任。它可能用于覆盖磁盘上的文件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-11-28
      • 2012-02-25
      • 2012-12-29
      • 2017-06-11
      • 1970-01-01
      • 2019-07-20
      • 2018-07-23
      相关资源
      最近更新 更多