Artigo anterior AIntrodução ao Javamail, o quarto artigo do recebimento de e -mails, não podemos ler o conteúdo impresso no console. De fato, não é fácil nos deixar analisar um e -mail complexo por nós mesmos. O formato e as especificações no email são muito complicados. No entanto, o navegador que usamos é o módulo de processamento de dados interno para analisar vários tipos de dados. Precisamos especificar claramente a qual tipo de dados o fluxo de dados pertence antes de transmitir o fluxo de dados para o navegador. Depois disso, todas as operações de análise serão concluídas automaticamente pelo navegador. A imagem a seguir pode explicar as etapas para analisar bem os e -mails
1. Ligue para o objeto GETFROM, GetSubject e outros métodos do objeto de mensagem para obter o remetente e o assunto do email e ligue para o método getContentType para obter o tipo do email;
2. Use o valor de retorno do método da mensagem. Se o tipo de email for "texto/plano" ou "texto/html", isso significa que o conteúdo do email é um texto simples. No momento, ligue para o método getContent do objeto de mensagem para obter o conteúdo de email e converter o tipo de objeto retornado em uma string e enviá -lo para o software de exibição. Se o tipo de mensagem for "Multipart/*", significa que o conteúdo da mensagem é um tipo composto. No momento, o objeto composto pelo método da mensagem.GetContent precisa ser convertido em multipart.
3. Chame o método getCount do objeto Multipart para detectar quantos objetos corporais são encapsulados no objeto Multipart e retirar cada objeto de parte do corpo no objeto multipart um por um a um loop para processamento.
4. Ao processar cada objeto BodyPart, primeiro chame o método getContentType do objeto BodyPart para obter seu tipo MIME e depois lidar com as três situações a seguir com base no tipo MIME:
Quando o tipo MIME é "Texto/*", significa que o objeto BodyPart é armazenado em dados de texto sem formatação, como mostrado na figura acima. Neste momento, o método GetContent do primeiro objeto BodyPart e converte o objeto retornado em uma string e a produza para o software de exibição para exibição.
When the MIME type represents binary data such as pictures, sounds, or attachments, as in the "image/gif" in the figure above, the getDataHandler method of the BodyPart object should be called to obtain the DataHanlder object encapsulated by the data, and then the getInputStream method of the DataHandler object is called to obtain the InputStream object associated with the data. O conteúdo original de dados binários pode ser obtido através deste objeto InputStream.
Quando o tipo MIME é "Multipart/Mixed", significa que o objeto BodyPart é armazenado na mensagem MIME composta. No momento, o método GetContent do objeto BodyPart deve ser chamado para obter o objeto que encapsula a mensagem MIME composta e a converte no tipo multipart. Em seguida, repita as 3ª e 4ª etapas para fazer chamadas recursivas para o objeto multipart.
Vamos escrever um programa que receba e analisa os anexos
Pop3help.java
pacote Mail; importar java.util.properties; importar javax.mail.folder; importar javax.mail.session; importar javax.mail.store; classe pública pop3help {public static pasta getFolder (string host, string username, string senha) {Propriedades prop = novas propriedades (); Prop.SetProperty ("Mail.store.protocol", "POP3"); Prop.SetProperty ("Mail.pop3.host", host); Session MailSession = session.getDefaultInstance (Prop, null); MailSession.SetDebug (false); tente {store store = mailsession.getstore ("pop3"); store.connect (host, nome de usuário, senha); Pasta pasta = store.getFolder ("Caixa de entrada"); pasta.open (pasta.read_write); pasta de retorno; } catch (Exceção e) {e.printStackTrace (); } retornar nulo; }}Esta classe é usada para conectar e fazer login no servidor POP3 e retornar o objeto de pasta que representa a pasta de email
index.html
<html> <head> <title> login.html </title> </head> <body> <form action = "login.jsp" method = "post"> nome do host: <input name = "host" type = "text"> <br/> nome de usuário: <input name = "username" "type =" "> <br/> value = "submeter"> <input type = "reset" value = "redefin
Página de login, o usuário precisa preencher o nome do host, nome de usuário e senha do servidor de correio
login.jsp
<%@ página import = "javax.mail.*, Mail.*" contentType = "text/html; charset = gb2312"%> <%string host = request.getParameter ("host"); String userName = request.getParameter ("nome de usuário"); String senha = request.getParameter ("senha"); String de = ""; String sujeito = ""; Pasta pasta = pop3help.getFolder (host, nome de usuário, senha); session.setAttribute ("pasta", pasta); Mensagem [] mensagens = pasta.getMessages (); for (int i = 0; i <messages.length; i ++) {tente {de = messages [i] .getFrom () [0] .ToString (); sujeito = mensagens [i] .getSubject (); out.print (i + 1);%> Endereço do remetente: <%= de%>Obtenha todas as mensagens na pasta de email
displaymsg.jsp
<Frameset linhas = "25%,*"> <ardem src = "/maildemo/displayhead? msgnum = <%= request.getParameter (" msgnum ")%>" scrolling = "no"> <estrutura src = "/Maildemo/displayContent?Informações usadas para exibir e -mails
Displayhead.java
pacote Mail; importar java.io.ioException; importar java.io.printwriter; importar java.text.dateFormat; importar javax.mail.bodypart; importar javax.mail.folder; importação; javax.servlet.servletexception; importar javax.servlet.http.httpServlet; importar javax.servlet.http.httpServletRequest; importar javax.servlet.http.httpsletletLear javax.servlet.http.httpSession; @suppresswarnings ("serial") public classe Displayhead estende httpServlet {public void Doget (httpServleTrequest Solicy, httpsVletResponse Response) lança servleTexception, ioxception {{ Response.setContentType ("Text/html; charset = gb2312"); PrintWriter out = Response.getWriter (); Session httpSession = request.getSession (); int msgnum = Integer.parseint (request.getParameter ("msgnum")); Pasta pasta = (pasta) session.getAttribute ("pasta"); tente {mensagem msg = pasta.getMessage (msgnum); String de = msg.getFrom () [0] .ToString (); String sujeito = msg.getSubject (); String sendDate = dateFormat.getInstance (). Formato (msg.getSentDate ()); out.println ("Assunto do correio:" + sujeito + "<br/>"); out.println ("remetente:" + de + "<br/>"); out.println ("Data de envio:" + sendDate + "<br/> <br/>"); System.out.println ("contentType:" + msg.getContentType ()); // Se a mensagem for uma combinação "Multipart/*", ela pode conter acessórios, etc. (msg.ismimeType ("multipart/*")) {multipart mp = (multipart) msg.getContent (); for (int i = 0; i <mp.getCount (); i ++) {BodyPart bp = mp.getBodyPart (i); // Se o objeto BodyPart contiver anexos, ele deve ser analisado se (bp.getdispition ()! = Null) {string filename = bp.getfilename (); System.out.println ("nome do arquivo:" + nome do arquivo); if (filename.startswith ("=?")) {// codifica o nome do arquivo para cumprir com o nome da especificação RFC822 (MIMEUTILIDADE.DECODETEXT (nome do arquivo); } // Gere um hiperlink para abrir o anexo out.print ("Anexe:"); out.print ("<a href = handleattach? msgnum =" + msgnum + "&& bodynum =" + i + "&& filename =" + filename + ">" + nome do arquivo + "</a> <br/>"); }}}} catch (Exceção e) {e.printStackTrace (); }}}Usado para exibir o conteúdo do cabeçalho de email
DisplayContent.java
pacote Mail; importar java.io.ioException; importar javax.mail.bodypart; importar javax.mail.folder; importar javax.mail.message; importar javax.mail.multipart; importTeNtSTerenTrenTrenTregn.porttlet.ServleTlexcept. javax.servlet.http.httpServletRequest; importar javax.servlet.http.httpServletResponse; importar javax.servlet.http.httpSession; @supresswarnings ("serial) a classe pública (a classe do httpersLeTLETSELTTETLETSLETSLETSLETSLETSTRPSSISTLET {PULPULTLINGSELTET (Public) HTTPSERVletResponse Response) lança servleTexception, ioexception {servletOutputStream SOS = Response.getOutputStream (); Session httpSession = request.getSession (); int msgnum = Integer.parseint (request.getParameter ("msgnum")); Pasta pasta = (pasta) session.getAttribute ("pasta"); tente {mensagem msg = pasta.getMessage (msgnum); // Quando o tipo de mensagem não é misto, significa que a mensagem não contém anexos e o conteúdo da mensagem é em saída diretamente se (! Msg.ismimeType ("multipart/mixed")) {Response.setContentType ("message/rfc822"); msg.WritEto (SOS); } else {// Encontre e saia o corpo de email no e -mail multipart mp = (multipart) msg.getContent (); int bodynum = mp.getCount (); for (int i = 0; i <bodynum; i ++) {BodyPart bp = mp.getBodyPart (i); / * * Quando o cabeçalho da mensagem MIME não contém o campo de disposição, e o tipo de mensagem MIME não é misturado, * indica que a mensagem MIME atualmente obtida é o corpo de email */if (! Bp.ismimeType ("multipart/mixed") && bp.getDisposition () == Null) {Response.SetContentType (RF/RFE "/" RESPOSTION2 "2) e "REPLETTION2) e" REMPRESSIGNEM2/REMPRESSIGNEM2/"REPLETTION2) e" REMPORT) e "REMPORT) &" REMPRESSIFICAÇÃO/REMPORTEC)/"REPLETTION2) &" REMPENSIFICATION2/"REMPORTE "2). BP.WRITETO (SOS); }}}} catch (Exceção e) {e.printStackTrace (); }}}Usado para exibir o corpo de e -mail
Handleattact.java
pacote Mail; importar java.io.ioException; importar java.io.inputStream; importar javax.mail.bodypart; importar javax.mail.Folder; importar javax.mail.message; importesterpTex.mail.multipart; import javax.servlet.sertLeaMPeptEception; javax.servlet.http.httpServlet; importar javax.servlet.http.httpServletRequest; importar javax.servlet.http.httpSertLeTSestons; {public void Doget (solicitação httpServletRequest, httpServletResponse resposta) lança servletexception, ioexception {Response.setContentType ("text/html"); Session httpSession = request.getSession (); ServletOutputStream Out = Response.getOutputStream (); int msgnum = Integer.parseint (request.getParameter ("msgnum")); int bodynum = Integer.parseint (request.getParameter ("bodynum")); String filename = request.getParameter ("nome do arquivo"); Pasta pasta = (pasta) session.getAttribute ("pasta"); tente {mensagem msg = pasta.getMessage (msgnum); // Defina o tipo de cabeçalho da mensagem para o tipo de anexo Response.setheader ("Content-Disposition", "Applement; FileName =" + FileName); Multi -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 (Exceção e) {e.printStackTrace (); }}}Usado para lidar com acessórios
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.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">>> <lorde-File> index.html </ld-Welcome> <lmed-File> index.htm </limk-File> <ldenm-File> index.jsp </limk-File> <ldengry-file> index.jsp </lding -file> <lorde-file> default.html </welcome> <lorda-fil> default> <lorda-file> default.html </welcome> <lorda-fil> </list-File-List> <Verlet> <Servlet-name> Displayhead </servlet-name> <Servlet-class> Mail.displayhead </vlect-class> </servlet> <Verlet-Mapping> <Servlet-Name> Displayhead </Servlet> <url-Pattern>/Displayhead </url-Pattern> <///Servlet> <Verlet-name> DisplayContent </Servlet-Name> <Servlet-Class> Mail.DisplayContent </Servlet-Class> </Servlet> <Servlet-Mapping> <Vapp-Mapping> <Servlet-Name> DisplayContent </Servlet> <url-Pattern>/Display> <Verlet-name> handleattach </servlet-name> <Servlet-class> Mail.handleattach </servlet-class> </servlet> <sutlet-mapping> <Vapp-Mapping> <Vertlet-Name> handleattach </servlet-name> <url-pattern>/handleattach- </url-tattern> </servlet> <rirl-pattern>/handleattach-
Inicie o servidor Tomcat e depois digite http: // localhost: 8080/Maildemo/index.html no navegador
Digite o nome de usuário e a senha (o código de autorização precisa ser preenchido aqui. Qual é o código de autorização e como ele está definido?)
Liste todas as mensagens na pasta de email
Clique para ver o link de e -mail
Clique no nome do arquivo após o anexo para baixar o anexo correspondente.
O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.