자바 메 일 입문 튜 토리 얼 분석 메 일(5)

14622 단어 JavaMail메 일 분석
지난 편자바 메 일 입문 4 편메 일 을 받 는 과정 에서 콘 솔 에서 인쇄 한 내용 을 우 리 는 읽 을 수 없다.사실은 우리 스스로 복잡 한 메 일 을 분석 하 는 것 은 쉽 지 않다.메 일 안의 형식 과 규범 이 매우 복잡 하 다.그러나 우리 가 사용 하 는 브 라 우 저 는 각종 데이터 형식 을 분석 하 는 데이터 처리 모듈 을 내장 하고 있 습 니 다.우 리 는 데이터 흐름 을 브 라 우 저 에 전송 하기 전에 이 데이터 흐름 이 어떤 데이터 형식 에 속 하 는 지 명확 하 게 지정 하면 됩 니 다.그 후에 모든 분석 작업 은 브 라 우 저 에서 자동 으로 완성 합 니 다.아래 의 이 그림 은 메 일 을 분석 하 는 절 차 를 잘 설명 할 수 있다.

1.Message 대상 의 getFrom,getSubject 등 방법 을 호출 하면 메 일의 보 낸 사람과 테마 등 정 보 를 얻 을 수 있 고 getContentType 방법 으로 메 일의 유형 을 얻 을 수 있 습 니 다.
2.Message.getContentType 방법의 반환 값 을 통 해 메 일 유형 을 판단 하고 Message.getContent 방법 으로 메 일 내용 을 얻 습 니 다.메 일 형식 이'text/plain'또는'text/html'이면 메 일 내용 이 일반 텍스트 임 을 표시 합 니 다.이 때 Message 대상 의 getContent 방법 으로 메 일 내용 을 받 은 다음 되 돌아 오 는 대상 의 형식 을 String 으로 변환 하여 디 스 플레이 소프트웨어 에 출력 하면 됩 니 다.메 일 형식 이"multipart/*"이면 메 일 내용 이 복합 형식 임 을 나타 내 므 로 Message.getContent 방법 을 복합 한 대상 을 Multipart 로 변환 해 야 합 니 다.
3.Multipart 대상 의 getCount 방법 을 호출 하여 Multipart 대상 에 몇 개의 Body Part 대상 이 봉인 되 어 있 는 지 확인 하고 for 순환 을 통 해 Multipart 대상 중의 모든 Body Part 대상 을 하나씩 추출 하여 처리 합 니 다.
4.모든 Body Part 대상 을 처리 할 때 먼저 Body Part 대상 의 getContentType 방법 으로 MIME 유형 을 얻 은 다음 에 MIME 유형 에 따라 다음 과 같은 세 가지 상황 을 처리 합 니 다.
MIME 형식 이'text/*'일 때 BodyPart 대상 에 저 장 된 것 이 이전 그림 의'text/plain'과 같은 일반 텍스트 데이터 임 을 나타 내 며,이때 첫 번 째 BodyPart 대상 의 getContent 방법 을 표시 하고 되 돌아 온 대상 을 String 으로 출력 하여 디 스 플레이 소프트웨어 에 표시 하면 됩 니 다.
MIME 형식 이 그림,소리 또는 첨부 파일 등 바 이 너 리 데 이 터 를 표시 할 때 위의 그림 의"image/gif"와 같이 Body Part 대상 을 호출 해 야 하 는 getDataHandler 방법 은 데 이 터 를 봉 인 된 DataHanlder 대상 을 얻 은 다음 DataHandler 대상 의 getInputStream 방법 으로 데이터 와 연 결 된 InputStream 대상 을 얻 습 니 다.이 InputStream 대상 을 통 해 원본 바 이 너 리 데이터 내용 을 얻 을 수 있 습 니 다.
MIME 형식 이'multipart/mixed'일 때 Body Part 대상 에 저 장 된 것 은 복합 MIME 메시지 임 을 나타 낸다.이 때 Body Part 대상 의 getContent 방법 을 호출 하여 복합 MIME 메 시 지 를 봉 인 된 대상 을 얻어 Multipart 형식 으로 변환 하고 이 어 3 번 과 4 번 째 급 작 스 러 운 작업 을 반복 하여 Multipart 대상 을 재 귀적 으로 호출 해 야 한다.
첨부 파일 이 있 는 프로그램 을 수신 하고 해석 합 니 다.
POP3Help.java

package mail;

import java.util.Properties;

import javax.mail.Folder;
import javax.mail.Session;
import javax.mail.Store;

