Servlet&JSP的那些事兒(二十六)

來源:互聯網
上載者:User

本篇介紹jsp與javamail。由于越來越多的java web應用需要整合電子郵件功能,javamail組件完美的解決了這個問題。

電子郵件的工作原理

電子郵件的工作過程遵循客戶-伺服器模式。每份電子郵件的發送都涉及發送方和接收方。發送方充當用戶端,接收方充當伺服器。伺服器中含有很多使用者的電子郵箱。發送方通過郵件客戶程式,將編輯好的電子郵件向SMTP伺服器發送。SMTP伺服器識別接收者的地址,向管理該地址的POP3伺服器發送訊息。郵件伺服器將訊息存放在接收者電子郵箱內,並通知接收者有新郵件。接收者通過用戶端登入後,就會看到提示。

相關協議

SMTP協議(簡易郵件傳輸通訊協定,simple mail transfer protocol)是為了保證電子郵件的可靠和高效傳送。它使用25號連接埠進行傳輸。當寄件者和接收者在同一個網路內時,它會將郵件直接發送給接收者。否則,需要通過一個或幾個中間伺服器轉寄。所以,它的收信方可以是最終用於或者郵件伺服器。

POP3協議(郵局協議,post office protocol)用於電子郵件的接收。常用的是第三版,稱為POP3。它使用110號連接埠。通過POP協議,使用者登入到伺服器後,可以對自己的郵件進行刪除或下載到本地。它是一個離線協議標準。

javamail簡介

javamail是sun發布的用來處理email的API,它支援各種電子郵件通訊協定。要想在java web程式中使用javamail就要將javamail的mail.jar和activation.jar複製到WEB-INF/lib目錄下。通過調用javamail的API即可在自己的應用程式中便捷的操作email。

javamail的核心類主要包括session,message,address,authenticator,transport,store,folder。

session類

和http會話一樣,session類定義了基本的郵件會話。session利用java.util.Propertities對象獲得郵件伺服器,使用者名稱,密碼資訊和整個應用程式都要使用到的共用資訊。

message類

message對象用來儲存實際發送的電子郵件資訊,message對象被作為一個MimeMessage對象來建立,在建立時需要指定一個session對象做參數。建立完message對象之後,就可以為它設定一些資訊。在為message對象新增內容時分兩種情況,如果是文本型內容,可通過setText()方法來設定,如果訊息內容中要包含html或附件,可通過setContent()方法來設定。

address類

當建立了session和message之後,需要使用地址類Address為郵件標明地址。和Message類一樣,Address類是一個抽象類別,javax.mail.internet.InternetAddress是Address的子類,可通過它來建立Address對象。

authenticator類

javamail API通過使用授權類(Authenticator)以使用者名稱和密碼的方式訪問郵件伺服器。使用Authenticator類時必須採用繼承該抽象類別的方式,並且該繼承類必須具有返回PasswordAuthentication對象的getPasswordAuthencation()方法。

transport類

Transport類根據指定的郵件發送協議,通過指定的帳號和密碼串連指定的郵件發送伺服器發送郵件。

store類

store代表了儲存郵件的郵件伺服器,可從session中擷取特定類型的store,然後根據指定的帳號,密碼及授權串連到store。store類實現特定郵件協議上的讀,寫,監視,尋找等操作。通過javax.mail.Store類可以訪問javax.mail.Folde類。

folder類

Folder類代表了郵件夾,通過它可以訪問郵件夾中的郵件。通過Store對象的getFolder()方法可以取得一個Folder對象。

例如,一個發送帶附件的郵件應用代碼如下:

