第十九章 Servlet 發(fā)送電子郵件

關(guān)于本篇文章

了解一些 servlet 概念篷牌,本編文章只進(jìn)行一些文章格式修改添瓷,文章內(nèi)使用的圖片均來自 Runoob 網(wǎng)站

致謝

感謝 Runoob 提供的相關(guān)資料,官方資料地址Servlet 教程

Servlet 發(fā)送電子郵件

使用 Servlet 發(fā)送一封電子郵件是很簡(jiǎn)單的,但首先您必須在您的計(jì)算機(jī)上安裝 JavaMail APIJava Activation Framework)JAF)陷寝。

  • 您可以從 Java 網(wǎng)站下載最新版本的 JavaMail,打開網(wǎng)頁右側(cè)有個(gè) Downloads 鏈接其馏,點(diǎn)擊它下載凤跑。
  • 您可以從 Java 網(wǎng)站下載最新版本的 JAF(版本 1.1.1)

你也可以使用本站提供的下載鏈接:

下載并解壓縮這些文件叛复,在新創(chuàng)建的頂層目錄中仔引,您會(huì)發(fā)現(xiàn)這兩個(gè)應(yīng)用程序的一些 jar 文件。您需要把 mail.jaractivation.jar 文件添加到您的 CLASSPATH 中褐奥。

發(fā)送一封簡(jiǎn)單的電子郵件

下面的實(shí)例將從您的計(jì)算機(jī)上發(fā)送一封簡(jiǎn)單的電子郵件偷卧。這里假設(shè)您的本地主機(jī)已連接到互聯(lián)網(wǎng)凹蜈,并支持發(fā)送電子郵件。同時(shí)確保 Java Email API 包和 JAF 包的所有的 jar 文件在 CLASSPATH 中都是可用的。

// 文件名 SendEmail.java
import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.mail.*;
import javax.mail.internet.*;
import javax.activation.*;
 
public class SendEmail extends HttpServlet{
    
  public void doGet(HttpServletRequest request,
                    HttpServletResponse response)
            throws ServletException, IOException
  {
      // 收件人的電子郵件 ID
      String to = "abcd@gmail.com";
 
      // 發(fā)件人的電子郵件 ID
      String from = "web@gmail.com";
 
      // 假設(shè)您是從本地主機(jī)發(fā)送電子郵件
      String host = "localhost";
 
      // 獲取系統(tǒng)的屬性
      Properties properties = System.getProperties();
 
      // 設(shè)置郵件服務(wù)器
      properties.setProperty("mail.smtp.host", host);
 
      // 獲取默認(rèn)的 Session 對(duì)象
      Session session = Session.getDefaultInstance(properties);
      
      // 設(shè)置響應(yīng)內(nèi)容類型
      response.setContentType("text/html;charset=UTF-8");
      PrintWriter out = response.getWriter();

      try{
         // 創(chuàng)建一個(gè)默認(rèn)的 MimeMessage 對(duì)象
         MimeMessage message = new MimeMessage(session);
         // 設(shè)置 From: header field of the header.
         message.setFrom(new InternetAddress(from));
         // 設(shè)置 To: header field of the header.
         message.addRecipient(Message.RecipientType.TO,
                                  new InternetAddress(to));
         // 設(shè)置 Subject: header field
         message.setSubject("This is the Subject Line!");
         // 現(xiàn)在設(shè)置實(shí)際消息
         message.setText("This is actual message");
         // 發(fā)送消息
         Transport.send(message);
         String title = "發(fā)送電子郵件";
         String res = "成功發(fā)送消息...";
         String docType = "<!DOCTYPE html> \n";
         out.println(docType +
         "<html>\n" +
         "<head><title>" + title + "</title></head>\n" +
         "<body bgcolor=\"#f0f0f0\">\n" +
         "<h1 align=\"center\">" + title + "</h1>\n" +
         "<p align=\"center\">" + res + "</p>\n" +
         "</body></html>");
      }catch (MessagingException mex) {
         mex.printStackTrace();
      }
   }
} 

現(xiàn)在讓我們來編譯上面的 Servlet泛领,并在 web.xml 文件中創(chuàng)建以下條目:

....
 <servlet>
     <servlet-name>SendEmail</servlet-name>
     <servlet-class>SendEmail</servlet-class>
 </servlet>
 
 <servlet-mapping>
     <servlet-name>SendEmail</servlet-name>
     <url-pattern>/SendEmail</url-pattern>
 </servlet-mapping>
....

現(xiàn)在通過訪問 URL http://localhost:8080/SendEmail 來調(diào)用這個(gè) Servlet拐揭。這將會(huì)發(fā)送一封電子郵件到給定的電子郵件 ID abcd@gmail.com颓芭,并將顯示下面所示的響應(yīng):

如果您想要發(fā)送一封電子郵件給多個(gè)收件人殖熟,那么請(qǐng)使用下面的方法來指定多個(gè)電子郵件 ID:

void addRecipients(Message.RecipientType type, 
                   Address[] addresses)