public class POP3Help {
 public static Folder getFolder(String host, String username, String password) {
  Properties prop = new Properties();
  prop.setProperty("mail.store.protocol", "pop3");
  prop.setProperty("mail.pop3.host", host);

  Session mailSession = Session.getDefaultInstance(prop, null);
  mailSession.setDebug(false);

  try {
   Store store = mailSession.getStore("pop3");
   store.connect(host, username, password);
   Folder folder = store.getFolder("inbox");
   folder.open(Folder.READ_WRITE);
   return folder;
  } catch (Exception e) {
   e.printStackTrace();
  }

  return null;
 }
}
이 종 류 는 POP 3 서버 에 연결 하고 로그 인 하 며 메 일 폴 더 를 대표 하 는 Folder 대상 을 되 돌려 줍 니 다.
 index.html

<html>
 <head>
 <title>login.html</title>
 </head>
 <body>
 <form action="login.jsp" method="post">
     :<input name="host" type="text"><br/>
     :<input name="username" type="text"><br/>
    :<input name="password" type="password"><br/>
  <input type="submit" value="  "> 
  <input type="reset" value="  ">
 </form>
 </body>
</html>
페이지 에 로그 인 하려 면 메 일 서버 의 호스트 이름,사용자 이름과 비밀 번 호 를 입력 해 야 합 니 다.
 login.jsp

<%@ page import="javax.mail.*,mail.*"
 contentType="text/html;charset=GB2312" %>
<%
 String host = request.getParameter("host");  
  String username = request.getParameter("username");
  String password = request.getParameter("password");
  String from = "";
  String subject = ""; 
  Folder folder = POP3Help.getFolder(host,username,password);
  session.setAttribute("folder",folder);
  Message [] messages = folder.getMessages();
  
  for(int i=0;i<messages.length;i++)
  {
   try
   {
    from = messages[i].getFrom()[0].toString();
   subject = messages[i].getSubject();
   out.print(i + 1);
%>
        :<%=from %>     :<%=subject %>    
   <a href="displayMsg.jsp?msgnum=<%=i+1%>">    </a><br/>
<%
  }
   catch(Exception e){}
   }
%>
메 일 폴 더 의 모든 메 일 가 져 오기
 displayMsg.jsp

<frameset rows="25%,*">
 <frame src="/mailDemo/DisplayHead?msgnum=<%=request.getParameter("msgnum")%>" scrolling="no">
 <frame src="/mailDemo/DisplayContent?msgnum=<%=request.getParameter("msgnum")%>" scrolling="no">
</frameset>
메 일 보 여주 기 위 한 정보
 DisplayHead.java

package mail;

import java.io.IOException;
import java.io.PrintWriter;
import java.text.DateFormat;

import javax.mail.BodyPart;
import javax.mail.Folder;
import javax.mail.Message;
import javax.mail.Multipart;
import javax.mail.internet.MimeUtility;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

@SuppressWarnings("serial")
public class DisplayHead extends HttpServlet {
 public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  response.setContentType("text/html;charset=gb2312");
  PrintWriter out = response.getWriter();
  HttpSession session = request.getSession();
  int msgnum = Integer.parseInt(request.getParameter("msgnum"));
  Folder folder = (Folder) session.getAttribute("folder");

  try {
   Message msg = folder.getMessage(msgnum);
   String from = msg.getFrom()[0].toString();
   String subject = msg.getSubject();
   String sendDate = DateFormat.getInstance().format(msg.getSentDate());

   out.println("    :" + subject + "<br/>");
   out.println("   :" + from + "<br/>");
   out.println("    :" + sendDate + "<br/><br/>");

   System.out.println("contentType:" + msg.getContentType());

   //          "multipart/*"        
   if (msg.isMimeType("multipart/*")) {
    Multipart mp = (Multipart) msg.getContent();

    for (int i = 0; i < mp.getCount(); i++) {
     BodyPart bp = mp.getBodyPart(i);

     //    BodyPart      ,       
     if (bp.getDisposition() != null) {
      String filename = bp.getFileName();
      System.out.println("filename:" + filename);
      
      if (filename.startsWith("=?")) {
       //          RFC822  
       filename = MimeUtility.decodeText(filename);
      }

      //           
      out.print("  :");
      out.print("<a href=HandleAttach?msgnum=" + msgnum + "&&bodynum=" + i + "&&filename=" + filename
        + ">" + filename + "</a><br/>");
     }
    }
   }
  } catch (Exception e) {
   e.printStackTrace();
  }
 }
}