package test;import javax.mail.*;import javax.mail.internet.*;import javax.activation.*;import java.util.*;public class SendAttachMail {String SMTPHost=""; //SMTP伺服器String user=""; //登入SMTP伺服器的帳號String password=""; //登入SMTP伺服器的密碼 String from =""; //寄件者郵箱String to =""; //收件者郵箱String subject =""; //郵件標題String content =""; //郵件內容String filename =""; //附件檔案名稱 //無參數構造方法 public SendAttachMail() {}public String getContent() {return content;}public void setContent(String content) {try{//解決內容的中文問題content = new String(content.getBytes("ISO8859-1"),"gb2312");}catch(Exception ex){ex.printStackTrace();}this.content = content;}public String getFilename() {return filename;}public void setFilename(String filename) {try{//解決檔案名稱的中文問題filename = new String(filename.getBytes("ISO8859-1"),"gb2312");}catch(Exception ex){ex.printStackTrace();}//將檔案路徑中的'\'替換成'/'filename = filename.replaceAll("\\\\","/");this.filename = filename;}public String getFrom() {return from;}public void setFrom(String from) {this.from = from;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public String getSMTPHost() {return SMTPHost;}public void setSMTPHost(String host) {SMTPHost = host;}public String getSubject() {return subject;}public void setSubject(String subject) {try{//解決標題的中文問題subject = new String(subject.getBytes("ISO8859-1"),"gb2312");}catch(Exception ex){ex.printStackTrace();}this.subject = subject;}public String getTo() {return to;}public void setTo(String to) {this.to = to;}public String getUser() {return user;}public void setUser(String user) {this.user = user;}//發送郵件public boolean send(){//建立一個屬性對象Properties props = new Properties();//指定SMTP伺服器props.put("mail.smtp.host", SMTPHost);//指定是否需要SMTP驗證props.put("mail.smtp.auth", "true");try{//建立一個授權驗證對象SmtpAuth auth = new SmtpAuth();auth.setAccount(user,password);//建立一個Session對象Session mailSession = Session.getInstance(props,auth);mailSession.setDebug(true);//建立一個MimeMessage 對象MimeMessage message=new MimeMessage(mailSession);//指定寄件者郵箱message.setFrom(new InternetAddress(from));//指定收件者郵箱message.addRecipient(Message.RecipientType.TO,new InternetAddress(to));//指定郵件主題message.setSubject(subject);//指定郵件發送日期message.setSentDate(new Date());//指定郵件優先順序 1:緊急 3:普通 5:緩慢message.setHeader("X-Priority","1");message.saveChanges();//建立一個MimeMultipart對象用來存放多個BodyPart對象Multipart container=new MimeMultipart();//建立一個存放信件內容的BodyPart對象BodyPart textBodyPart=new MimeBodyPart();//給BodyPart對象設定內容和格式/編碼方式textBodyPart.setContent(content,"text/html;charset=gb2312");//將含有信件內容的BodyPart加入到MimeMultipart對象中container.addBodyPart(textBodyPart);//建立一個存放信件附件的BodyPart對象BodyPart fileBodyPart=new MimeBodyPart();//將本地檔案作為附件FileDataSource fds=new FileDataSource(filename);fileBodyPart.setDataHandler(new DataHandler(fds));//處理郵件中附件檔案名稱的中文問題String attachName = fds.getName();attachName = new String(attachName.getBytes("gb2312"),"ISO8859-1");//設定附件檔案名稱fileBodyPart.setFileName(attachName);//將附件的BodyPart對象加入到container中container.addBodyPart(fileBodyPart);//將container作為訊息對象的內容message.setContent(container);//建立一個Transport對象Transport transport = mailSession.getTransport("smtp");//串連SMTP伺服器transport.connect(SMTPHost, user, password);//發送郵件transport.send(message, message.getAllRecipients());transport.close();return true;}catch(Exception ex){ex.printStackTrace();return false;}}//定義一個SMTP授權驗證類static class SmtpAuth extends Authenticator{String user,password;//設定帳號資訊void setAccount(String user,String password){this.user = user;this.password = password;}//取得PasswordAuthentication對象protected PasswordAuthentication getPasswordAuthentication(){return new PasswordAuthentication(user,password);}}}

轉載請註明出處:http://blog.csdn.net/iAm333

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.