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