以前の記事では、電子メールを受信する4番目の記事であるJavamailに導入されましたが、コンソールに印刷されたコンテンツを読み取ることはできません。実際、複雑な電子メールを自分で分析できるようにするのは簡単ではありません。メールの形式と仕様は非常に複雑です。ただし、使用するブラウザは、さまざまなデータ型を分析するための組み込みデータ処理モジュールです。データストリームをブラウザに送信する前に、データ型を明確に指定する必要があります。その後、すべての解析操作はブラウザによって自動的に完了します。次の写真は、電子メールをうまく解析する手順を説明できます
1. getfrom、getSubject、およびメッセージオブジェクトのその他のメソッドを呼び出して、電子メールの送信者と件名を取得し、getContentTypeメソッドを呼び出して電子メールのタイプを取得します。
2。message.getContentTypeメソッドのreturn値を使用して電子メールタイプを決定し、message.getContentメソッドを呼び出して電子メールコンテンツを取得します。電子メールの種類が「テキスト/プレーン」または「テキスト/HTML」の場合、電子メールコンテンツがプレーンテキストであることを意味します。この時点で、メッセージオブジェクトのGetContentメソッドを呼び出して電子メールコンテンツを取得し、返されたオブジェクトのタイプを文字列に変換し、表示ソフトウェアに出力します。メッセージタイプが「MultiPart/*」の場合、メッセージコンテンツが複合型であることを意味します。現時点では、message.getContentメソッドによって複合されたオブジェクトをマルチパートに変換する必要があります。
3.マルチパートオブジェクトのgetCountメソッドを呼び出して、マルチパートオブジェクトにカプセル化されているボディパートオブジェクトの数を検出し、マルチパートオブジェクトの各ボディパートオブジェクトを1つずつ取り出して、処理のためにループを使用します。
4.各ボディパートオブジェクトを処理するときは、最初にボディパートオブジェクトのgetContentTypeメソッドを呼び出してMIMEタイプを取得し、次にMIMEタイプに基づいて次の3つの状況を処理します。
MIMEタイプが「テキスト/*」の場合、上記の図に示すように、ボディパートオブジェクトがプレーンテキストデータに保存されることを意味します。この時点で、最初のボディパートオブジェクトのGetContentメソッドと、返されたオブジェクトを文字列に変換し、表示用のディスプレイソフトウェアに出力します。
上記の図の「画像/GIF」のように、MIMEタイプが写真、サウンド、または添付ファイルなどのバイナリデータを表す場合、ボディパートオブジェクトのGetDatahandlerメソッドを呼び出して、データによってカプセル化されたデータハンダーオブジェクトを取得し、データハンラーオブジェクトのGetInputStreamメソッドを取得する必要があります。元のバイナリデータコンテンツは、このinputstreamオブジェクトを介して取得できます。
MIMEタイプが「マルチパート/混合」の場合、ボディパートオブジェクトが複合MIMEメッセージに保存されることを意味します。この時点で、BodyPartオブジェクトのGetContentメソッドを呼び出して、複合MIMEメッセージをカプセル化してマルチパートタイプに変換するオブジェクトを取得する必要があります。次に、3番目と4番目のステップを繰り返して、マルチパートオブジェクトに再帰的な呼び出しを行います。
添付ファイルを受信して解析するプログラムを書きましょう
pop3help.java
パッケージメール; java.util.propertiesのインポート;インポートjavax.mail.folder; import javax.mail.session; import javax.mail.store; public class pop3help {public staticフォルダーgetFolder(String Host、String username、String Password){Properties Prop = new Properties( prop.setProperty( "mail.store.protocol"、 "pop3"); prop.setProperty( "mail.pop3.host"、host);セッションメールセッション= session.getDefaultInstance(prop、null); mailSession.setDebug(false); try {store store = mailsession.getStore( "pop3"); store.connect(host、username、password); Folder folder = store.getFolder( "Inbox"); folder.open(folder.read_write);フォルダーを返します。 } catch(Exception e){e.printstacktrace(); } nullを返します。 }}このクラスは、POP3サーバーに接続してログインし、メールフォルダーを表すフォルダーオブジェクトを返すために使用されます
index.html
<html> <head> <title> login.html </title> </head> <body> <form action = "login.jsp" method = "post"> host name:<input name = "host" type = "text"> <br/> username:<input name = "username"タイプ= "テキスト"> <input type = "reset" value = "reset"> </form> </body> </html>
ログインページ、ユーザーはメールサーバーのホスト名、ユーザー名、パスワードを入力する必要があります
login.jsp
<%@ページインポート= "javax.mail。*、mail。*" contentType = "text/html; charset = gb2312"%> <%string host = request.getParameter( "host"); string username = request.getParameter( "username");文字列パスワード= request.getParameter( "password"); string from = "";文字列件名= "";フォルダーフォルダー= pop3help.getFolder(host、username、password); session.setattribute( "folder"、folder); message [] message = folder.getMessages(); for(int i = 0; i <messages.length; i ++){try {from = messages [i] .getFrom()[0] .toString(); subject = messages [i] .getSubject(); out.print(i + 1);%> senderアドレス:<%=%= from%> email subject:<%= subject%> <a href = "displaymsg.jsp?msgnum = <%= i + 1%>"メールフォルダーですべてのメッセージを取得します
displaymsg.jsp
<frameset rows = "25%、*"> <frame src = "/maildemo/displayhead?msgnum = <%= request.getParameter(" msgnum ")%>"スクロール= "no"> <frame src = "/maildemo/displaycontent?msgnum = <%= <%
メールを表示するために使用される情報
displayhead.java
パッケージメール; java.io.ioexceptionのインポート;インポートjava.io.printwriter; import java.text.dateformat; import javax.mail.bodypart; import javax.mail.folder; import javax.mail.message; import javax.mail.mail.multipart; javax.mail。 javax.servlet.servletexception; import javax.servlet.http.httpservlet; Import javax.servlet.http.httpservletrequest; Import javax.servlet.http.httpservletresponse;インポートjavax.servlet.http.httpsession; @suppresswarnings( "serial")public class displayheadはhttpservletを拡張します{public void doget(httpservletrequest request、httpservletresponse応答) Response.setContentType( "text/html; charset = gb2312"); printwriter out = response.getWriter(); httpsession session = request.getSession(); int msgnum = integer.parseint(request.getParameter( "msgnum"));フォルダーフォルダー=(フォルダー)session.getAttribute( "folder"); try {message msg = folder.getMessage(msgnum); string from = msg.getfrom()[0] .toString(); string subject = msg.getSubject(); string senddate = dateformat.getInstance()。形式(msg.getsentdate()); out.println( "メール件名:" + subject + "<br/>"); out.println( "sender:" + from + "<br/>"); out.println( "send date:" + 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); } //ハイパーリンクを生成して、添付ファイルを開くprint( "attach:"); 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; import javax.mail.folder; import javax.mail.message; import javax.mail.multipart; import javax.servletexception; import.servletexception; javax.servlet.http.httpservletrequest; Import javax.servlet.http.httpservletresponse; Import javax.servlet.http.httpsession; @suppresswarnings( "serial")public class Display extends httpservlete(httpservlete(httpservlete)extendent httpservletResponse応答)servletexception、ioexception {servletoutputStream sos = respons.getOutputStream(); httpsession session = request.getSession(); int msgnum = integer.parseint(request.getParameter( "msgnum"));フォルダーフォルダー=(フォルダー)session.getAttribute( "folder"); try {message msg = folder.getMessage(msgnum); //メッセージタイプが混合されていない場合、メッセージに添付ファイルが含まれておらず、メッセージコンテンツが直接出力されることを意味します。 msg.writeto(sos); } else {//電子メールで電子メール本文を検索して出力します。 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){response.setContenttype( "メッセージ/rfc822"); bp.writeto(sos); }}}} catch(Exception e){e.printstacktrace(); }}}電子メール本体の表示に使用されます
handleattact.java
パッケージメール; java.io.ioexceptionのインポート;インポートjava.io.inputstream; import javax.mail.bodypart; import javax.mail.folder; import javax.mail.message; import javax.mail.multipart; import javax.servletexception; javax.servlet.http.httpservlet; import javax.servlet.http.httpservletrequest; Import javax.servlet.servlet.servlet.httpservletresponse; Import javax.servlet.http.httpsession; {public void doget(httpservletrequest request、httpservletResponse応答)servletexception、ioexception {respons.setcontenttype( "text/html"); httpsession session = request.getSession(); servletoutputStream out = respons.getOutputStream(); int msgnum = integer.parseint(request.getParameter( "msgnum")); int bodynum = integer.parseint(request.getParameter( "bodynum"));文字列filename = request.getParameter( "filename");フォルダーフォルダー=(フォルダー)session.getAttribute( "folder"); try {message msg = folder.getMessage(msgnum); //メッセージヘッダータイプを添付ファイルのタイプに設定します。 MultiPart 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(例外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/nns/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"バージョン= "2.5" <welcome-file> index.html </welcome-file> <welcome-file> index.htm </welcome-file> <welcome-file> index.jsp </welcome-file> index.jsp </welcome-file> default.html </welcome-file> <welcome-file> <welcome-file> defoltive> defoltive </welcome-file-list> <servlet> <servlet-name> displayhead </servlet-name> <servlet-class> mail.displayhead </servlet-class> </servlet> <servlet-name> displayhead </servlet-name> <url-pattern>/displayhead </url-perters <servlet-name> displaycontent </servlet-name> <servlet-class> mail.displaycontent </servlet-class> </servlet> <servlet-mapping> <servlet-name> displaycontent </servlet-name> <url-pattern>/displaycontent </url-perthent <servlet-name> handleattach </servlet-name> <servlet-class> mail.handleattach </servlet-class> </servlet> <servlet-mapping> <servlet-name> handleattach </servlet-name> <url-pattern>/handleattach </url-perther> </vervlet-mapping> </web-mapping>
最初にtomcatサーバーを起動してから、http:// localhost:8080/maildemo/index.htmlをブラウザーに入力します
ユーザー名とパスワードを入力します(ここに承認コードを入力する必要があります。承認コードは何ですか、どのように設定されていますか?)
メールフォルダーにすべてのメッセージをリストします
クリックして電子メールリンクを表示します
添付ファイルの後にファイル名をクリックして、対応する添付ファイルをダウンロードします。
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。