메 일 헤더 내용 표시
 DisplayContent.java

package mail;

import java.io.IOException;

import javax.mail.BodyPart;
import javax.mail.Folder;
import javax.mail.Message;
import javax.mail.Multipart;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

@SuppressWarnings("serial")
public class DisplayContent extends HttpServlet {
 public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  ServletOutputStream sos = response.getOutputStream();
  HttpSession session = request.getSession();
  int msgnum = Integer.parseInt(request.getParameter("msgnum"));
  Folder folder = (Folder) session.getAttribute("folder");

  try {
   Message msg = folder.getMessage(msgnum);
   //       mixed ,          ,        
   if (!msg.isMimeType("multipart/mixed")) {
    response.setContentType("message/rfc822");
    msg.writeTo(sos);
   } else {
    //              
    Multipart mp = (Multipart) msg.getContent();
    int bodynum = mp.getCount();
    for (int i = 0; i < bodynum; i++) {
     BodyPart bp = mp.getBodyPart(i);
     /*
      * MIME       disposition  ,   MIME      mixed ,
      *        MIME       
      */
     if (!bp.isMimeType("multipart/mixed") && bp.getDisposition() == null) {
      response.setContentType("message/rfc822");
      bp.writeTo(sos);
     }
    }
   }
  } catch (Exception e) {
   e.printStackTrace();
  }
 }
}
메시지 본문 보이 기
 HandleAttact.java

package mail;

import java.io.IOException;
import java.io.InputStream;
import javax.mail.BodyPart;
import javax.mail.Folder;
import javax.mail.Message;
import javax.mail.Multipart;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

@SuppressWarnings("serial")
public class HandleAttach extends HttpServlet {
 public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  response.setContentType("text/html");
  HttpSession session = request.getSession();
  ServletOutputStream out = response.getOutputStream();

  int msgnum = Integer.parseInt(request.getParameter("msgnum"));
  int bodynum = Integer.parseInt(request.getParameter("bodynum"));
  String filename = request.getParameter("filename");
  Folder folder = (Folder) session.getAttribute("folder");

  try {
   Message msg = folder.getMessage(msgnum);

   //              
   response.setHeader("Content-Disposition", "attachment;filename=" + filename);
   
   Multipart multi = (Multipart) msg.getContent();
   BodyPart bodyPart = multi.getBodyPart(bodynum);
   
   InputStream is = bodyPart.getInputStream();
   int c = 0;
   while ((c = is.read()) != -1) {
    out.write(c);
   }
  } catch (Exception e) {
   e.printStackTrace();
  }
 }
}
첨부 파일 처리 에 사용
web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>mailDemo</display-name>
  <welcome-file-list>
  <welcome-file>index.html</welcome-file>
  <welcome-file>index.htm</welcome-file>
  <welcome-file>index.jsp</welcome-file>
  <welcome-file>default.html</welcome-file>
  <welcome-file>default.htm</welcome-file>
  <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
 
  <servlet> 
  <servlet-name>DisplayHead</servlet-name> 
  <servlet-class>mail.DisplayHead</servlet-class> 
 </servlet>  
 <servlet-mapping> 
  <servlet-name>DisplayHead</servlet-name> 
  <url-pattern>/DisplayHead</url-pattern> 
 </servlet-mapping> 
  
 <servlet> 
  <servlet-name>DisplayContent</servlet-name> 
  <servlet-class>mail.DisplayContent</servlet-class> 
 </servlet>  
 <servlet-mapping> 
  <servlet-name>DisplayContent</servlet-name> 
  <url-pattern>/DisplayContent</url-pattern> 
 </servlet-mapping>  
  
 <servlet> 
  <servlet-name>HandleAttach</servlet-name> 
  <servlet-class>mail.HandleAttach</servlet-class> 
 </servlet>  
 <servlet-mapping> 
  <servlet-name>HandleAttach</servlet-name> 
  <url-pattern>/HandleAttach</url-pattern> 
 </servlet-mapping> 
</web-app>
먼저 tomcat 서버 를 시작 한 다음 브 라 우 저 에 입력 하 십시오.http://localhost:8080/mailDemo/index.html

사용자 이름과 비밀 번 호 를 입력 하 십시오.

메 일 폴 더 에 있 는 모든 메 일 을 보 여 줍 니 다.
클릭 하여 메 일 링크 보기

첨부 파일 뒤의 파일 이름 을 누 르 면 해당 첨부 파일 을 다운로드 할 수 있 습 니 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기