المقالة السابقة إلى Javamail ، المقالة الرابعة في تلقي رسائل البريد الإلكتروني ، لا يمكننا قراءة المحتوى المطبوع على وحدة التحكم. في الواقع ، ليس من السهل السماح لنا بتحليل بريد إلكتروني معقد من قبل أنفسنا. التنسيق والمواصفات في البريد الإلكتروني معقدة للغاية. ومع ذلك ، فإن المتصفح الذي نستخدمه هو وحدة معالجة البيانات المضمنة لتحليل أنواع البيانات المختلفة. نحتاج فقط إلى تحديد نوع البيانات الذي ينتمي إليه دفق البيانات قبل إرسال دفق البيانات إلى المتصفح. بعد ذلك ، سيتم إكمال جميع عمليات التحليل تلقائيًا بواسطة المتصفح. يمكن أن تشرح الصورة التالية الخطوات لتحليل رسائل البريد الإلكتروني جيدًا
1. اتصل بـ getFrom و GetSubject وطرق أخرى لكائن الرسالة للحصول على المرسل وموضوع البريد الإلكتروني ، واستدعاء طريقة getContentType للحصول على نوع البريد الإلكتروني ؛
2. استخدم قيمة الإرجاع لطريقة message.getContentType لتحديد نوع البريد الإلكتروني ، واستدعاء طريقة message.getContent للحصول على محتوى البريد الإلكتروني. إذا كان نوع البريد الإلكتروني هو "نص/عادي" أو "نص/html" ، فهذا يعني أن محتوى البريد الإلكتروني هو نص عادي. في هذا الوقت ، اتصل بطريقة getContent لكائن الرسالة للحصول على محتوى البريد الإلكتروني ، ثم تحويل نوع الكائن الذي تم إرجاعه إلى سلسلة وإخراجه إلى برنامج العرض. إذا كان نوع الرسالة "multipart/*" ، فهذا يعني أن محتوى الرسالة هو نوع مركب. في هذا الوقت ، يجب تحويل الكائن المركب بواسطة message.getContent إلى Multipart.
3. استدعاء طريقة getCount للكائن المتعدد لاكتشاف عدد كائنات bodypart التي يتم تغليفها في الكائن المتعدد ، وأخذ كل كائن bodypart في كائن متعدد الأطوار واحد تلو الآخر من خلال حلقة للمعالجة.
4. عند معالجة كل كائن bodypart ، اتصل أولاً بطريقة getContentType لكائن bodypart للحصول على نوع MIME الخاص به ، ثم التعامل مع المواقف الثلاثة التالية بناءً على نوع MIME:
عندما يكون نوع MIME هو "نص/*" ، فهذا يعني أن كائن BodyPart يتم تخزينه في بيانات النص العادي ، كما هو موضح في الشكل أعلاه. في هذا الوقت ، طريقة getContent لكائن BodyPart الأول وتحويل الكائن الذي تم إرجاعه إلى سلسلة وإخراجه إلى برنامج العرض للعرض.
عندما يمثل نوع MIME بيانات ثنائية مثل الصور أو الأصوات أو المرفقات ، كما هو الحال في "الصورة/GIF" في الشكل أعلاه ، يجب استدعاء طريقة getDatahandler لكائن bodypart للحصول على كائن Datahanlder المغطى بالبيانات ، ثم يتم استدعاء طريقة getInputStream لكائن Datahandler للحصول على كائن المدخلات المرتبطة بالبيانات. يمكن الحصول على محتوى البيانات الثنائية الأصلية من خلال هذا الكائن inputstream.
عندما يكون نوع MIME "متعدد/مختلط" ، فهذا يعني أن كائن BodyPart يتم تخزينه في رسالة MIME المركب. في هذا الوقت ، يجب استدعاء طريقة getContent لكائن bodypart للحصول على الكائن الذي يلف رسالة MIME المركب وتحويلها إلى نوع متعدد. ثم كرر الخطوتين الثالث والرابع لإجراء مكالمات متكررة إلى كائن متعدد.
دعنا نكتب برنامجًا يتلقى وتوصيف المرفقات
pop3help.java
حزمة البريد ؛ استيراد java.util.properties ؛ استيراد javax.mail.folder ؛ استيراد javax.mail.session ؛ استيراد javax.mail.store ؛ pop3help class pop3help {public static folder getFolder (string host ، string username ، string password) {proberties 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 (المضيف ، اسم المستخدم ، كلمة المرور) ؛ مجلد المجلد = store.getFolder ("Inbox") ؛ Folder.Open (folder.read_write) ؛ مجلد العودة } catch (استثناء e) {E.PrintStackTrace () ؛ } إرجاع فارغ ؛ }}يتم استخدام هذه الفئة لتوصيل وتسجيل الدخول إلى خادم POP3 وإرجاع كائن المجلد الذي يمثل مجلد البريد
index.html
<html> <head> <title> login.html </title> </head> <body> <form> action = "login.jsp" method = "post"> اسم المضيف: <input name = "host" type = "text"> <br/> username: <input name = "username" type = "text"> <type type = "reset" value = "reset"> </pong> </body> </html>
صفحة تسجيل الدخول ، يحتاج المستخدم إلى ملء اسم المضيف واسم المستخدم وكلمة المرور لخادم البريد
login.jsp
<٪@ page import = "javax.mail.*، mail.*" contentType = "text/html ؛ charset = gb2312" ٪> <٪ string host = request.getParameter ("host") ؛ username string = request.getParameter ("اسم المستخدم") ؛ سلسلة كلمة مرور = request.getParameter ("كلمة المرور") ؛ سلسلة من = "" ؛ موضوع السلسلة = "" ؛ مجلد المجلد = pop3help.getfolder (المضيف ، اسم المستخدم ، كلمة المرور) ؛ Session.setAttribute ("المجلد" ، المجلد) ؛ رسالة [] الرسائل = folder.getMessages () ؛ لـ (int i = 0 ؛ i <messages.length ؛ i ++) {try {from = messages [i] .getFrom () [0] .ToString () ؛ الموضوع = الرسائل [i] .getSubject () ؛ out.print (i + 1) ؛ ٪> عنوان المرسل: <٪ = من ٪> موضوع البريد الإلكتروني: <٪ = موضوع ٪> <a href = "displaymsg.jsp؟ msgnum = <٪ = i + 1 ٪>"احصل على جميع الرسائل في مجلد البريد
DisplayMsg.jsp
<الإطارات صفوف = "25 ٪ ،*"> <الإطار src = "/maildemo/displayhead؟ msgnum = <٪ = request.getParameter (" msgnum ") ٪>" scrolling = "no"> <frame src = "scroll/" scrolling = "no"المعلومات المستخدمة لعرض رسائل البريد الإلكتروني
Displayhead.java
حزمة البريد ؛ استيراد java.io.ioException ؛ استيراد java.io.printwriter ؛ استيراد java.text.dateformat ؛ استيراد javax.mail.bodypart ؛ استيراد javax.mail.folder javax.servlet.servletexception ؛ استيراد javax.servlet.http.httpservlet يمتد Class Displayhead Httpservlet {public void doget (طلب httpservletrequest ، استجابة httpservletresponse) servleTexception ، ioException {response.setContentType ("text/html ؛ charset = gb2312") ؛ printWriter out = response.getWriter () ؛ جلسة httpsession = request.getSession () ؛ int msgnum = integer.parseint (request.getParameter ("msgnum")) ؛ مجلد المجلد = (المجلد) session.getAttribute ("المجلد") ؛ حاول {message msg = folder.getMessage (msgnum) ؛ سلسلة من = msg.getFrom () [0] .ToString () ؛ موضوع السلسلة = msg.getSubject () ؛ String sendDate = dateFormat.getInstance (). format (msg.getSentDate ()) ؛ Out.println ("موضوع البريد:" + الموضوع + "<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 ("filename:" + filename) ؛ if (filename.startswith ("=؟")) {// encode اسم الملف للامتثال مع filename rfc822 = mimeutility.decodetext (اسم الملف) ؛ } // إنشاء ارتباط تشعبي لفتح المرفق. out.print ("<a href = handleattach؟ msgnum =" + msgnum + "&& bodynum =" + i + "&& filename =" + filename + ">" + filename + "</a> <br/>") ؛ }}}} catch (استثناء e) {E.PrintStackTrace () ؛ }}}تستخدم لعرض محتوى رأس البريد الإلكتروني
DisplayContent.java
حزمة البريد ؛ استيراد java.io.ioException ؛ استيراد javax.mail.bodypart ؛ استيراد javax.mail javax.servlet.http.httpservletrequest ؛ import javax.servlet.http.httpservletresponse ؛ import javax.servlet.http.httpsession httpservletresponse استجابة) يلقي servleTexception ، ioException {servleToutPutStream SOS = response.getOutputStream () ؛ جلسة httpsession = request.getSession () ؛ int msgnum = integer.parseint (request.getParameter ("msgnum")) ؛ مجلد المجلد = (المجلد) session.getAttribute ("المجلد") ؛ حاول {message msg = folder.getMessage (msgnum) ؛ // عندما لا يتم خلط نوع الرسالة ، فهذا يعني أن الرسالة لا تحتوي على مرفقات ، ويتم إخراج محتوى الرسالة بشكل مباشر إذا (! msg.ismiMetype ("multipart/mixed")) {response.setContentType ("message/rfc822") ؛ msg.writeto (SOS) ؛ } else {// البحث عن وإخراج هيكل البريد الإلكتروني في البريد الإلكتروني multiRt mp = (multipart) msg.getContent () ؛ int bodynum = mp.getCount () ؛ لـ (int i = 0 ؛ i <bodynum ؛ i ++) {bodypart bp = mp.getBodyPart (i) ؛ / * * عندما لا يحتوي رأس رسالة MIME على حقل التصرف ، ونوع رسالة MIME غير مختلط ، يشير * إلى أن رسالة MIME التي تم الحصول عليها حاليًا هي جسم البريد الإلكتروني */if (! bp.ismimetype ("multipart/mixed") && bp.getDisposition () == null) BP.Writeto (SOS) ؛ }}}} catch (استثناء e) {E.PrintStackTrace () ؛ }}}تستخدم لعرض هيكل البريد الإلكتروني
HandleAttact.java
حزمة البريد ؛ استيراد java.io.ioException ؛ استيراد java.io.inputstream ؛ استيراد javax.mail.bodypart ؛ استيراد javax.mail.folder ؛ استيراد javax.mail.message javax.servlet.http.httpservlet ؛ استيراد javax.servlet.http.httpletrequest {طلب doget public void (httpservletrequest ، استجابة httpservletresponse) يلقي servleTexception ، ioException {reponse.setContentType ("text/html") ؛ جلسة httpsession = request.getSession () ؛ servleToutPutStream out = response.getOutputStream () ؛ int msgnum = integer.parseint (request.getParameter ("msgnum")) ؛ int bodynum = integer.parseint (request.getParameter ("bodynum")) ؛ اسم ملف السلسلة = request.getParameter ("اسم الملف") ؛ مجلد المجلد = (المجلد) session.getAttribute ("المجلد") ؛ حاول {message msg = folder.getMessage (msgnum) ؛ // قم بتعيين نوع رأس الرسالة على استجابة نوع المرفق. multi multi = (multipart) msg.getContent () ؛ bodypart bodypart = multi.getBodyPart (bodynum) ؛ inputStream هو = bodypart.getInputStream () ؛ int c = 0 ؛ بينما ((c = is.read ())! = -1) {out.write (c) ؛ }} catch (استثناء e) {E.PrintStackTrace () ؛ }}}تستخدم للتعامل مع المرفقات
web.xml
<؟ xmlns: web = "http://java.sun.com/xml/ns/javaee" XSI: schemalocation = "http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5 <self-file> index.html </ishified-file> <lispile> index.htm </ishified-file> <lispile-file> index.jsp </ishified-file> <lispile-file> index.jsp </elvering-file> default> default </iship-file-list> <-servlet> <vishlet-name> displayhead </quartlet-name> <Servlet-class> mail.displayhead </servlet-class> </servlet> <Crevlet Mapping> <Srevlet-Name> DisplayContent </servlet-name> <Verlet-Class> mail.displayContent </servlet-class> </rectlet> <stervlet mapping> <sterled mapping> <cervlet-name> DisplayContent </rectlet-name> <url-patern> <Srevlet-Name> HandleAttach </servlet-name> <Verlet-Class> mail.handleattach </revlet-class> </rectlet> <sterled mapping> <sterlet-mapping> <ustlet-name> handleattach </perlet-name> <url-patern>
ابدأ أولاً خادم Tomcat ، ثم أدخل http: // localhost: 8080/maildemo/index.html في المتصفح
أدخل اسم المستخدم وكلمة المرور (يجب ملء رمز التفويض هنا. ما هو رمز التفويض وكيف يتم تعيينه؟)
قائمة جميع الرسائل في مجلد البريد
انقر لعرض رابط البريد الإلكتروني
انقر فوق اسم الملف بعد المرفق لتنزيل المرفق المقابل.
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.