我试图通过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但我在那里遇到了同样的错误。
答案 0 :(得分:1)
作为特例,您不需要处理base64。您已经使用的saveFile方法将对内容进行解码并保存。只需删除您的第一个&#34; if&#34;言。
并且您不想使用instanceof来检查多部分,因为如果它不是多部分则可能非常昂贵。相反,请使用if (msg.isMimeType("multipart/*"))
。
另请注意,您的多部分循环仅处理最简单的消息。它将失败,包含嵌套在多部分中的多部分的消息。通常这只是签名或加密的消息,您可能不想处理。它会失败的&#34;附件&#34;没有预期的Content-Disposition标头或者没有指定文件名。 (希望这些日子很少见,但有些人仍然使用破旧的邮件。)
最后,您应永远使用邮件消息中包含的文件名&#34;按原样#34;。该名称永远不应该被信任。它可能用于覆盖磁盘上的文件。