5.3.2 account-email的主代码

account-email项目Java主代码位于src/main/java,资源文件(非Java)位于src/main/resources目录下。

account-email只有一个很简单的接口,见代码清单5-2。

代码清单5-2 AccountEmailService.java


package com.juvenxu.mvnbook.account.email;

public interface AccountEmailService

{

void sendMail(String to,String subject,String htmlText)

throws AccountEmailException;

}


sendMail()方法用来发送html格式的邮件,to为接收地址,subject为邮件主题,html-Text为邮件内容,如果发送邮件出错,则抛出AccountEmailException异常。

对应于该接口的实现见代码清单5-3。

代码清单5-3 AccountEmailServiceImpl.java


package com.juvenxu.mvnbook.account.email;

import javax.mail.MessagingException;

import javax.mail.internet.MimeMessage;

import org.springframework.mail.javamail.JavaMailSender;

import org.springframework.mail.javamail.MimeMessageHelper;

public class AccountEmailServiceImpl

implements AccountEmailService

{

private JavaMailSender javaMailSender;

private String systemEmail;

public void sendMail(String to,String subject,String htmlText)

throws AccountEmailException

{

try

{

MimeMessage msg=javaMailSender.createMimeMessage();

MimeMessageHelper msgHelper=new MimeMessageHelper(msg);

msgHelper.setFrom(systemEmail);

msgHelper.setTo(to);

msgHelper.setSubject(subject);

msgHelper.setText(htmlText,true);

javaMailSender.send(msg);

}

catch(MessagingException e)

{

throw new AccountEmailException("Faild to send mail.",e);

}

}

public JavaMailSender getJavaMailSender()

{

return javaMailSender;

}

public void setJavaMailSender(JavaMailSender javaMailSender)

{

this.javaMailSender=javaMailSender;

}

public String getSystemEmail()

{

return systemEmail;

}

public void setSystemEmail(String systemEmail)

{

this.systemEmail=systemEmail;

}

}


首先,该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


<?xml version="1.0"encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">

<bean id="propertyConfigurer"

class="org.springframework.beans.factory.config.PropertyPlaceholder-

Configurer">

<property name="location"value="classpath:service.properties"/>

</bean>

<bean id="javaMailSender"class="org.springframework.mail.javamail.JavaMail-

SenderImpl">

<property name="protocol"value="${email.protocol}"/>

<property name="host"value="${email.host}"/>

<property name="port"value="${email.port}"/>

<property name="username"value="${email.username}"/>

<property name="password"value="${email.password}"/>

<property name="javaMailProperties">

<props>

<prop key="mail.${email.protocol}.auth">${email.auth}</prop>

</props>

</property>

</bean>

<bean id="accountEmailService"

class="com.juvenxu.mvnbook.account.email.AccountEmailServiceImpl">

<property name="javaMailSender"ref="javaMailSender"/>

<property name="systemEmail"value="${email.systemEmail}"/>

</bean>

</beans>


Spring Framework会使用该XML配置创建ApplicationContext,以实现依赖注入。该配置文件定义了一些bean,基本对应了Java程序中的对象。首先解释下id为propertyConfigurer的bean,其实现为org.springframework.beans.factory.config.PropertyPlaceholderConfigurer,这是Spring Framework中用来帮助载入properties文件的组件。这里定义location的值为class-path:email.properties,表示从classpath的根路径下载入名为email.properties文件中的属性。

接着定义id为javaMailSender的bean,其实现为org.springframework.mail.javamail.JavaMail-SenderImpl,这里需要定义邮件服务器的一些配置,包括协议、端口、主机、用户名、密码,是否需要认证等属性。这段配置还使用了Spring Framework的属性引用,比如host的值为${email.host},之前定义propertyConfigurer的作用就在于此。这么做可以将邮件服务器相关的配置分离到外部的properties文件中,比如可以定义这样一个properties文件,配置javaMailSender使用gmail:


email.protocol=smtps

email.host=smtp.gmail.com

email.port=465

email.username=your-id@gmail.com

email.password=your-password

email.auth=true

email.systemEmail=your-id@juvenxu.com


这样,javaMailSender实际使用的protocol就会成为smtps,host会成为smtp.gmail.com,同理还有port、username等其他属性。

最后一个bean是accountEmailService,对应了之前描述的com.juvenxu.mvnbook.account.

email.AccountEmailServiceImpl,配置中将另外一个bean javaMailSender注入,使其成为该类javaMailSender字段的值。

上述就是Spring Framework相关的配置,这里不再进一步深入,读者如果有不是很理解的地方,请查询Spring Framework相关文档。