IT程式員開發必備-各類資源下載清單,史上最全IT資源,個人收藏總結。
由於發送帶有附件的郵件會耗費很多的時間,所以如果單純用訪問Servlet的形式發送郵件的話,那麼會造成用戶端頁面滯留的效果,這樣不是很好,所以我們一般採用Ajax的形式發送頁面,實現頁面無重新整理,或者通過通過建立另一個線程,主線程返回用戶端,讓子線程發送郵件,這樣可以實現頁面提前返回。
程式碼
MailByThreadServletServlet.java
package edu.servlet.mail;import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class MailByThreadServlet extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException { response.setContentType("text/html;charset=utf-8"); SendMailThread smt = new SendMailThread(); Thread thread = new Thread(smt); thread.start(); response.getWriter().print("郵件正在發送中,請稍等......");}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException { doGet(request, response);}}子線程SendMailThread.java
package edu.servlet.mail;import java.io.FileInputStream;import javax.mail.Message;import javax.mail.Session;import javax.mail.Transport;import javax.mail.internet.InternetAddress;import javax.mail.internet.MimeMessage;import javax.mail.internet.MimeUtility;import javax.naming.Context;import javax.naming.InitialContext;public class SendMailThread implements Runnable{@Overridepublic void run() {try{ Context initCtx = new InitialContext(); //tomcat將建立的環境容器放在初始化容器中,需要通過"java:comp/env"(固定)尋找 Context envCtx = (Context) initCtx.lookup("java:comp/env"); //在環境參數容器中通過"mail/Dog"尋找到Session對象 Session session = (Session) envCtx.lookup("mail/Dog"); /* * 驗證這裡tomcat的類載入器(envCtx.lookup("mail/Dog"))與應用程式的類載入器(Session)的不同 * 但是這裡不知道為什麼是一樣的結果,按說是不一樣的,反正也不是很重要 * 都是 org.apache.catalina.loader.StandardClassLoader */ System.out.println(envCtx.lookup("mail/Dog").getClass().getClassLoader().getClass().getName()); System.out.println(Session.class.getClassLoader().getClass().getName()); //設定Debug的方式列印執行過程 session.setDebug(true); //建立代表郵件內容的Message對象。 Message msg = new MimeMessage(session,new FileInputStream("C:\\Documents and Settings\\Administrator\\案頭\\SendMultipartMessageDemo3.eml")); Transport transport = session.getTransport(); transport.connect("smtp.163.com", 25, "xh216319","xiaoxiao"); transport.sendMessage(msg, InternetAddress.parse( MimeUtility.encodeText("ITSTAR")+"<itstar1965@sina.com>,"+MimeUtility.encodeText("肖華")+"<xh216319@163.com>"));}catch (Exception e) { }finally{}} }訪問:http://localhost:8080/JavaMail_02/servlet/MailByThreadServlet,則馬上就會返回