บทความก่อนหน้านี้การแนะนำไปยัง Javamail บทความที่สี่ในการรับอีเมลเราไม่สามารถอ่านเนื้อหาที่พิมพ์บนคอนโซลได้ ในความเป็นจริงมันไม่ใช่เรื่องง่ายที่จะให้เราวิเคราะห์อีเมลที่ซับซ้อนด้วยตัวเอง รูปแบบและข้อกำหนดในอีเมลมีความซับซ้อนมาก อย่างไรก็ตามเบราว์เซอร์ที่เราใช้เป็นโมดูลการประมวลผลข้อมูลในตัวสำหรับการวิเคราะห์ชนิดข้อมูลต่างๆ เราจำเป็นต้องระบุอย่างชัดเจนว่าประเภทข้อมูลของสตรีมข้อมูลเป็นของก่อนที่จะส่งสตรีมข้อมูลไปยังเบราว์เซอร์ หลังจากนั้นการดำเนินการแยกวิเคราะห์ทั้งหมดจะเสร็จสิ้นโดยเบราว์เซอร์โดยอัตโนมัติ ภาพต่อไปนี้สามารถอธิบายขั้นตอนในการแยกวิเคราะห์อีเมลได้ดี
1. โทรหา GetFrom, GetSubject และวิธีการอื่น ๆ ของวัตถุข้อความเพื่อให้ผู้ส่งและหัวเรื่องของอีเมลและโทรหาวิธี getContentType เพื่อรับประเภทของอีเมล
2. ใช้ค่าส่งคืนของเมธอด GetContentType เพื่อกำหนดประเภทอีเมลและโทรไปที่ Message.getContent Method เพื่อรับเนื้อหาอีเมล หากประเภทอีเมลคือ "ข้อความ/ธรรมดา" หรือ "ข้อความ/html" หมายความว่าเนื้อหาอีเมลเป็นข้อความธรรมดา ในเวลานี้ให้โทรหาวิธี getContent ของวัตถุข้อความเพื่อรับเนื้อหาอีเมลจากนั้นแปลงประเภทของวัตถุที่ส่งคืนเป็นสตริงและส่งออกไปยังซอฟต์แวร์แสดงผล หากประเภทข้อความคือ "multipart/*" หมายความว่าเนื้อหาข้อความเป็นประเภทสารประกอบ ในเวลานี้วัตถุที่ประกอบไปด้วย message.getContent วิธีการจะต้องถูกแปลงเป็น multipart
3. เรียกใช้วิธีการ getCount ของวัตถุ Multipart เพื่อตรวจสอบจำนวนวัตถุ bodypart ที่ถูกห่อหุ้มในวัตถุ multipart และนำวัตถุ Bodypart แต่ละชิ้นออกไปในวัตถุหลายชิ้นทีละหนึ่งผ่าน A สำหรับการลูปสำหรับการประมวลผล
4. เมื่อประมวลผลวัตถุ bodypart แต่ละรายการก่อนอื่นให้เรียกวิธี getContentType ของวัตถุ BodyPart เพื่อรับประเภท MIME จากนั้นจัดการสถานการณ์สามสถานการณ์ต่อไปนี้ตามประเภท MIME:
เมื่อประเภท MIME คือ "text/*" หมายความว่าวัตถุ bodypart จะถูกเก็บไว้ในข้อมูลข้อความธรรมดาดังแสดงในรูปด้านบน ในเวลานี้วิธี getContent ของวัตถุ BodyPart แรกและแปลงวัตถุที่ส่งคืนเป็นสตริงและส่งออกไปยังซอฟต์แวร์ที่แสดงเพื่อแสดงผล
เมื่อประเภท MIME แสดงถึงข้อมูลไบนารีเช่นรูปภาพเสียงหรือสิ่งที่แนบมาเช่นเดียวกับใน "รูปภาพ/gif" ในรูปด้านบนวิธีการ getDatahandler ของวัตถุ bodypart ควรถูกเรียกให้รับวัตถุ Datahanlder ที่ห่อหุ้มข้อมูลแล้ว เนื้อหาข้อมูลไบนารีดั้งเดิมสามารถรับได้ผ่านวัตถุอินพุทสตรีมนี้
เมื่อประเภท MIME คือ "Multipart/Mixed" นั่นหมายความว่าวัตถุ BodyPart จะถูกเก็บไว้ในข้อความ MIME แบบผสม ในเวลานี้ควรเรียกใช้วิธี getContent ของวัตถุ bodypart เพื่อให้ได้วัตถุที่ห่อหุ้มข้อความ MIME แบบผสมและแปลงเป็นประเภทหลายส่วน จากนั้นทำซ้ำขั้นตอนที่ 3 และ 4 เพื่อทำการโทรซ้ำไปยังวัตถุ Multipart
มาเขียนโปรแกรมที่ได้รับและแยกวิเคราะห์ไฟล์แนบ
pop3help.java
แพ็คเกจจดหมาย; นำเข้า java.util.properties; นำเข้า javax.mail.folder; นำเข้า Javax.mail.session; นำเข้า Javax.mail.store; คลาสสาธารณะ Pop3help {โฟลเดอร์คงที่สาธารณะ getFolder prop.setProperty ("mail.store.protocol", "pop3"); prop.setProperty ("mail.pop3.host", โฮสต์); Session Mailsession = session.getDefaultInstance (prop, null); mailsession.setDebug (เท็จ); ลอง {store store = mailsession.getStore ("POP3"); store.connect (โฮสต์, ชื่อผู้ใช้, รหัสผ่าน); โฟลเดอร์โฟลเดอร์ = store.getFolder ("กล่องจดหมาย"); folder.open (folder.read_write); โฟลเดอร์กลับ; } catch (exception e) {e.printstacktrace (); } return null; -คลาสนี้ใช้เพื่อเชื่อมต่อและเข้าสู่ระบบเซิร์ฟเวอร์ POP3 และส่งคืนวัตถุโฟลเดอร์ที่แสดงถึงโฟลเดอร์เมล
index.html
<html> <head> <title> login.html </title> </head> <body> <form action = "login.jsp" method = "post"> ชื่อโฮสต์: <ชื่ออินพุต = "host" type = "text"> <br/> ชื่อผู้ใช้: <อินพุต type = "รีเซ็ต" value = "รีเซ็ต"> </form> </body> </html>
หน้าเข้าสู่ระบบผู้ใช้จำเป็นต้องกรอกชื่อโฮสต์ชื่อผู้ใช้และรหัสผ่านของเซิร์ฟเวอร์เมล
เข้าสู่ระบบ.jsp
<%@ page import = "javax.mail.*, mail.*" contentType = "ข้อความ/html; charset = gb2312"%> <%สตริงโฮสต์ = request.getParameter ("โฮสต์"); String username = request.getParameter ("ชื่อผู้ใช้"); สตริงรหัสผ่าน = request.getParameter ("รหัสผ่าน"); สตริงจาก = ""; สตริงเรื่อง = ""; โฟลเดอร์โฟลเดอร์ = pop3help.getFolder (โฮสต์, ชื่อผู้ใช้, รหัสผ่าน); session.setAttribute ("โฟลเดอร์", โฟลเดอร์); ข้อความ [] message = folder.getMessages (); สำหรับ (int i = 0; i <messages.length; i ++) {ลอง {จาก = ข้อความ [i] .getFrom () [0] .toString (); subject = messages [i] .getSubject (); out.print (i + 1);%> ที่อยู่ผู้ส่ง: <%= จาก%> หัวเรื่องอีเมล: <%= หัวเรื่อง%> <a href = "displaymsg.jsp? msgnum = <%= i + 1%>"> ดูอีเมล </a> <br/> <%}รับข้อความทั้งหมดในโฟลเดอร์เมล
displaymsg.jsp
<frameset rows = "25%,*"> <frame src = "/maildemo/displayhead? msgnum = <%= request.getParameter (" msgnum ")%>" การเลื่อน = "ไม่"> <frame src = "/maildemo/displaycontent scrolling = "ไม่"> </frameset>ข้อมูลที่ใช้ในการแสดงอีเมล
displayhead.java
แพ็คเกจจดหมาย; นำเข้า java.io.ioException; นำเข้า java.io.printwriter; นำเข้า java.text.dateformat; นำเข้า Javax.mail.bodypart; นำเข้า Javax.mail.folder; นำเข้า Javax.mail.message; javax.servlet.servletexception; นำเข้า javax.servlet.http.httpservlet; นำเข้า Javax.servlet.http.httpservletrequest; นำเข้า Javax.servlet.http.httpservletResponse; javax.servlet.http.httpsession; @suppresswarnings ("serial") Public Class Displayhead ขยาย httpservlet {โมฆะสาธารณะ doget (httpservletrequest คำขอ httpservletResponse) โยน servletexception Response.SetContentType ("ข้อความ/html; charset = gb2312"); PrintWriter out = response.getWriter (); httpsession session = request.getSession (); int msgnum = integer.parseint (request.getParameter ("msgnum")); โฟลเดอร์โฟลเดอร์ = (โฟลเดอร์) เซสชัน GetAttribute ("โฟลเดอร์"); ลอง {ข้อความ msg = folder.getMessage (msgnum); สตริงจาก = msg.getFrom () [0] .tostring (); String subject = msg.getSubject (); String senddate = dateFormat.getInstance (). รูปแบบ (msg.getSentDate ()); out.println ("Mail subject:" + subject + "<br/>"); out.println ("ผู้ส่ง:" + จาก + "<br/>"); out.println ("ส่งวันที่:" + senddate + "<br/> <br/>"); System.out.println ("ContentType:" + msg.getContentType ()); // ถ้าข้อความเป็นชุดค่าผสม "multipart/*" มันอาจมีสิ่งที่แนบมา ฯลฯ (msg.ismimetype ("multipart/*")) {multipart mp = (multipart) msg.getContent (); สำหรับ (int i = 0; i <mp.getCount (); i ++) {bodypart bp = mp.getbodypart (i); // ถ้าวัตถุ bodypart มีสิ่งที่แนบมามันควรจะแยกวิเคราะห์ถ้า (bp.getDisposition ()! = null) {String filename = bp.getFilename (); System.out.println ("ชื่อไฟล์:" + ชื่อไฟล์); if (filename.startswith ("=?")) {// เข้ารหัสชื่อไฟล์เพื่อให้สอดคล้องกับข้อมูลจำเพาะ RFC822 Filename = MimeUtility.decodeText (ชื่อไฟล์); } // สร้างไฮเปอร์ลิงก์เพื่อเปิดสิ่งที่แนบมา out.print ("แนบ:"); out.print ("<a href = handleattach? msgnum =" + msgnum + "&& bodynum =" + i + "&& filename =" + filename + ">" + filename + "</a> <br/>"); }}}} catch (Exception E) {E.printStackTrace (); -ใช้เพื่อแสดงเนื้อหาของส่วนหัวอีเมล
displaycontent.java
แพ็คเกจจดหมาย; นำเข้า java.io.ioexception; นำเข้า Javax.mail.bodypart; นำเข้า Javax.mail.folder; นำเข้า Javax.mail.message; นำเข้า Javax.mail.multipart; นำเข้า javax.servlet.servletexception; javax.servlet.http.httpservletrequest; นำเข้า Javax.servlet.http.httpservletResponse; นำเข้า Javax.servlet.http.httpsession; @suppresswarnings ("serial") การแสดงระดับสาธารณะ การตอบสนอง httpservletResponse) พ่น servletexception, ioexception {servletoutputstream sos = response.getOutputStream (); httpsession session = request.getSession (); int msgnum = integer.parseint (request.getParameter ("msgnum")); โฟลเดอร์โฟลเดอร์ = (โฟลเดอร์) เซสชัน GetAttribute ("โฟลเดอร์"); ลอง {ข้อความ msg = folder.getMessage (msgnum); // เมื่อประเภทข้อความไม่ได้ผสมหมายความว่าข้อความไม่มีไฟล์แนบและเนื้อหาข้อความจะถูกส่งออกโดยตรงถ้า (! msg.ismimeType ("multipart/mixed")) {response.setContentType ("ข้อความ/rfc822"); msg.writeto (SOS); } else {// ค้นหาและส่งออกเนื้อหาอีเมลในอีเมล Multipart MP = (Multipart) msg.getContent (); int bodynum = mp.getCount (); สำหรับ (int i = 0; i <bodynum; i ++) {bodypart bp = mp.getbodypart (i); / * * เมื่อส่วนหัวข้อความ MIME ไม่มีฟิลด์การจัดการและประเภทข้อความ MIME ไม่ได้ผสม * ระบุว่าข้อความ MIME ที่ได้รับในปัจจุบันคือร่างกายอีเมล */ถ้า (! bp.ismimeType ("multipart/mixed") && bp.getDisposition () == null) bp.writeto (SOS); }}}} catch (Exception E) {E.printStackTrace (); -ใช้เพื่อแสดงเนื้อหาอีเมล
handleattact.java
แพ็คเกจจดหมาย; นำเข้า java.io.ioexception; นำเข้า java.io.InputStream; นำเข้า Javax.mail.bodypart; นำเข้า Javax.mail.folder; นำเข้า Javax.mail.message; นำเข้า Javax.mail.multipart; นำเข้า Javax.servlet.servlete javax.servlet.http.httpservlet; นำเข้า javax.servlet.http.httpservletrequest นำเข้า Javax.servlet.http.httpservletResponse; นำเข้า javax.servlet.http.httpsession; {โมฆะสาธารณะ DOGET (คำขอ httpservletRequest, การตอบสนอง httpservletResponse) พ่น servletexception, ioexception {response.setContentType ("ข้อความ/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 ("ชื่อไฟล์"); โฟลเดอร์โฟลเดอร์ = (โฟลเดอร์) เซสชัน GetAttribute ("โฟลเดอร์"); ลอง {ข้อความ msg = folder.getMessage (msgnum); // ตั้งค่าประเภทส่วนหัวของข้อความเป็นการตอบสนองประเภทไฟล์แนบ setheader ("เนื้อหา-การจัดสรร", "ไฟล์แนบ; filename =" + ชื่อไฟล์); multipart multi = (multipart) msg.getContent (); bodypart bodypart = multi.getbodypart (bodynum); InputStream คือ = bodypart.getInputStream (); int c = 0; ในขณะที่ ((c = is.read ())! = -1) {out.write (c); }} catch (exception e) {e.printstacktrace (); -ใช้ในการจัดการสิ่งที่แนบมา
web.xml
<? xml version = "1.0" การเข้ารหัส = "utf-8"?> <web-app xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance" xmlns = "http://java.sun.com/xml xmlns: web = "http://java.sun.com/xml/ns/javaee" xmlns: web = "http://java.sun.com/xml/ns/javaee/web-app_2_5_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" เวอร์ชัน = "2.5" <welcome-file> index.html </welcome-file> <welcome-file> index.htm </welcome-file> <welcome-file> index.jsp </welcome-file> <welcome-file> index.jsp </welcome-file> <welcome-file> default.html </elest-file> </welcome-file-list> <servlet> <servlet-name> displayhead </servlet-name> <servlet-class> mail.displayhead </servlet-class> </servlet> <servlet-mapping> <servlet-name> displaycontent </servlet-name> <servlet-class> mail.displaycontent </servlet-lass> </servlet> <servlet-mapping> <servlet-mapping> <servlet-name> handleattach </servlet-name> <servlet-class> mail.handleattach </servlet-class> </servlet> <servlet-mapping> <servlet-mapping> <servlet-name> handleattach </servlet-name>
ก่อนอื่นให้เริ่มเซิร์ฟเวอร์ Tomcat จากนั้นป้อน http: // localhost: 8080/maildemo/index.html ในเบราว์เซอร์
ป้อนชื่อผู้ใช้และรหัสผ่าน (รหัสการอนุญาตจะต้องกรอกที่นี่รหัสการอนุญาตคืออะไรและตั้งค่าอย่างไร?)
แสดงรายการข้อความทั้งหมดในโฟลเดอร์เมล
คลิกเพื่อดูลิงค์อีเมล
คลิกชื่อไฟล์หลังจากไฟล์แนบเพื่อดาวน์โหลดไฟล์แนบที่เกี่ยวข้อง
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น