如何在java中使用MIMessage类获取电子邮件正文和附件

如何在java中使用MIMessage类获取电子邮件正文和附件,java,jakarta-mail,mime,mime-message,Java,Jakarta Mail,Mime,Mime Message,在我的SMTP服务器代码中,我有一个mimessage实例,我想用它来提取传入的邮件正文(邮件文本)和邮件附件。为此,我在客户端和服务器端使用以下实现。但是,我只能检索邮件附件。代码不知何故检测了CustomerEngineer.ahmet两次,但都没有包含邮件正文,即:“这是一个邮件正文”。不过我可以检索图像 在java mail客户端中,我创建了一个具有以下模式的邮件: try { // Create a default MimeMessage object

在我的SMTP服务器代码中,我有一个mimessage实例,我想用它来提取传入的邮件正文(邮件文本)和邮件附件。为此,我在客户端和服务器端使用以下实现。但是,我只能检索邮件附件。代码不知何故检测了CustomerEngineer.ahmet两次,但都没有包含邮件正文,即:“这是一个邮件正文”。不过我可以检索图像

在java mail客户端中,我创建了一个具有以下模式的邮件:

try {
        // Create a default MimeMessage object
        Message message = new MimeMessage(session);

        message.setFrom(new InternetAddress(from));

        message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to));

        // Set Subject
        message.setSubject("Hi JAXenter");

        BodyPart messageBodyPart = new MimeBodyPart();

        messageBodyPart.setText("This is a message body");

        Multipart multipart = new MimeMultipart();

        multipart.addBodyPart(messageBodyPart);

        DataSource source = new FileDataSource(new File(System.getProperty("user.dir").concat("\\src\\main\\java\\emailrelayserver\\CustomerEngineer.png")));
        messageBodyPart.setDataHandler(new DataHandler(source));
        messageBodyPart.setFileName("CustomerEngineer.ahmet");
        multipart.addBodyPart(messageBodyPart);

        message.setContent(multipart);

        // Send message
        Transport.send(message);

        System.out.println("Sent message successfully....");

    } catch (MessagingException e) {
        throw new RuntimeException(e);
    }
在我的服务器端,我使用以下逻辑:

 MimeMessage message = new MimeMessage(session, data);

