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

是否有任何解决方案可以通过使用POP在Java中传递特定的电子邮件ID来下载电子邮件附件?,java,gmail,jakarta-mail,email-attachments,Java,Gmail,Jakarta Mail,Email Attachments,目前正在使用JavaMail API开发wso2 esb。我想在这里做的是将未读电子邮件(Gmail)附件下载到某个本地文件夹。 在ESB端,读取未读电子邮件和获取未读电子邮件的消息id任务结束,并将该消息id从ESB传递到java也完成了。从java端,需要下载来自ESB端的特定消息id的电子邮件附件。 我不知道如何用java下载特定邮件id的电子邮件附件 你能帮我找到解决办法吗? 提前感谢, 按照下面的代码,将所有电子邮件附件下载到某个本地文件夹。只需下载特定邮件id的附件 public v

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

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

按照下面的代码,将所有电子邮件附件下载到某个本地文件夹。只需下载特定邮件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();
    }

 }
public void下载电子邮件附件(字符串主机、字符串端口、,
字符串用户名、字符串密码){
属性=新属性();
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”,
字符串.valueOf(port));
Session Session=Session.getDefaultInstance(属性);
试一试{
Store Store=session.getStore(“pop3”);
store.connect(用户名、密码);
Folder folderInbox=store.getFolder(“收件箱”);
folderInbox.open(文件夹只读);
Message[]arrayMessages=folderInbox.getMessages();
for(int i=0;i1){
attachFiles=attachFiles.substring(0,attachFiles.length()-2);
}
}else if(contentType.contains(“text/plain”)
||contentType.contains(“text/html”)){
对象内容=message.getContent();
如果(内容!=null){
messageContent=content.toString();
}
}
//打印出每封邮件的详细信息
System.out.println(“消息#”+(i+1)+“:”;
System.out.println(“\t-From:”+From);
System.out.println(“\t主题:“+主题”);
System.out.println(“\t发送日期:“+sentDate”);
System.out.println(“\t Message:+messageContent”);
System.out.println(“\t附件:“+attachFiles”);
}
//断开
folderInbox.close(假);
store.close();
}捕获(无此提供异常例外){
System.out.println(“pop3没有提供程序”);
例如printStackTrace();
}捕获(消息例外){
System.out.println(“无法连接到消息存储”);
例如printStackTrace();
}捕获(IOEX异常){
例如printStackTrace();
}
}

假设您已经有了消息id,它非常简单。在文件夹对象上有getMessage()函数,可用于单个消息

Message message = folderInbox.getMessage(messageId);
这应该行得通


***我建议您查看API的JAVA文档,使用POP3没有有效的方法。POP3将要求客户端至少读取每条消息的所有头,以便找到与messageId匹配的消息。IMAP可以更有效地实现这一点

使用任一协议,您都可以使用带有的方法来查找正确的消息


另外请注意,您需要在代码中修复这些问题。

Hi@Hari,谢谢您提供的信息。我收到的电子邮件ID为168e5f6538584e7e。如何将此值设置为名为messageId(int-type)的变量?已尝试:获取java.lang.NumberFormatException:对于输入字符串:“168e5f6538584e7e”字符串msgId=“168e5f6538584e7e”;int-msgnum=Integer.parseInt(msgId);Message Message=folderInbox.getMessage(msgnum);我不确定该方法使用的id是什么。在您的原始程序中,您可以检查每条消息的id值是多少,并查看您得到了什么以及消息相同或不同的内容是什么?看起来你收到的信息是一个十六进制数字,可能是一个非常大的数字。我道歉。getMessage()文档说明,消息id始终是消息在文件夹中的相对位置。很抱歉误导您。下面的StackoverFlow问题可能会为您提供帮助