전자 메일 수신의 네 번째 기사 인 Javamail에 대한 이전 기사 인 Javamail에 대한 소개는 콘솔에 인쇄 된 콘텐츠를 읽을 수 없습니다. 사실, 복잡한 이메일을 스스로 분석하는 것은 쉽지 않습니다. 이메일의 형식과 사양은 매우 복잡합니다. 그러나 사용하는 브라우저는 다양한 데이터 유형을 분석하기위한 내장 데이터 처리 모듈입니다. 데이터 스트림을 브라우저로 전송하기 전에 데이터 스트림이 속한 데이터 유형 만 명확하게 지정하면됩니다. 그 후, 모든 구문 분석 작업은 브라우저에서 자동으로 완료됩니다. 다음 그림은 이메일을 잘 구문 분석하는 단계를 설명 할 수 있습니다.
1. GetFrom, GetSubject 및 기타 메소드의 메시지 객체를 호출하여 전자 메일의 발신자와 주제를 가져오고 GetContentType 메소드에 전화하여 이메일 유형을 얻습니다.
2. 메시지의 반환 값을 사용하여 이메일 유형을 결정하고 이메일 내용을 얻으려면 Message.GetContent 메소드를 호출하십시오. 이메일 유형이 "Text/Plain"또는 "Text/Html"인 경우 이메일 내용이 일반 텍스트임을 의미합니다. 현재 메시지 객체의 getContent 메소드를 호출하여 이메일 컨텐츠를 가져온 다음 반환 된 객체의 유형을 문자열로 변환하여 디스플레이 소프트웨어로 출력하십시오. 메시지 유형이 "multipart/*"인 경우 메시지 내용이 복합 유형임을 의미합니다. 현재 메시지에 의해 복합 된 객체는 Multipart로 변환해야합니다.
3. 멀티 파트 객체의 getCount 메소드를 호출하여 멀티 파트 객체에 캡슐화 된 BodyPart 객체의 수를 감지하고 Multipart 객체의 각 바디 파트 객체를 하나씩 처리하여 처리를 위해 루프를 꺼냅니다.
4. 각 BodyPart 객체를 처리 할 때 먼저 BodyPart 객체의 getContentType 메소드를 호출하여 MIME 유형을 가져온 다음 MIME 유형을 기반으로 다음 세 가지 상황을 처리합니다.
MIME 유형이 "Text/*"인 경우 BodyPart 객체가 위 그림과 같이 일반 텍스트 데이터에 저장되어 있음을 의미합니다. 이 시점에서, 첫 번째 BodyPart 객체의 getContent 메소드 및 리턴 된 객체를 문자열로 변환하여 디스플레이 소프트웨어로 출력하여 디스플레이.
MIME 유형이 위 그림의 "이미지/gif"에서와 같이 그림, 사운드 또는 첨부 파일과 같은 이진 데이터를 나타내는 경우, BodyPart 객체의 getDatahandler 메소드는 데이터에 의해 캡슐화 된 데이터 칸더 객체를 얻기 위해 호출되어야합니다. 그런 다음 데이터와 관련된 객체의 getInputStream 메소드는 데이터와 관련된 입력 스트림 객체를 얻습니다. 원래 바이너리 데이터 컨텐츠는이 입력 스트림 객체를 통해 얻을 수 있습니다.
MIME 유형이 "Multipart/Mixed"인 경우 BodyPart 객체가 Compound MIME 메시지에 저장되어 있음을 의미합니다. 이 시점에, BodyPart 객체의 getContent 메소드를 호출하여 복합 MIME 메시지를 캡슐화하고이를 멀티 파트 유형으로 변환하는 객체를 얻어야합니다. 그런 다음 3 단계와 4 번째 단계를 반복하여 멀티 파트 객체에 대한 재귀 호출을하십시오.
첨부 파일을 받고 구문 분석하는 프로그램을 작성합시다
pop3help.java
패키지 메일; import java.util.properties; import javax.mail.folder; import javax.mail.session; import javax.mail.store; public class pop3help {public static 폴더 getfolder (문자열, 문자열 사용자 이름, 문자열 암호) {properties properties = new Properties (); Prop.SetProperty ( "Mail.Store.Protocol", "POP3"); Prop.SetProperty ( "mail.pop3.host", 호스트); 세션 mailsession = session.getDefaultInstance (prop, null); mailsession.setdebug (false); try {store store = mailsession.getstore ( "pop3"); store.connect (호스트, 사용자 이름, 비밀번호); 폴더 폴더 = store.getfolder ( "Inbox"); folder.open (folder.read_write); 반환 폴더; } catch (예외 e) {e.printstacktrace (); } return null; }}이 클래스는 POP3 서버에 연결하고 로그인하고 메일 폴더를 나타내는 폴더 객체를 반환하는 데 사용됩니다.
index.html
<html> <head> <title> login.html </title> </head> <body> <form action = "login.jsp"method = "post"> 호스트 이름 : <input name = "hast"type = "text"> <br/> 사용자 이름 : <input name = "username"type = "text"> 값 = "제출"> <입력 유형 = "재설정"value = "Reset"> </form> </body> </html>
로그인 페이지, 사용자는 메일 서버의 호스트 이름, 사용자 이름 및 비밀번호를 작성해야합니다.
login.jsp
<%@ page import = "javax.mail.*, mail.*"contenttype = "text/html; charset = gb2312"%> <%string host = request.getParameter ( "호스트"); 문자열 username = request.getParameter ( "사용자 이름"); 문자열 비밀번호 = request.getParameter ( "password"); 문자열에서 = ""; 문자열 주제 = ""; 폴더 폴더 = pop3help.getfolder (호스트, 사용자 이름, 암호); session.setattribute ( "폴더", 폴더); 메시지 [] 메시지 = 폴더.getMessages (); for (int i = 0; i <messages.length; i ++) {try {from = atmess [i] .getfrom () [0] .toString (); 대상 = 메시지 [i] .getSubject (); out.print (i + 1);%> 발신자 주소 : <%= from%> 이메일 주제 : <%= 피험자%> <a href = "displaymsg.jsp? msgnum = <%= i + 1%>"> 이메일보기 </a> <br/> <%} catch (예외 e) {}}%>메일 폴더에서 모든 메시지를 가져옵니다
displaymsg.jsp
<frameset rows = "25%,*"> <frame src = "/maildemo/displayhead? msgnum = <%= request.getParameter ("msgnum ")%>"scrolling = "no"> <frame src = "/maildemo/displaycontent? msgnum = <%= request.getParameter ("msgnum ")%" "/frome"이메일을 표시하는 데 사용되는 정보
displayhead.java
패키지 메일; 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.mail.mail.mail. javax.servlet.servletexception; import javax.servlet.http.httpservlet; import javax.servlet.http.httpservletrequest; import javax.servlet.http.httpservletresponse; import javax.servlet.httptp.httpession (@suppresswarnings) 클래스 displayhead는 httpservlet {public void doget (httpservletrequest request, httpservletreponse responsk)을 servletexception, ioexception {response.setContentType ( "text/html; charset = gb2312"); printwriter out = response.getwriter (); httpsession session = request.getSession (); int msgnum = integer.parseint (request.getParameter ( "msgnum")); 폴더 폴더 = (폴더) session.getAttribute ( "폴더"); try {message msg = folder.getMessage (msgnum); string from = msg.getfrom () [0] .toString (); 문자열 주제 = msg.getSubject (); String senddate = dateformat.getInstance (). format (msg.getSentDate ()); out.println ( "메일 제목 :" + 주제 + "<br/>"); out.println ( "발신자 :" + from + "<br/>"); out.println ( "보내기 날짜 :" + senddate + "<br/> <br/>"); System.out.println ( "ContentType :" + msg.getContentType ()); // 메시지가 "multipart/*"조합 인 경우 첨부 파일 등 (msg.ismimeType ( "multipart/*")) {multipart mp = (multipart) msg.getContent (); for (int i = 0; i <mp.getCount (); i ++) {bodyPart bp = mp.getBodyPart (i); // bodypart 객체에 첨부 파일이 포함 된 경우 (bp.getDisposition ()! = null) {String filename = bp.getFilename (); System.out.println ( "filename :" + filename); if (filename.startSwith ( "=?")) {// 파일 이름을 인코딩하여 rfc822 사양을 준수하기 위해 filename = mimeUtility.decodetext (filename); } // 첨부 파일을 열려 Hyperlink를 생성합니다. out.print ( "<a href = href = handleattach? msgnum =" + msgnum + "&& bodynum =" + i + "&& filename =" + filename + ">" + filename + "</a> <br/>"); }}}} catch (예외 e) {e.printstacktrace (); }}}이메일 헤더의 내용을 표시하는 데 사용됩니다
DisplayContent.java
패키지 메일; 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.servletputstream; javax.servlet.http.httpertrequest; import javax.servlet.http.http.httperponse; import javax.servlet.http.httpessess; @suppresswentings ( "serial") 공개 클래스 디스플레이 몬트 {public void doget (htpervletrequpert httpservlet) httpservletresponse responsk) servletexception, ioexception {servletoutputstream sos = response.getoutputStream (); httpsession session = request.getSession (); int msgnum = integer.parseint (request.getParameter ( "msgnum")); 폴더 폴더 = (폴더) session.getAttribute ( "폴더"); try {message msg = folder.getMessage (msgnum); // 메시지 유형이 혼합되지 않은 경우 메시지에 첨부 파일이 포함되어 있지 않으며 메시지 내용이 직접 출력됩니다. 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 메시지 헤더에 배치 필드가 포함되어 있지 않고 MIME 메시지 유형이 혼합되지 않은 경우, * 현재 얻은 MIME 메시지는 이메일 본문 */if (! bp.ismimeType ( "multipart/mixed") && bp.getDisPosition () == null) {respons.setContentType ( "messsing/rfc822")를 나타냅니다. bp.writeto (SOS); }}}} catch (예외 e) {e.printstacktrace (); }}}이메일 본문을 표시하는 데 사용됩니다
handleattact.java
패키지 메일; 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; javax.servlet.http.httpservlet; import javax.servlet.http.htttp.httpervletrequest; import javax.servlet.http.http.httpervletresponse; import javax.servlet.servlet.http.httpsessions (vuleppresswarnings) vuleppresswarnings ( "serial") public void doget (httpservletrequest request, httpservletresponse responsk) 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")); 문자열 filename = request.getParameter ( "filename"); 폴더 폴더 = (폴더) session.getAttribute ( "폴더"); try {message msg = folder.getMessage (msgnum); // 메시지 헤더 유형을 첨부 파일 유형으로 설정합니다 .Setheader ( "Content-Disposition", "첨부 파일; filename =" + filename); 멀티 파트 multi = (multipart) msg.getContent (); BodyPart BodyPart = Multi.GetBodyPart (Bodynum); inputStream은 = bodyPart.getInputStream (); int c = 0; while ((c = is.read ())! = -1) {out.write (c); }} catch (예외 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"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/wweb-app_2_5.xsd"id = "webapp_id"version = "2.5"> <display-name> maildemo </display-name> <colling-file> index.html </welcome-file> <welcome-file> index.htm.htm </welcome-file> <welcome-file> index.jsp </welcome-file> <welcome-file> index.jsp </welcome-file> <welcome-file> default.html </welcome-file> <welcome-file> default.htm </welcome-file> </welcome-file-list> <servlet> <servlet-name> displayhead </servlet-name> <servlet-class.diSplashead </servlet-class> </servlet> <servlet-mapping> <servlet-name> displayhead </servlet-name> <Url-pattern>/displerhead </url-pattern> </url-pattern> </url-pattern> <servlet-name> displayContent </servlet-name> <servlet-class> mail.displayContent </servlet-class> </servlet> <servlet-mapping> <servlet-mapping> <servlet-name> displayContent </servlet-name> <url-pattern>/displayContent </url-pattern> <servlet-mapping> <servlet-name> handleattach </servlet-name> <servlet-class> mail.handleattach </servlettach </servlet-class> </servlet> <servlet-mapping> <servlet-mapping> <servlet-name> handleattach </servlet-name> <url-pattern>/handleattach </url-pattern> </web-appping>
먼저 Tomcat 서버를 시작한 다음 브라우저에서 http : // localhost : 8080/maildemo/index.html을 입력하십시오.
사용자 이름 및 비밀번호를 입력하십시오 (여기에 권한 부여 코드를 작성해야합니다. 권한 부여 코드는 무엇이며 어떻게 설정됩니까?)
메일 폴더에 모든 메시지를 나열하십시오
이메일 링크를 보려면 클릭하십시오
첨부 파일 후 파일 이름을 클릭하여 해당 첨부 파일을 다운로드하십시오.
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.