Как использовать Java для чтения вложения .mgs с помощью BodyPart.isMimeType(«сообщение / rfc822»)

#java #jakarta-mail #rfc822 #mimebodypart

#java #джакарта-почта #rfc822 #mimebodypart

Вопрос:

Я не очень разбираюсь в Java. Я обновил некоторые функции в существующем веб-приложении Java. Мое приложение считывает файл .eml и сохраняет вложения на локальном сервере. Теперь у меня две проблемы, когда вложение является сообщением:

  1. Имя файла равно нулю
  2. Я неправильно читаю тип содержимого «сообщение / rfc822»

Это мой код:

 import javax.mail.internet.*;
import javax.mail.Address;
import javax.mail.BodyPart;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.Session;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.*;

public class MailUtility {

    public static String[] displayEML(String emlID, String folder) throws Exception{
        
        String[] mymessageArray = null;
        String myyear = folder.substring(0, 4);
        String mymonth = folder.substring(4, 6);
        String myday = folder.substring(6, 8);
        String folderpath = myyear   "/"   mymonth   "/"   myday;
        
         //LINUX PATH
         String mypath = "/opt/tomcat/webapps/MyWebApp/attachments/";       
         String mypathHref = "attachments\";
         String emlFile = "/opt/externalemails/"   folderpath   "/"   emlID   ".eml";
         System.out.println("**** emlFile: "   emlFile);
         
         Properties props = new Properties();
         Session mailSession = Session.getDefaultInstance(props, null);
         InputStream source = new FileInputStream(emlFile);
         MimeMessage message = new MimeMessage(mailSession, source);
             
         Address[] emlFrom = message.getFrom();
         String email = emlFrom == null ? null : ((InternetAddress) emlFrom[0]).getAddress();
         String priority = "Normal";
         String emlBody = "";
         String emlAttach = "";
         
         if(message.getHeader("X-Priority", "")!=null) {
             if(message.getHeader("X-Priority", "").startsWith("1")) {
                 priority = "<b><font color="red">Highest</font></b>";     
             }
         }
         
         //view header info (Sender, Objbect, Data)
         String myTable = "<table><font face="Courier New" >";
         myTable = myTable   "<tr><td><B>From:</B></td><td>"   email  "</td></tr>";
         myTable = myTable   "<tr><td><B>Received Data:</B></td><td>"   message.getSentDate() "</td></tr>";
         myTable = myTable   "<tr><td><B>Priority:</B></td><td>"   priority  "</td></tr>";
         myTable = myTable   "<tr><td><B>Subject:</B></td><td>"   message.getSubject()   "</td></tr>";
         
            if (message.isMimeType("text/plain")) {
                emlBody = ConvertTextPlanToHTML(message.getContent().toString());
            } else if(message.isMimeType("text/html")) {
                emlBody = message.getContent().toString();
            } else if (message.isMimeType("multipart/*")) {
            
                MimeMultipart mimeMultipart = (MimeMultipart) message.getContent();
                emlBody = getTextFromMimeMultipart(mimeMultipart);  
             
                Multipart multiPart = (Multipart) message.getContent();
                int numberOfParts = multiPart.getCount();
              
                for (int partCount = 0; partCount < numberOfParts; partCount  ) {
                    MimeBodyPart part = (MimeBodyPart) multiPart.getBodyPart(partCount);
                    
                    if(part.getFileName()!=null) {
                        String strAttachment = "";
                        //getfilename and remove invalid characters in the name
                        String myFileName = MimeUtility.decodeText(part.getFileName()).replaceAll("[\\/:*?"<>|]", ""); 
                                                            
                        String myPathSave = mypath   myFileName;
                        String myPathHref = mypathHref   myFileName;
                                                
                        try {
                            if (partCount==1) {
                                strAttachment = "<B>Attachment:</B>";
                            } else {
                                strAttachment = "";
                            }
                            part.saveFile(myPathSave);  
                            emlAttach = emlAttach   "<tr><td>"   strAttachment   "</td><td><a href=""   myPathHref   "" target="_blank">"  myFileName  "</a></td></tr>";
                        } catch (IOException exc) {
                            System.out.println(exc.toString());
                        }
                    }
                }  
        } 
            
         myTable = myTable   emlAttach   "</font></table><br/>";
         mymessageArray = new String[]{myTable,emlBody};
         return mymessageArray; 
     }
     
