如何使用Java使用bodyPart.isMimeType“ message / rfc822”读取.mgs附件

问题描述

我不是Java方面的专家。 我更新了现有Java Web应用程序中的某些功能。 我的应用程序读取.eml文件,并将附件保存在本地服务器上。 现在,当附件为味精时,我有两个问题:

  1. 文件名为空
  2. 我没有正确阅读内容类型“ message / 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("&nbsp;");
                    prevIoUsWasASpace = false;
                    continue;
                }
                prevIoUsWasASpace = true;
            } else {
                prevIoUsWasASpace = false;
            }
            switch(c) {
                case '<': builder.append("&lt;"); break;
                case '>': builder.append("&gt;"); break;
                case '&': builder.append("&amp;"); break;
                case '"': builder.append("&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("&nbsp; &nbsp; &nbsp;"); break;  
                default:
                    if( c < 128 ) {
                        builder.append(c);
                    } else {
                        builder.append("&#").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;
        }    
} 

请问有什么例子可以帮助我解决我的问题吗? 感谢您的帮助。

马可

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...