是否有任何解决方案可以通过使用 POP 在 Java 中传递特定的电子邮件消息 ID 来下载电子邮件附件?

Is there any solution to download email attachment by passing particular email Message ID in Java Using POP?

目前正在使用 JavaMail 开发 wso2 esb API。我在这里想要做的是 将未读的电子邮件 (Gmail) 附件下载到某个本地文件夹 。 在 ESB 端,读取未读电子邮件和获取未读电子邮件的消息 ID 任务结束,并将该消息 ID 从 esb 传递到 java 也 done.From java 结束,需要 下载来自 esb 端的特定消息 id 的电子邮件附件。 我不知道如何下载 java 中特定邮件 ID 的电子邮件附件。

你能帮我找到解决办法吗? 提前致谢,

以下代码,将所有电子邮件附件下载到某个本地 folder.need 到 仅下载特定邮件 ID 的附件

public void downloadEmailAttachments(String host, String port,
            String userName, String password) {

     Properties properties = new Properties();


        properties.put("mail.pop3.host", host);
        properties.put("mail.pop3.port", port);


        properties.setProperty("mail.pop3.socketFactory.class",
                "javax.net.ssl.SSLSocketFactory");
        properties.setProperty("mail.pop3.socketFactory.fallback", "false");
        properties.setProperty("mail.pop3.socketFactory.port",
                String.valueOf(port));
        Session session = Session.getDefaultInstance(properties);
        try {
        Store store = session.getStore("pop3");
        store.connect(userName, password);  
        Folder folderInbox = store.getFolder("INBOX");
        folderInbox.open(Folder.READ_ONLY);
        Message[] arrayMessages = folderInbox.getMessages();


        for (int i = 0; i < arrayMessages.length; i++) {
            Message message = arrayMessages[i];
            Address[] fromAddress = message.getFrom();
            String from = fromAddress[0].toString();
            String subject = message.getSubject();
            String sentDate = message.getSentDate().toString();

            String contentType = message.getContentType();


            String messageContent = "";

            // store attachment file name, separated by comma
            String attachFiles = "";

            if (contentType.contains("multipart")) {

                Multipart multiPart = (Multipart) message.getContent();
                int numberOfParts = multiPart.getCount();
                for (int partCount = 0; partCount < numberOfParts; partCount++) {
                    MimeBodyPart part = (MimeBodyPart) multiPart.getBodyPart(partCount);
                    if (Part.ATTACHMENT.equalsIgnoreCase(part.getDisposition())) {
                        // this part is attachment
                        String fileName = part.getFileName();
                        attachFiles += fileName + ", ";
                        part.saveFile(saveDirectory + File.separator + fileName);
                    } else {
                        // this part may be the message content
                        messageContent = part.getContent().toString();
                    }
                }

                if (attachFiles.length() > 1) {
                    attachFiles = attachFiles.substring(0, attachFiles.length() - 2);
                }
            } else if (contentType.contains("text/plain")
                    || contentType.contains("text/html")) {
                Object content = message.getContent();
                if (content != null) {
                    messageContent = content.toString();
                }
            }

            // print out details of each message
            System.out.println("Message #" + (i + 1) + ":");
            System.out.println("\t From: " + from);
            System.out.println("\t Subject: " + subject);
            System.out.println("\t Sent Date: " + sentDate);
            System.out.println("\t Message: " + messageContent);
            System.out.println("\t Attachments: " + attachFiles);
        }

        // disconnect
        folderInbox.close(false);
        store.close();
    } catch (NoSuchProviderException ex) {
        System.out.println("No provider for pop3.");
        ex.printStackTrace();
    } catch (MessagingException ex) {
        System.out.println("Could not connect to the message store");
        ex.printStackTrace();
    } catch (IOException ex) {
        ex.printStackTrace();
    }

 }

假设你已经有了消息id,那就很简单了。您在 Folder 对象上有 getMessage() 函数,可用于单个消息

Message message = folderInbox.getMessage(messageId);

这应该有效。

*** 我建议您阅读 JAVA 文档以获得 API

没有使用 POP3 执行此操作的有效方法。 POP3 将要求客户端至少读取每条消息的所有 headers,以便找到与 messageId 匹配的消息。 IMAP 可以更有效地做到这一点。

使用任一协议,您都可以使用 Folder.search method with a MessageIDTerm 找到正确的消息。

另请注意,您需要在代码中修复这些 common JavaMail mistakes