190 likes | 310 Views
JSP的電子郵件處理. 客戶端的檔案上傳 JavaMail 寄送電子郵件. JavaMail寄送電子郵件. JavaMail API 使用 JavaMail 寄送電子郵件 電子郵件的附檔處理. JavaMail API-JavaMail 的基礎. JavaMail 是昇陽 API 套件,其相關類別可以輕鬆建立電子郵件系統,內建支援郵件通訊協定 POP3 、 SMTP 和 IMAP4 。簡單的說, JavaMail API 套件的相關類別是在模擬一套郵件工具,其主要類別,如下所示: javax.mail.Session 類別。 javax.mail.Message 類別。
E N D
JSP的電子郵件處理 • 客戶端的檔案上傳 • JavaMail寄送電子郵件
JavaMail寄送電子郵件 • JavaMail API • 使用JavaMail寄送電子郵件 • 電子郵件的附檔處理
JavaMail API-JavaMail的基礎 • JavaMail是昇陽API套件,其相關類別可以輕鬆建立電子郵件系統,內建支援郵件通訊協定POP3、SMTP和IMAP4。簡單的說,JavaMail API套件的相關類別是在模擬一套郵件工具,其主要類別,如下所示: • javax.mail.Session類別。 • javax.mail.Message類別。 • javax.mail.Transport類別。 • javax.mail.Folder類別。 • javax.mail.Store類別。 • 在本節主要說明電子郵件的寄送,所以只會使用Session、Message和Transport三個類別。
JavaMail API-下載 • 在昇陽網站可以免費下載JavaMail API,本書使用的版本是1.3.2,其下載網址,如下所示: http://java.sun.com/products/javamail/downloads/index.html • 在上述網址可以下載ZIP格式的壓縮檔:javamail-1_3_2.zip。JavaMail API需要配合JavaBeans Activation Framework(JAF)處理附檔,所以我們還需要下載JAF,本書使用的版本是1.0.2,其下載網址,如下所示: http://java.sun.com/products/javabeans/glasgow/jaf.html • 上述網址可以下載ZIP格式的壓縮檔:jaf-1_0_2-upd.zip。
JavaMail API-安裝 • 安裝JavaMail API的第一步是使用解壓縮工具從壓縮檔取出2個JAR檔案,如下所示: • mail.jar檔案:從JavaMail API下載檔案javamail-1_3_2.zip取出mail.jar檔案。 • activation.jar檔案:從JAF下載檔案jaf-1_0_2-upd.zip取出activation.jar檔案。 • 第二步在Resin的JSP容器安裝JavaMail,就是將mail.jar和activation.jar兩個檔案複製到Resin安裝目錄的「C:\resin-3.0.9\lib」資料夾。
使用JavaMail寄送電子郵件-匯入套件與伺服器設定使用JavaMail寄送電子郵件-匯入套件與伺服器設定 • 在JSP程式使用JavaMail API需要匯入一些套件,如下所示: <%@ page import="java.util.*, java.io.*"%> <%@ page import="javax.mail.*"%> <%@ page import="javax.mail.internet.*"%> • 在匯入上述套件後,JSP程式需要先設定系統使用的郵件伺服器和通訊協定,如下所示: Properties props = new Properties(); props.put("mail.host", "ms2.hinet.net"); props.put("mail.transport.protocol", "smtp");
使用JavaMail寄送電子郵件-取得Session物件 • 在建立MimeMessage的電子郵件前,JSP程式需要先取得Session物件,如下所示: Session s = Session.getInstance(props, null); • 上述程式碼使用getInstance()方法取得Session物件,參數是前述Properties物件。
使用JavaMail寄送電子郵件- 建立MimeMessage物件 • 在取得Session物件後,就可以建立MimeMessage物件,即一封電子郵件,如下所示: MimeMessage msg = new MimeMessage(s); • 上述程式碼使用Session物件的建構子參數建立MimeMessage物件,然後使用MimeMessage物件的方法指定郵件內容。
使用JavaMail寄送電子郵件- Transport物件 • Transport物件使用類別方法send()來寄送電子郵件,如下所示: Transport.send(msg); • 上述程式參數是MimeMessage物件,可以將參數的電子郵件寄送出去。
範例 • <%@ page contentType="text/html; charset=MS950"%> • <%@ page import="java.util.*, java.io.*"%> • <%@ page import="javax.mail.*"%> • <%@ page import="javax.mail.internet.*"%> • <html> • <head><title>Ch12_4_2.jsp</title></head> • <body> • <% • // 設定系統使用的SMTP郵件伺服器 • Properties props = new Properties(); • props.put("mail.host", "ms2.hinet.net"); // 主機名稱 • props.put("mail.transport.protocol", "smtp"); // 指定協定 • // 建立Session物件載入通訊協定和郵件伺服器 • Session s = Session.getInstance(props, null); • // 取得表單輸入的郵件內容 • String from = request.getParameter("from"); • String to = request.getParameter("to"); • String subject = request.getParameter("subject"); • String text = request.getParameter("text"); • // 建立Message物件 • MimeMessage msg = new MimeMessage(s); • msg.setFrom(new InternetAddress(from)); // 指定寄件者 • // 指定收件者 • msg.addRecipient(Message.RecipientType.TO, new InternetAddress(to)); • msg.setSubject(subject); // 指定主旨 • msg.setText(text); // 指定郵件內容 • // 使用Transport物件寄送電子郵件 • Transport.send(msg); • %> • <p align="center">郵件已經寄到:<%=to %>.</p> • </body> • </html>
電子郵件的附檔處理-說明 • 對於HTML格式或附檔郵件來說,在MIME郵件內容需要分成多個區段,多區段MIME郵件內容是一個MimeMultipart物件,每一個區段是一個MimeBodyPart物件,如下所示: • 一般郵件區段:MIME郵件的文字內容部分,這是MimeBodyPart物件,可以指定郵件內容是一般文字或HTML文件。 • 附檔區段:MIME郵件的附檔部分也是MimeBodyPart物件,我們需要使用JAF的DataHandler類別來處理附檔。
電子郵件的附檔處理-建立MimeMultipart物件 • 寄送MimeMessage物件的郵件擁有多區段MIME郵件內容,需要建立MimeMultipart物件儲存郵件內容,如下所示: MimeMultipart mm = new MimeMultipart(); • 上述程式碼在建立好MimeMultipart物件後,就可以分別建立各區段的MimeBodyPart物件,然後使用addBodyPart()方法新增MimeBodyPart物件的郵件區段。
電子郵件的附檔處理-HTML格式郵件 • 對於多區段的MIME郵件來說,文字內容部分是一個MimeBodyPart物件,如下所示: MimeBodyPart mbp1 = new MimeBodyPart(); mbp1.setContent(text, type); • setContent()方法可以指定郵件內容,第2個參數是字串內容的MIME型態,值"text/html;charset=Big5"為HTML格式,值"text/plain;charset=Big5"是一般文字內容。 • 接著將區段新增到MimeMultipart物件的多區段郵件內容,如下所示: mm.addBodyPart(mbp1);
電子郵件的附檔處理-附檔處理1 • 在電子郵件如果擁有附檔,檔案需要先上傳到伺服器,才能將附檔內容新增到電子郵件中,JSP程式可以使用MultipartRequest物件上傳檔案後,然後使用getParameter()方法取得郵件內容,對於附檔來說是取得附檔名稱,如下所示: String filename = mreq.getFilesystemName("file"); • 上述程式碼取得附檔檔名後,就可以建立附檔的MimeBodyPart物件的區段,如下所示: MimeBodyPart mbp2 = new MimeBodyPart();
電子郵件的附檔處理-附檔處理2 • 在建立MimeBodyPart物件後,需要使用FileDataSource物件取得附檔的資料來源,如下所示: FileDataSource fds = new FileDataSource(path+filename); mbp2.setDataHandler( new DataHandler(fds)); mbp2.setFileName(fds.getName()); • 在建立好區段的內容後,就可以將區段新增到MimeMultipart物件的多區段郵件內容,如下所示: mm.addBodyPart(mbp2);
電子郵件的附檔處理-指定MimeMessage物件的郵件內容電子郵件的附檔處理-指定MimeMessage物件的郵件內容 • 現在的MimeMultipart物件一共擁有mbp1和mbp2兩個區段,最後,可以指定MimeMessage物件的郵件內容,如下所示: msg.setContent(mm); • 上述程式碼使用MimeMessage物件的setContent()方法指定參數MimeMultipart物件的郵件內容。
範例 • <%@ page contentType="text/html; charset=MS950"%> • <%@ page import="java.util.*, java.io.*"%> • <%@ page import="javax.mail.*"%> • <%@ page import="javax.mail.internet.*"%> • <%@ page import="javax.activation.*"%> • <%@ page import="com.oreilly.servlet.MultipartRequest"%> • <html> • <head><title>Ch12_4_3.jsp</title></head> • <body> • <% • // 取得上傳檔案, 指定上傳目錄 • String path = application.getRealPath("/"); • int maxSize = 2*1024*1024; // 上傳檔案最大尺寸為2MB • // 建立MultipartRequest物件 • MultipartRequest mreq = new MultipartRequest(request, path, maxSize, "MS950"); • // 取得表單輸入的郵件內容 • String from = mreq.getParameter("from"); • String to = mreq.getParameter("to"); • String type = mreq.getParameter("type"); • String subject = mreq.getParameter("subject"); • String text = mreq.getParameter("text"); • // 設定系統使用的SMTP郵件伺服器 • Properties props = new Properties(); • props.put("mail.host", "ms2.hinet.net"); // 主機名稱 • props.put("mail.transport.protocol", "smtp"); // 指定協定 • // 建立Session物件載入通訊協定和郵件伺服器 • Session s = Session.getInstance(props, null); • // 建立Message物件 • MimeMessage msg = new MimeMessage(s); • msg.setFrom(new InternetAddress(from)); // 指定寄件者
// 指定收件者 • msg.addRecipient(Message.RecipientType.TO, new InternetAddress(to)); • msg.setSubject(subject); // 指定主旨 • msg.setSentDate(new Date()); // 指定日期 • // 建立MIME的多區段郵件, 一共擁有2個區段 • MimeMultipart mm = new MimeMultipart(); • // 建立區段1: 文字內容的BodyPart郵件 • MimeBodyPart mbp1 = new MimeBodyPart(); • mbp1.setContent(text, type); // 指定HTML或一般文字郵件 • mm.addBodyPart(mbp1); // 將BodyPart新增到MIME郵件 • // 取得附檔名稱 • String filename = mreq.getFilesystemName("file"); • if ( filename != null ) { // 有檔名才建立附檔區段 • // 建立區段2: 附檔的Bodypart物件 • MimeBodyPart mbp2 = new MimeBodyPart(); • FileDataSource fds = new FileDataSource(path+filename); • // 指定DataHandler物件 • mbp2.setDataHandler(new DataHandler(fds)); • mbp2.setFileName(fds.getName()); • mm.addBodyPart(mbp2); // 將BodyPart新增到MIME郵件 • } • msg.setContent(mm); // 指定郵件內容 • // 使用Transport物件寄送電子郵件 • Transport.send(msg); • %> • <p align="center">郵件已經寄到:<%=to %>.</p> • </body> • </html>