Artículo anterior Introducción a Javamail, el cuarto artículo al recibir correos electrónicos, no podemos leer el contenido impreso en la consola. De hecho, no es fácil dejarnos analizar un correo electrónico complejo por nosotros mismos. El formato y las especificaciones en el correo electrónico son muy complicados. Sin embargo, el navegador que utilizamos es el módulo de procesamiento de datos incorporado para analizar varios tipos de datos. Solo necesitamos especificar claramente a qué tipo de datos pertenece el flujo de datos antes de transmitir el flujo de datos al navegador. Después de eso, el navegador completará automáticamente todas las operaciones de análisis. La siguiente imagen puede explicar bien los pasos para analizar los correos electrónicos
1. Llame a GetFrom, GetSubject y otros métodos del objeto de mensaje para obtener el remitente y el asunto del correo electrónico, y llame al método GetContentType para obtener el tipo de correo electrónico;
2. Use el valor de retorno del método Message.getContentType para determinar el tipo de correo electrónico y llamar al método Message.getContent para obtener el contenido de correo electrónico. Si el tipo de correo electrónico es "texto/simple" o "texto/html", significa que el contenido de correo electrónico es texto sin formato. En este momento, llame al método GetContent del objeto Mensaje para obtener el contenido de correo electrónico y luego convierta el tipo de objeto devuelto en una cadena y lo envíe al software de visualización. Si el tipo de mensaje es "multipart/*", significa que el contenido del mensaje es un tipo compuesto. En este momento, el objeto compuesto por el mensaje Message.getContent debe convertirse en multipart.
3. Llame al método GetCount del objeto multipart para detectar cuántos objetos corporales se encapsulan en el objeto multipart, y elimine cada objeto de la parte del cuerpo en el objeto multipart uno por uno a través de un bucle para procesamiento.
4. Al procesar cada objeto Bodypart, primero llame al método GetContentType del objeto Bodypart para obtener su tipo MIME, y luego maneje las siguientes tres situaciones en función del tipo MIME:
Cuando el tipo MIME es "Texto/*", significa que el objeto Bodypart se almacena en los datos de texto plano, como se muestra en la figura anterior. En este momento, el método GetContent del primer objeto Bodypart y convierte el objeto devuelto en una cadena y lo lleva al software de visualización para la visualización.
Cuando el tipo MIME representa datos binarios como imágenes, sonidos o archivos adjuntos, como en la "imagen/gif" en la figura anterior, el método getDatahandler del objeto Bodypart se debe llamar a obtener el objeto Datahanlder encapsulado por los datos, y luego el método GetInputStream del objeto Datahandler se llama a obtener el objeto InputStream asociado con los datos. El contenido de datos binarios originales se puede obtener a través de este objeto InputStream.
Cuando el tipo MIME es "multipart/mixto", significa que el objeto Bodypart se almacena en el mensaje MIME compuesto. En este momento, se debe llamar al método GetContent del objeto BodyPart para obtener el objeto que encapsula el mensaje MIME compuesto y lo convierte en el tipo de multipart. Luego repita los pasos terceros y 4 para hacer llamadas recursivas al objeto multipart.
Escribamos un programa que recibe y analiza los archivos adjuntos
Pop3help.java
Paquete de correo; 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) {Propiedades prop = New Properties (); prop.setProperty ("mail.store.protocol", "pop3"); prop.setProperty ("mail.pop3.host", host); Session Mailsession = session.getDefaultInstance (Prop, NULL); MailSession.SetDebug (falso); intente {store store = mailsession.getstore ("pop3"); store.connect (host, nombre de usuario, contraseña); Carpeta de carpeta = store.getfolder ("bandeja de entrada"); carpeta.open (carpeta.read_write); carpeta de retorno; } catch (Exception e) {E.PrintStackTrace (); } return null; }}Esta clase se usa para conectarse e iniciar sesión en el servidor POP3 y devolver el objeto de carpeta que representa la carpeta de correo
index.html
<html> <fead> <title> login.html </title> </head> <body> <form de action = "login.jsp" método = "post"> nombre de host: <input name = "host" type = "text"> <br/> username: <input name = "usernerNe" type = "text"> <br/> contraseña: <name de entrada = "contraseña"> <BR/> <type type "de userName" valor = "enviar"> <input type = "reset" value = "reset"> </form> </body> </html>
Página de inicio de sesión, el usuario debe completar el nombre del host, el nombre de usuario y la contraseña del servidor de correo
Login.jsp
<%@ page import = "javax.mail.*, mail.*" contentType = "text/html; charset = gb2312"%> <%string host = request.getParameter ("host"); String UserName = request.getParameter ("UserName"); Cadena contraseña = request.getParameter ("contraseña"); Cadena de = ""; String SUMPLAY = ""; Carpeta de carpeta = pop3help.getfolder (host, nombre de usuario, contraseña); session.SetAttribute ("carpeta", carpeta); Mensaje [] mensajes = carpeta.getMessages (); for (int i = 0; i <mensajes.length; i ++) {try {from = mensajes [i] .getFrom () [0] .ToString (); sujeto = mensajes [i] .getSubject (); out.print (i + 1);%> dirección del remitente: <%= de%> sujeto de correo electrónico: <%= temas%> <a href = "displaymsg.jsp? msgnum = <%= i + 1%>"> Ver correo electrónico </a> <br/> <%} Catch (excepción e) {}}%>Obtenga todos los mensajes en la carpeta de correo
displaymsg.jsp
<Frameset Rows = "25%,*"> <Frame src = "/mailDemo/displayhead? msgnum = <%= request.getParameter (" msgnum ")%>" scrolling = "no"> <frame src = "/mailDemo/displaycontent? msgnum = <%= requestInformación utilizada para mostrar correos electrónicos
Displayhead.java
paquete de correo; 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.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.htpsession; @SuPression; Class Displayhead extiende httpservlet {public void doget (httpservletRequest solicitud, httpservletResponse respuesta) arroja servletException, ioexception {respuesta.setContentType ("text/html; charset = gb2312"); PrintWriter out = Response.getWriter (); Httpsession session = request.getSession (); int msgnum = integer.parseInt (request.getParameter ("msgnum")); Carpeta de carpeta = (carpeta) session.getAttribute ("carpeta"); intente {Mensaje msg = folder.getMessage (msgnum); Cadena de = msg.getFrom () [0] .ToString (); String SUMPORT = msg.getSubject (); Cadena sendDate = dateFormat.getInstance (). Format (msg.getSentDate ()); out.Println ("Asunto de correo:" + sujeto + "<br/>"); out.println ("remitente:" + desde + "<br/>"); out.println ("Enviar fecha:" + SendDate + "<br/> <br/>"); System.out.println ("ContentType:" + msg.getContentType ()); // Si el mensaje es una combinación "multipart/*", puede contener archivos adjuntos, etc. (msg.ismiteType ("multipart/*")) {multipart mp = (multipart) msg.getContent (); for (int i = 0; i <mp.getCount (); i ++) {bodypart bp = mp.getBodyPart (i); // Si el objeto Bodypart contiene archivos adjuntos, debe analizarse si (bp.getDisposition ()! = Null) {string filename = bp.getFileName (); System.out.println ("FileName:" + FileName); if (filename.startswith ("=?")) {// codifica el nombre del archivo para cumplir con la especificación RFC822 filename = mimeUtility.decodetext (nombre de archivo); } // Generar un hipervínculo para abrir el archivo adjunto.print ("adjuntar:"); out.print ("<a href = handleatTach? msgnum =" + msgnum + "&& bodynum =" + i + "&& filename =" + nombre de archivo + ">" + nombre de archivo + "</a> <br/>"); }}}} Catch (Exception e) {E.PrintStackTrace (); }}}Se usa para mostrar el contenido del encabezado de correo electrónico
DisplayContent.java
paquete de correo; 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; import javax.servlet.http. javax.servlet.http.httpservletRequest; import javax.servlet.http.httpservletResponse; import javax.servlet.http.httpsession; @Suppresswarnings ("serial") La clase pública DisplayContent extiende httpservlet {public void doget (hetget (httpress. Respuesta httpServletResponse) lanza ServletException, ioException {ServLetOutputStream SOS = Response.getOutputStream (); Httpsession session = request.getSession (); int msgnum = integer.parseInt (request.getParameter ("msgnum")); Carpeta de carpeta = (carpeta) session.getAttribute ("carpeta"); intente {Mensaje msg = folder.getMessage (msgnum); // Cuando el tipo de mensaje no se mezcla, significa que el mensaje no contiene archivos adjuntos, y el contenido del mensaje se produce directamente si (! Msg.IsMiMetype ("multipart/mixed")) {Response.setContentType ("Mensaje/RFC822"); Msg.WriteTo (SOS); } else {// Buscar y emitir el cuerpo de correo electrónico en el correo electrónico multipart mp = (multipart) msg.getContent (); int bodyNum = mp.getCount (); for (int i = 0; i <bodyNum; i ++) {Bodypart bp = mp.getBodyPart (i); / * * Cuando el encabezado del mensaje MIME no contiene el campo de disposición, y el tipo de mensaje MIME no se mezcla, * indica que el mensaje MIME obtenido actualmente es el cuerpo de correo electrónico */if (! Bp.ismiteType ("multipart/mixed") && bp.getDisposition () == null) {Response.setContentTypePe ("mensaje/rfc822");;; bp.writeTo (SOS); }}}} Catch (Exception e) {E.PrintStackTrace (); }}}Se usa para mostrar el cuerpo de correo electrónico
Handleattact.java
paquete de correo; 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.servletutstream; javax.servlet.http.httpservlet; import javax.servlet.http.httpservletRequest; import javax.servlet.http.httpServletResponse; import javax.servlet.http.httpsession; {public void doget (httpservletRequest solicitud, respuesta httpservletResponse) lanza ServletException, ioException {Response.SetContentType ("Text/Html"); Httpsession session = request.getSession (); ServLetOutputStream Out = Response.getOutputStream (); int msgnum = integer.parseInt (request.getParameter ("msgnum")); int Cadena filename = request.getParameter ("FileName"); Carpeta de carpeta = (carpeta) session.getAttribute ("carpeta"); intente {Mensaje msg = folder.getMessage (msgnum); // Establezca el tipo de encabezado del mensaje en la respuesta del tipo de archivo adjunto. Multipart multi = (multipart) msg.getContent (); Bodypart Bodypart = Multi.getBodyPart (BodyNum); InputStream es = BodyPart.getInputStream (); int c = 0; while ((c = is.read ())! = -1) {out.write (c); }} catch (Exception e) {E.PrintStackTrace (); }}}Se usa para manejar los archivos adjuntos
web.xml
<? xml versión = "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/web-app_2_5.xsd" id = "webapp_id" version = "2.5"> <portsname> maildemo </exhibido name> <welcome-filist> <wheday-file-list> <Belle Welcome-File> index.html </aude-file> <Welcome-file> index.htm </velcome-file> <welcome-file> index.jsp </leadde-file> <welcome-file> index.jsp </welcome-file> <calle-file> default.html </welcome-file> <beating-file> default.htm </bienvenido-file> <beleve-file.jsp </welcome-file> <velidente-file--filed </Welcome-File-List> <Servlet> <Servlet-name> Displayhead </servlet-name> <ervlet-class> mail.displayhead </servlet-class> </servlet> <ervlet-mapping> <ervlet-name> displayhead </servlet-name> <url-pattern>/displayhead </ url-pattern> </servlet-mapping> <ervlet> <Servlet-name> DisplayContent </servlet-name> <ervlet-class> mail.displaycontent </servlet-class> </servlet> <servlet-mapping> <servlet mapping> <ervlet-name> displayContent </servlet-name> <url-pattern>/displaycontent </ url-pattern> </servlet-papping> <ervlet> <ervlet> <Servlet-name> handleatTach </servlet-name> <ervlet-class> mail.handleattach </servlet-class> </servlet> <ervlet-mapping> <ervlet-mapping> <ervlet-name> handleattach </servlet-name> <url-pattern>/handleattach </ url-pattern> </servletxpapping> </web-app-papp
Primero inicie el servidor Tomcat y luego ingrese http: // localhost: 8080/maildemo/index.html en el navegador
Ingrese el nombre de usuario y la contraseña (el código de autorización debe completarse aquí. ¿Cuál es el código de autorización y cómo se establece?)
Enumere todos los mensajes en la carpeta de correo
Haga clic para ver el enlace de correo electrónico
Haga clic en el nombre del archivo después del archivo adjunto para descargar el archivo adjunto correspondiente.
Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.