天天看點

【SSH網上商城項目實戰25】使用java email給使用者發送郵件

當使用者購買完商品後,我們應該向使用者發送一封郵件,告訴他訂單已生成之類的資訊,郵箱位址是從使用者的基本資訊中擷取,好了,首先我們來看一下java中發送郵件的方法。

1. java中發送email的方法

  在完善這個項目之前,先來回顧一下java中是如何發送郵件的,首先肯定需要發送郵件的jar包:​

​mail.jar​

​,導入到lib目錄下,好了,下面我們先寫一個普通的java程式來回顧一下java email的知識點:

1 public class SendEmailDemo {
 2 
 3     public static void main(String[] args) throws Exception {
 4 
 5         //1. 登陸郵件用戶端(建立會話session)
 6         Properties prop = new Properties();
 7         prop.setProperty("mail.transport.protocol", "smtp");    
 8         //建立了session會話
 9         Session session = Session.getDefaultInstance(prop);
10         //設定debug模式來調試發送資訊
11         session.setDebug(true);
12         //建立一封郵件對象
13         Message message = new MimeMessage(session);
14         //寫信
15         message.setSubject("歡迎通路我的CSDN部落格首頁!");
16         //正文内容
17         message.setContent("歡迎通路我的CSDN部落格首頁:http://blog.csdn.net/eson_15"
18                 + ",麼麼哒~", "text/html;charset=utf-8");
19         //附件人位址
20         message.setFrom(new InternetAddress("[email protected]"));
21         Transport transport = session.getTransport();
22         //連結郵件伺服器的認證資訊
23         transport.connect("smtp.163.com", "nishengwus", "xxxxx密碼");
24         // 設定收件人位址,并發送郵件
25         transport.sendMessage(message, new InternetAddress[]{new InternetAddress("[email protected]")});
26         transport.close();
27     }
28 }      

  上面就是用java發送郵件的流程:建立會話–>封裝郵件資訊–>設定發件人位址–>設定收件人位址–>發送。

2. 封裝發送郵件功能

  回顧了java發送郵件的方法後,我們将這個流程封裝到一個工具類中,建立一個EmailUtilImpl實作類,完成後 抽取成EmailUtil接口,如下:

1 //抽取後的EmailUtil接口
 2 public interface EmailUtil {
 3 
 4     public abstract void sendEmail(String emailAddress, String id);
 5 
 6 }
 7 
 8 //EmailUtilImpl實作類
 9 @Component("emailUtil")
10 public class EmailUtilImpl implements EmailUtil {
11     //參數接收顧客的郵箱位址和訂單編号
12     @Override
13     public void sendEmail(String emailAddress, String id) {
14         // 1. 登陸郵件用戶端(建立會話session)
15         Properties prop = new Properties();
16         Session session = null;
17         Message message = null;
18         Transport transport = null;
19         try {
20             prop.setProperty("mail.transport.protocol", "smtp");
21             // 建立了session會話
22             session = Session.getDefaultInstance(prop);
23             // 設定debug模式來調試發送資訊
24             session.setDebug(true);
25             // 建立一封郵件對象
26             message = new MimeMessage(session);
27             // 寫信
28             message.setSubject("網上商城訂單回報");
29             // 正文内容
30             message.setContent("顧客您好,歡迎您光顧網上商城,訂單" + id + "已支付成功!", "text/html;charset=utf-8");
31             // 附件人位址
32             message.setFrom(new InternetAddress("[email protected]"));           
33             transport = session.getTransport();
34             // 連結郵件伺服器的認證資訊
35             transport.connect("smtp.sina.com", "soft03_test", "soft03_test");
36 
37             // 設定收件人位址,并發送郵件
38             transport.sendMessage(message, new InternetAddress[] { new InternetAddress(emailAddress) });
39         } catch (Exception e) {
40             e.printStackTrace();
41             throw new RuntimeException(e);
42         } finally {         
43             try {
44                 transport.close();
45             } catch (MessagingException e) {
46                 e.printStackTrace();
47                 throw new RuntimeException(e);
48             }
49         }
50     }      

3. 完善payAction

  完成了工具類的封裝,接下來我們把該工具類放到BaseAction中,通過​

​@Resource​

​注解注入進來,供Action使用,下面我們完善前面的payAction中的​

​backBank()​

​方法,如下:

1 @Controller("payAction")
 2 @Scope("prototype")
 3 public class PayAction extends BaseAction<Object> implements ParameterAware {
 4 
 5     //省略不相關的代碼……
 6 
 7     public void backBank() {
 8         BackData backData = (BackData)model;
 9         System.out.println(model);
10         boolean isOK = payService.checkBackData(backData);
11         if(isOK) {
12             //1. 更新訂單狀态,參數是自己根據資料庫中的情況傳進去的,用來測試
13             forderService.updateStatusById(Integer.valueOf(201605006), 2);
14             //2. 根據user郵箱位址,發送郵件
15             String emailAddress = backData.getR8_MP().split(",")[0];
16             emailUtil.sendEmail(emailAddress, backData.getR6_Order());
17             //3. 發送手機短信,下一篇部落格來介紹發送短信的功能
18             System.out.println("----success!!----");
19         } else {
20             System.out.println("----false!!!----");
21         }
22     }
23 }      

  從易寶那邊傳回的資訊中r6_Order參數中儲存的是訂單的編号,r8_MP參數中是使用者的郵箱和電話,第一個是郵箱第二個是電話,用逗号隔開了,是以我們首先要擷取使用者的郵箱位址,然後再來發送郵件。好了,支付完成後給使用者發送郵件的功能就完成了。