public void seperateBodyAndAttachments(MimeMessage message) throws MessagingException, IOException {
    String mimeType = message.getContentType();
    Date dt = new Date();

    if (message.isMimeType("text/*")) {
        System.out.println("this containst a text file");
    }  else if (message.isMimeType("multipart/*")) {
        Multipart mp = (Multipart) message.getContent();
        int idx = 0;
        int count = mp.getCount();
        for (int i = 0; i < count; i++) {
            BodyPart part = mp.getBodyPart(i);
            String name = part.getDataHandler().getName();
            if (part.isMimeType("text/*")) {
                if (name == null) {
                    name = "text-" + (++idx) + ".txt";
                }
                System.out.println(name);
            } else {
                if (name == null) {
                    name = "attachment-" + (++idx);
                }
                FileOutputStream fos = new FileOutputStream(System.getProperty("user.dir").concat("\\src\\main\\resources\\DevEnvironmentConfigFile\\" + name));
                BufferedOutputStream bos = new BufferedOutputStream(fos);
                part.getDataHandler().writeTo(bos);
                bos.close();
            }
        }
    } else if (message.isMimeType("message/rfc822")) {
        // Not implemented
    } else {
        Object o = message.getContent();
        if (o instanceof String) {
            FileWriter fw = new FileWriter(System.getProperty("user.dir").concat("\\src\\main\\java\\emailrelayserver\\downloads\\"  + "text.txt"));
            BufferedWriter bw = new BufferedWriter(fw);
            bw.write((String)o);
            bw.close();
        } else if (o instanceof InputStream) {
            FileOutputStream fos = new FileOutputStream(System.getProperty("user.dir").concat("\\src\\main\\java\\emailrelayserver\\downloads\\"  +"message.dat"));
            BufferedOutputStream bos = new BufferedOutputStream(fos);
            message.getDataHandler().writeTo(bos);
            bos.close();
        } else {
            FileWriter fw = new FileWriter(System.getProperty("user.dir").concat("\\src\\main\\java\\emailrelayserver\\downloads\\"  +"unknown.txt"));
            BufferedWriter bw = new BufferedWriter(fw);
            bw.write((String)o);
            bw.close();
        }
    }
}
mimessage message=新的mimessage(会话、数据);
public void单独的body和attachments(mimessage message)抛出消息异常,IOException{
字符串mimeType=message.getContentType();
日期dt=新日期();
if(message.isMimeType(“text/*”){
System.out.println(“它包含一个文本文件”);
}else if(message.isMimeType(“multipart/*”){
Multipart mp=(Multipart)message.getContent();
int-idx=0;
int count=mp.getCount();
for(int i=0;i
不太清楚您的电子邮件结构。但是请注意,多部分可以嵌套,因此在搜索身体时,您必须一直向下搜索。对于mutlipart/alternative,可能会有多个机构

在你的情况下,你可以看到

multipart/mixed
  multipart/alternative
    text/plain
    text/html
attachment
一种结构。因此,第一个多部分实际上不包括主体。 考虑这个代码:

public void seperateBodyAndAttachments(MimeMessage mm) throws MessagingException, IOException {
   String mimeType = message.getContentType();
   System.out.println("Message is a " + mimeType);  
   Object content = mm.getContent();
   if(content instanceof String) {
     System.out.println("Body: " + content);
   } else if(content instanceof MimeMultipart) {                
     MimeMultipart multi = (MimeMultipart)content;
     System.out.println("We have a "+ multi.getContentType());              
     for(int i = 0; i < multi.getCount(); ++i) {
        BodyPart bo = multi.getBodyPart(i);
        System.out.println("Content "+i+" is a " + bo.getContentType());
        //Now that body part could again be a MimeMultipart...
        Object bodyContent = bo.getContent();
        //possibly build a recurion here -> the logic is the same as for mm.getContent() above
      }
    } else {
        System.out.println("Some other content: " + content.getClass().getName());
    }
}
可以尝试发送以下内容:

        // Set Subject
        message.setSubject("Hi JAXenter");


        Multipart multipart = new MimeMultipart("mixed");
        //Add Text Part         
        BodyPart textBodyPart = new MimeBodyPart();
        textBodyPart.setContent("This is a message body", "text/plain");
        multipart.addBodyPart(textBodyPart);

        //Add attachment
        DataSource source = new FileDataSource(new File(System.getProperty("user.dir").concat("\\src\\main\\java\\emailrelayserver\\CustomerEngineer.png")));
        BodyPart messageBodyPart = new MimeBodyPart();
        messageBodyPart.setDataHandler(new DataHandler(source));
        messageBodyPart.setFileName("CustomerEngineer.ahmet");
        multipart.addBodyPart(messageBodyPart);

        //Set this as message content
        message.setContent(multipart);



        //This will show you internal structure of your message! D
        message.saveChanges();
        message.writeTo(System.out);

        Transport.send(message);            

不太确定你的电子邮件结构。但是请注意,多部分可以嵌套,因此在搜索身体时,您必须一直向下搜索。对于mutlipart/alternative,可能会有多个机构

在你的情况下,你可以看到

multipart/mixed
  multipart/alternative
    text/plain
    text/html
attachment
一种结构。因此,第一个多部分实际上不包括主体。 考虑这个代码:

public void seperateBodyAndAttachments(MimeMessage mm) throws MessagingException, IOException {
   String mimeType = message.getContentType();
   System.out.println("Message is a " + mimeType);  
   Object content = mm.getContent();
   if(content instanceof String) {
     System.out.println("Body: " + content);
   } else if(content instanceof MimeMultipart) {                
     MimeMultipart multi = (MimeMultipart)content;
     System.out.println("We have a "+ multi.getContentType());              
     for(int i = 0; i < multi.getCount(); ++i) {
        BodyPart bo = multi.getBodyPart(i);
        System.out.println("Content "+i+" is a " + bo.getContentType());
        //Now that body part could again be a MimeMultipart...
        Object bodyContent = bo.getContent();
        //possibly build a recurion here -> the logic is the same as for mm.getContent() above
      }
    } else {
        System.out.println("Some other content: " + content.getClass().getName());
    }
}
可以尝试发送以下内容:

        // Set Subject
        message.setSubject("Hi JAXenter");


        Multipart multipart = new MimeMultipart("mixed");
        //Add Text Part         
        BodyPart textBodyPart = new MimeBodyPart();
        textBodyPart.setContent("This is a message body", "text/plain");
        multipart.addBodyPart(textBodyPart);

        //Add attachment
        DataSource source = new FileDataSource(new File(System.getProperty("user.dir").concat("\\src\\main\\java\\emailrelayserver\\CustomerEngineer.png")));
        BodyPart messageBodyPart = new MimeBodyPart();
        messageBodyPart.setDataHandler(new DataHandler(source));
        messageBodyPart.setFileName("CustomerEngineer.ahmet");
        multipart.addBodyPart(messageBodyPart);

        //Set this as message content
        message.setContent(multipart);



        //This will show you internal structure of your message! D
        message.saveChanges();
        message.writeTo(System.out);

        Transport.send(message);            

嗨,简,噢,哇,谢谢你,我没那么想。我浏览了您构建的逻辑,但不知何故,它仍然没有为我单击:/当我尝试此逻辑时,您建议我得到以下输出:消息是多部分/混合的;boundary=“---=\u Part\u 0\u 1072408673.1592314025145”我们有一个多部分/混合的;boundary=“--------=\u Part\u 0\u 1072408673.1592314025145”内容0是一个应用程序/八位字节流;name=CustomerEngineer.ahmet内容1是一个应用程序/八位字节流;name=CustomerEngineer.ahmetSo它只能检索附件,但在上面的客户端,我添加了messageBodyPart.setText(“这是一个消息体”);。啊,真烦人:啊!你在重复使用同一个身体部位!我要在回答中加上这一点。简,首先,我真的很感谢你抽出时间来帮助我。我尝试了这个最终的解决方案,但它仍然不适合我。我花了几乎一整天的时间来做这个,但不知怎么的,我还是无法让它工作。在您更新的答案中,在最后一部分中,您说了一个简单的->然后您共享了两行代码,这是否意味着我应该删除客户端的所有代码并使用它?另外,我在你说的区域中创建了一个递归部分,现在我得到了“其他内容:com.sun.mail.util.BASE64DecoderStream”的输出,我快要发疯了。非常感谢你…哇。。绝对是脑力枯竭。。非常感谢你,我能理解它,它终于起作用了。。我真的很感激简。嗨,简,哦,哇,谢谢你,我不这么想。我浏览了您构建的逻辑,但不知何故,它仍然没有为我单击:/当我尝试此逻辑时,您建议我得到以下输出:消息是多部分/混合的;boundary=“---=\u Part\u 0\u 1072408673.1592314025145”我们有一个多部分/混合的;boundary=“--------=\u Part\u 0\u 1072408673.1592314025145”内容0是一个应用程序/八位字节流;name=CustomerEngineer.ahmet内容1是一个应用程序/八位字节流;name=CustomerEngineer.ahmetSo它只能检索附件,但在上面的客户端,我添加了messageBodyPart.setText(“这是一个消息体”);。啊,真烦人:啊!Y