throws MessagingException

下面是對(duì)參數(shù)的描述:

  • type:這將被設(shè)置為 TO、CC 或 BCC叫胁。在這里凰慈,CC 代表抄送,BCC 代表密件抄送驼鹅。例如 Message.RecipientType.TO微谓。
  • addresses:這是電子郵件 ID 的數(shù)組。當(dāng)指定電子郵件 ID 時(shí)输钩,您需要使用 InternetAddress() 方法豺型。

發(fā)送一封 HTML 電子郵件

下面的實(shí)例將從您的計(jì)算機(jī)上發(fā)送一封 HTML 格式的電子郵件。這里假設(shè)您的本地主機(jī)已連接到互聯(lián)網(wǎng)张足,并支持發(fā)送電子郵件触创。同時(shí)確保 Java Email API 包和 JAF 包的所有的 jar 文件在 CLASSPATH 中都是可用的坎藐。

本實(shí)例與上一個(gè)實(shí)例很類似为牍,但是這里我們使用 setContent() 方法來設(shè)置第二個(gè)參數(shù)為 "text/html" 的內(nèi)容,該參數(shù)用來指定 HTML 內(nèi)容是包含在消息中的岩馍。

使用這個(gè)實(shí)例碉咆,您可以發(fā)送內(nèi)容大小不限的 HTML 內(nèi)容。

// 文件名 SendEmail.java
import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.mail.*;
import javax.mail.internet.*;
import javax.activation.*;
 
public class SendEmail extends HttpServlet{
    
  public void doGet(HttpServletRequest request,
                    HttpServletResponse response)
            throws ServletException, IOException
  {
      // 收件人的電子郵件 ID
      String to = "abcd@gmail.com";
 
      // 發(fā)件人的電子郵件 ID
      String from = "web@gmail.com";
 
      // 假設(shè)您是從本地主機(jī)發(fā)送電子郵件
      String host = "localhost";
 
      // 獲取系統(tǒng)的屬性
      Properties properties = System.getProperties();
 
      // 設(shè)置郵件服務(wù)器
      properties.setProperty("mail.smtp.host", host);
 
      // 獲取默認(rèn)的 Session 對(duì)象
      Session session = Session.getDefaultInstance(properties);
      
      // 設(shè)置響應(yīng)內(nèi)容類型
      response.setContentType("text/html;charset=UTF-8");
      PrintWriter out = response.getWriter();

      try{
         // 創(chuàng)建一個(gè)默認(rèn)的 MimeMessage 對(duì)象
         MimeMessage message = new MimeMessage(session);
         // 設(shè)置 From: header field of the header.
         message.setFrom(new InternetAddress(from));
         // 設(shè)置 To: header field of the header.
         message.addRecipient(Message.RecipientType.TO,
                                  new InternetAddress(to));
         // 設(shè)置 Subject: header field
         message.setSubject("This is the Subject Line!");

         // 設(shè)置實(shí)際的 HTML 消息蛀恩,內(nèi)容大小不限
         message.setContent("<h1>This is actual message</h1>",
                            "text/html" );
         // 發(fā)送消息
         Transport.send(message);
         String title = "發(fā)送電子郵件";
         String res = "成功發(fā)送消息...";
         String docType = "<!DOCTYPE html> \n";
         out.println(docType +
         "<html>\n" +
         "<head><title>" + title + "</title></head>\n" +
         "<body bgcolor=\"#f0f0f0\">\n" +
         "<h1 align=\"center\">" + title + "</h1>\n" +
         "<p align=\"center\">" + res + "</p>\n" +
         "</body></html>");
      }catch (MessagingException mex) {
         mex.printStackTrace();
      }
   }
} 

編譯并運(yùn)行上面的 Servlet 疫铜,在給定的電子郵件 ID 上發(fā)送 HTML 消息。

在電子郵件中發(fā)送附件

下面的實(shí)例將從您的計(jì)算機(jī)上發(fā)送一封帶有附件的電子郵件双谆。這里假設(shè)您的本地主機(jī)已連接到互聯(lián)網(wǎng)壳咕,并支持發(fā)送電子郵件席揽。同時(shí)確保 Java Email API 包和 JAF 包的所有的 jar 文件在 CLASSPATH 中都是可用的。

// 文件名 SendEmail.java
import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.mail.*;
import javax.mail.internet.*;
import javax.activation.*;
 
public class SendEmail extends HttpServlet{
    