    //function to convert Text/Plan format in HTML
    public static String ConvertTextPlanToHTML(String s) {
        StringBuilder builder = new StringBuilder();
        boolean previousWasASpace = false;
        for( char c : s.toCharArray() ) {
            if( c == ' ' ) {
                if( previousWasASpace ) {
                    builder.append("amp;nbsp;");
                    previousWasASpace = false;
                    continue;
                }
                previousWasASpace = true;
            } else {
                previousWasASpace = false;
            }
            switch(c) {
                case '<': builder.append("amp;<"); break;
                case '>': builder.append("amp;>"); break;
                case 'amp;': builder.append("amp;amp;"); break;
                case '"': builder.append("amp;quot;"); break;
                case 'n': builder.append("<br>"); break;
        //      case '*': builder.append("<b>"); break;
                // We need Tab support here, because we print StackTraces as HTML
                case 't': builder.append("amp;nbsp; amp;nbsp; amp;nbsp;"); break;  
                default:
                    if( c < 128 ) {
                        builder.append(c);
                    } else {
                        builder.append("amp;#").append((int)c).append(";");
                    }    
            }
        }
        return builder.toString();
    }
    
    // function to read email multipart 
     private static String getTextFromMimeMultipart(MimeMultipart mimeMultipart) throws MessagingException, IOException{
            String result = "";
            String result2 = "";
            int count = mimeMultipart.getCount();
            
            for (int i = 0; i < count; i  ) {
                BodyPart bodyPart = mimeMultipart.getBodyPart(i);
                Object o = bodyPart.getContent();
                
                if (o instanceof Multipart) {
                    Multipart mp = (Multipart)o;
                    for (int j = 0; j < mp.getCount(); j  ) {
                        BodyPart b = mp.getBodyPart(j);
                        // Loop if the content type is multipart then get the content that is in that part,
                        // make it the new container and restart the loop in that part of the message.
                        if (b.getContentType().contains("multipart")) {
                            mp = (Multipart)b.getContent();
                            j = -1;
                            continue;
                        }
                   
                        if(!b.getContentType().contains("text/html")) {
                            continue;
                        }

                        Object o2 = b.getContent();
                        if (o2 instanceof String) {
                            result = result   b.getContent();
                        }
                    }
                 }
                 
                if (bodyPart.isMimeType("text/plain")) {
                        result = ConvertTextPlanToHTML(bodyPart.getContent().toString());
                } else if (bodyPart.isMimeType("text/html")) {
                       result = bodyPart.getContent().toString();
                } else if (bodyPart.getContent() instanceof MimeMultipart){
                    result = getTextFromMimeMultipart((MimeMultipart)bodyPart.getContent());
                } else if (bodyPart.isMimeType("message/rfc822")){  //message/rfc822
                    /*
                       How can read bodyPart when is "message/rfc822"
                    */
                }
            }
             return result   result2;
        }    
} 
  

Не могли бы вы помочь мне решить мою проблему с любыми примерами, пожалуйста?
Спасибо за вашу помощь.

Марко

Комментарии:

1. сообщение / rfc822 означает, что основная часть сама по себе является электронной почтой. Таким образом, вы должны проанализировать его как электронное письмо, которое вы сами читаете (своего рода рекурсивно).

2. Привет, GPI, большое тебе спасибо за время, потраченное на то, чтобы ответить мне. Могу ли я привести пример, пожалуйста?

3. Javamail не может проанализировать формат MSG для извлечения текста. Вы должны извлечь вложение в двоичном формате, а затем использовать что-то вроде Apache POI HSMF ( poi.apache.org/components/hsmf/index.html ) для извлечения содержимого.

4. Привет, RealHowTo, большое спасибо за ваш ответ. Это очень интересное решение, но на данный момент моя проблема заключается в том, как идентифицировать сообщение в моем коде, прежде чем я смогу его прочитать?