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相关文档。