  public void doGet(HttpServletRequest request,
                    HttpServletResponse response)
            throws ServletException, IOException
  {
      // 收件人的電子郵件 ID
      String to = "abcd@gmail.com";
 
      // 發(fā)件人的電子郵件 ID
      String from = "web@gmail.com";
 
      // 假設(shè)您是從本地主機(jī)發(fā)送電子郵件
      String host = "localhost";
 
      // 獲取系統(tǒng)的屬性
      Properties properties = System.getProperties();
 
      // 設(shè)置郵件服務(wù)器
      properties.setProperty("mail.smtp.host", host);
 
      // 獲取默認(rèn)的 Session 對(duì)象
      Session session = Session.getDefaultInstance(properties);
      
      // 設(shè)置響應(yīng)內(nèi)容類型
      response.setContentType("text/html;charset=UTF-8");
      PrintWriter out = response.getWriter();

       try{
         // 創(chuàng)建一個(gè)默認(rèn)的 MimeMessage 對(duì)象
         MimeMessage message = new MimeMessage(session);
 
         // 設(shè)置 From: header field of the header.
         message.setFrom(new InternetAddress(from));
 
         // 設(shè)置 To: header field of the header.
         message.addRecipient(Message.RecipientType.TO,
                                  new InternetAddress(to));
 
         // 設(shè)置 Subject: header field
         message.setSubject("This is the Subject Line!");
 
         // 創(chuàng)建消息部分 
         BodyPart messageBodyPart = new MimeBodyPart();
 
         // 填寫消息
         messageBodyPart.setText("This is message body");
         
         // 創(chuàng)建一個(gè)多部分消息
         Multipart multipart = new MimeMultipart();
 
         // 設(shè)置文本消息部分
         multipart.addBodyPart(messageBodyPart);
 
         // 第二部分是附件
         messageBodyPart = new MimeBodyPart();
         String filename = "file.txt";
         DataSource source = new FileDataSource(filename);
         messageBodyPart.setDataHandler(new DataHandler(source));
         messageBodyPart.setFileName(filename);
         multipart.addBodyPart(messageBodyPart);
 
         // 發(fā)送完整的消息部分
         message.setContent(multipart );
 
         // 發(fā)送消息
         Transport.send(message);
         String title = "發(fā)送電子郵件";
         String res = "成功發(fā)送電子郵件...";
         String docType = "<!DOCTYPE html> \n";
         out.println(docType +
         "<html>\n" +
         "<head><title>" + title + "</title></head>\n" +
         "<body bgcolor=\"#f0f0f0\">\n" +
         "<h1 align=\"center\">" + title + "</h1>\n" +
         "<p align=\"center\">" + res + "</p>\n" +
         "</body></html>");
      }catch (MessagingException mex) {
         mex.printStackTrace();
      }
   }
} 

編譯并運(yùn)行上面的 Servlet 谓厘,在給定的電子郵件 ID 上發(fā)送帶有文件附件的消息幌羞。

用戶身份認(rèn)證部分

如果需要向電子郵件服務(wù)器提供用戶 ID 和密碼進(jìn)行身份認(rèn)證,那么您可以設(shè)置如下屬性:

 props.setProperty("mail.user", "myuser");
 props.setProperty("mail.password", "mypwd");

電子郵件發(fā)送機(jī)制的其余部分與上面講解的保持一致竟稳。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末属桦,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子他爸,更是在濱河造成了極大的恐慌聂宾,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,496評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件诊笤,死亡現(xiàn)場(chǎng)離奇詭異系谐,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)讨跟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門蔚鸥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人许赃,你說我怎么就攤上這事止喷。” “怎么了混聊?”我有些...
    開封第一講書人閱讀 162,632評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵弹谁,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我句喜,道長(zhǎng)预愤,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,180評(píng)論 1 292
  • 正文 為了忘掉前任咳胃,我火速辦了婚禮植康,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘展懈。我一直安慰自己销睁,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評(píng)論 6 388
  • 文/花漫 我一把揭開白布存崖。 她就那樣靜靜地躺著冻记,像睡著了一般。 火紅的嫁衣襯著肌膚如雪来惧。 梳的紋絲不亂的頭發(fā)上冗栗,一...
    開封第一講書人閱讀 51,165評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼隅居。 笑死钠至,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的胎源。 我是一名探鬼主播棕洋,決...
    沈念sama閱讀 40,052評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼乒融!你這毒婦竟也來了掰盘?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,910評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤赞季,失蹤者是張志新(化名)和其女友劉穎愧捕,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體申钩,經(jīng)...
    沈念sama閱讀 45,324評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡次绘,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了撒遣。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片邮偎。...
    茶點(diǎn)故事閱讀 39,711評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖义黎,靈堂內(nèi)的尸體忽然破棺而出禾进,到底是詐尸還是另有隱情,我是刑警寧澤廉涕,帶...
    沈念sama閱讀 35,424評(píng)論 5 343
  • 正文 年R本政府宣布泻云,位于F島的核電站,受9級(jí)特大地震影響狐蜕,放射性物質(zhì)發(fā)生泄漏宠纯。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評(píng)論 3 326
  • 文/蒙蒙 一层释、第九天 我趴在偏房一處隱蔽的房頂上張望婆瓜。 院中可真熱鬧,春花似錦贡羔、人聲如沸廉白。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蒙秒。三九已至,卻和暖如春宵统,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工马澈, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留瓢省,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,722評(píng)論 2 368
  • 正文 我出身青樓痊班,卻偏偏與公主長(zhǎng)得像勤婚,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子涤伐,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容