Прочитайте файл .eml и просмотрите в веб-браузере, используя javax.mail - PullRequest
1 голос
/ 07 ноября 2019

Я не очень опытный разработчик (на Java), но мне нужно прочитать файл .eml и просмотреть содержимое тела в браузере (с изображениями) иссылка на любые вложения.

Я пытался создать три файла:

index.html домашняя страница с кнопкой для начала чтения.

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Strict//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
    <title>Read EML file</title>
</head>

<body>
    <h1>Read Email</h1>
    <p>Click here to read the eml example file.</p>
    <form action="MailServlet" method="post">
        <table cellspacing="5" border="0">
        <tr><td></td><td><input type="submit" value="Read" /></td></tr></table>
    </form>
</body></html>

MailServlet.java соединитель для HTML и Java

package email;

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import helper.MailUtility;

public class MailServlet extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet {
 private static final long serialVersionUID = 1L;

public MailServlet(){ super(); }

  protected void doPost(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException
  {
        response.setContentType("text/html");
        response.setCharacterEncoding("UTF-8");
        PrintWriter out = response.getWriter();
        String url = request.getParameter("URL");

        out.println("<HTML>");
        out.println("<BODY>");

        if (url == null || url.length() < 1) {

            out.println("<B>No .eml file found</B>");

        } else {

            try
            {
                String[] myEML = MailUtility.displayEML(url);

                for(int i=0;i<myEML.length;i++) {
                    out.println(myEML[i]+"<br/>"); 
                }
            }
            catch (Exception exc)
            {
                out.println("<B>No .eml file was found</B>");
                out.println("<br/><br/>");
                out.println("<B>" + exc.toString() + "</B>");
                out.println("<br/><br/>");

            }   
        } 
        out.println("</BODY>");
        out.println("</HTML>");
        out.close();
  }

  protected void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException
  {
    this.doPost(request, response);
  }
}

MailUtility.java функция для чтения файла .eml.

package helper;

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) throws Exception{

        String[] mymessageArray = null;
        //WINDOWS PATH
         String mypath = "C:\\pippo\\";
         String mypathHref = "C:\\pippo\\";         
         String emlFile = "C:\\pippo\\"+emlID+".eml";

         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();
         email = message.getFrom()[0] + "(" + email + ")"; 

         String emlBody = "";
         String emlAttach = "";
         String myTable = "<table><tr><td><B>Subject:</B></td><td>" + message.getSubject() + "</td></tr><tr><td><B>From:</B></td><td>" + email +"</td></tr><tr><td><B>Received Data:</B></td><td>" + message.getSentDate()+"</td></tr>";

            if (message.isMimeType("text/plain")) {
                emlBody = 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 = "";

                        try {

                            if (partCount==1) {
                            //  System.out.println("partCount: " + partCount);
                                strAttachment = "<B>Attachment:</B>";
                            } else {
                                strAttachment = "";
                            }

                            part.saveFile(mypath + part.getFileName());
                            emlAttach = emlAttach + "<tr><td>" + strAttachment + "</td><td><a href=\"" + mypathHref + part.getFileName() + "\" target=\"_blank\">"+ part.getFileName() +"</a></td></tr>";

                        } catch (IOException exc) {
                            System.out.println(exc.toString());
                        }
                    }
                }  
        } 

         myTable = myTable + emlAttach + "</table><br/>";
         mymessageArray = new String[]{myTable,emlBody};
         return mymessageArray; 

     }

     private static String convertSendDate(Date mydate) {
         String myDD = "";
         String myMM = "";

         Calendar cal = Calendar.getInstance();
         cal.setTime(mydate);
         if ((cal.get(Calendar.MONTH) + 1)<10) {
             myMM = "0" + (cal.get(Calendar.MONTH) + 1);
         } else {
             myMM = "" + (cal.get(Calendar.MONTH) + 1);
         }
         if (cal.get(Calendar.DATE)<10) {
             myDD = "0" + cal.get(Calendar.DATE);
         } else {
             myDD = "" + cal.get(Calendar.DATE);
         }

         String formatedDate = "" + cal.get(Calendar.YEAR) + myMM + myDD;

         return formatedDate;
     }

     private static String getTextFromMimeMultipart(MimeMultipart mimeMultipart)  throws MessagingException, IOException{
            String result = "";
            int count = mimeMultipart.getCount();
            for (int i = 0; i < count; i++) {
                BodyPart bodyPart = mimeMultipart.getBodyPart(i);


                if (bodyPart.isMimeType("text/plain")) {
                    System.out.println("1. bodyPart.isMimeType(\"text/plain\")");
                        result = result + "\n" + bodyPart.getContent();
                    break; // without break same text appears twice in my tests
                } else if (bodyPart.isMimeType("text/html")) {
                    System.out.println("2. bodyPart.isMimeType(\"text/html\")");
                        result = result + "\n" + (String)bodyPart.getContent();
                } else if (bodyPart.getContent() instanceof MimeMultipart){
                    System.out.println("3. bodyPart.getContent() instanceof MimeMultipart");
                    result = result + getTextFromMimeMultipart((MimeMultipart)bodyPart.getContent());
                }
            }
            return result;
        }

}

Я могу прочитать информацию как тему, отправитель, я могу сохранить и создать ссылку для вложений, но у меня проблема с чтением и записью тела письма, когда это MimeMultiPart. Я попытался создать функцию

getTextFromMimeMultipart (MimeMultipart mimeMultipart)

, но вывод не отформатирован как html. Не могли бы вы помочь мне понять, как я могу реализовать свою функцию, чтобы правильно видеть тело письма с изображениями (в виде подписи) и прикрепленным файлом.

...