讀古今文學網 > Maven實戰 > 5.3.2 account-email的主代碼 >

5.3.2 account-email的主代碼

account-email項目Java主代碼位於src/main/java,資源文件(非Java)位於src/main/resources目錄下。

account-email只有一個很簡單的接口,見代碼清單5-2。

代碼清單5-2 AccountEmailService.java

sendMail()方法用來發送html格式的郵件,to為接收地址,subject為郵件主題,htmlText為郵件內容,如果發送郵件出錯,則拋出AccountEmailException異常。

對應於該接口的實現見代碼清單5-3。

代碼清單5-3 AccountEmailServiceImpl.java

首先,該AccountEmailServiceImpl類有一個私有字段javaMailSender,該字段的類型org.springframework.mail.javamail.JavaMailSender是來自於Spring Framework的幫助簡化郵件發送的工具類庫,對應於該字段有一組getter()和setter()方法,它們用來幫助實現依賴注入。本節隨後會講述Spring Framework依賴注入相關的配置。

在sendMail()的方法實現中,首先使用javaMailSender創建一個MimeMessage,該msg對應了將要發送的郵件。接著使用MimeMessageHelper幫助設置該郵件的發送地址、收件地址、主題以及內容,msgHelper.setText(htmlText,true)中的true表示郵件的內容為html格式。最後,使用javaMailSender發送該郵件,如果發送出錯,則捕捉MessageException異常,包裝後再拋出該模塊自己定義的AccountEmailException異常。

這段Java代碼中沒有郵件服務器配置信息,這得益於Spring Framework的依賴注入,這些配置都通過外部的配置注入到了javaMailSender中,相關配置信息都在src/main/resources/account-email.xml這個配置文件中,見代碼清單5-4。

代碼清單5-4 account-email.xml

Spring Framework會使用該XML配置創建ApplicationContext,以實現依賴注入。該配置文件定義了一些bean,基本對應了Java程序中的對象。首先解釋下id為propertyConfigurer的bean,其實現為org.springframework.beans.factory.config.PropertyPlaceholderConfigurer,這是Spring Framework中用來幫助載入properties文件的組件。這裡定義location的值為classpath:account-email.properties,表示從classpath的根路徑下載入名為account-email.properties文件中的屬性。

接著定義id為javaMailSender的bean,其實現為org.springframework.mail.javamail.JavaMail-SenderImpl,這裡需要定義郵件服務器的一些配置,包括協議、端口、主機、用戶名、密碼,是否需要認證等屬性。這段配置還使用了Spring Framework的屬性引用,比如host的值為${email.host},之前定義propertyConfigurer的作用就在於此。這麼做可以將郵件服務器相關的配置分離到外部的properties文件中,比如可以定義這樣一個properties文件,配置javaMailSender使用gmail:

這樣,javaMailSender實際使用的protocol就會成為smtps,host會成為smtp.gmail.com,同理還有port、username等其他屬性。

最後一個bean是accountEmailService,對應了之前描述的com.juvenxu.mvnbook.account.email.AccountEmailServiceImpl,配置中將另外一個bean javaMailSender注入,使其成為該類javaMailSender字段的值。

上述就是Spring Framework相關的配置,這裡不再進一步深入,讀者如果有不是很理解的地方,請查詢Spring Framework相關文檔。