继续昨天的学习(详细见javamail实现发送邮件并简单实现观察者模式),昨天只是简单的用javamail来发送邮件,需要自己进行一些封装,实际应用到项目中可能封装的会更多,由于项目中将要采用Spring MVC+mybatis这个架构来开发,并且有maven来管理,所以就试着搜了下spring是否提供相关功能,发现确实有,故整理出来供大家参考。
先介绍一下采用spring mail的好处吧,Spring 提供了一个发送电子邮件的高级抽象层,它向用户屏蔽了底层邮件系统的一些细节,同时负责低层次的代表客户端的资源处理。所以用 Spring 来发送 email 会省事很多和让发邮件变的简单许多,可以让我们更专注邮件内容本身而不必理会底层的具体实现。Spring邮件抽象层的主要包为org.springframework.mail。它包括了发送电子邮件的主要接口MailSender(实现类为org.springframework.mail.javamail.JavaMailSenderImpl,下面会用到改实现类)和封装了简单邮件属性的值对象SimpleMailMessage。下面会具体介绍spring mail实现过程并应用spring test进行单元测试(文章最后会提供源码下载):
maven工程的构建这里就不详细介绍了,晒一下工程结构目录吧:
pom清单:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>SpringMailTest</groupId>
<artifactId>SpringMailTest</artifactId>
<version>1.0</version>
<packaging>war</packaging>
<name />
<description />
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>3.2.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>3.2.0.RELEASE</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.5</version>
</dependency>
<!-- javamail -->
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.4.5</version>
</dependency>
</dependencies>
<build>
<sourceDirectory>${basedir}/src</sourceDirectory>
<outputDirectory>${basedir}/WebRoot/WEB-INF/classes</outputDirectory>
<resources>
<resource>
<directory>${basedir}/src</directory>
<excludes>
<exclude>**/*.java</exclude>
</excludes>
</resource>
</resources>
<plugins>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<configuration>
<webappDirectory>${basedir}/WebRoot</webappDirectory>
<warSourceDirectory>${basedir}/WebRoot</warSourceDirectory>
</configuration>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
我的spring版本不是最新的,现在已经更新到了4.x版本了,大家可以根据自己的需求选取版本。其中<artifactId>spring-context-support</artifactId>这个依赖提供了spring mail封装的各接口,<artifactId>spring-test</artifactId>这个依赖提供了Spring的单元测试(可以通过简单的注释获取到相关bean),<artifactId>mail</artifactId>这个依赖提供javamail jar包,这个是目前最新的版本。其余的就是日志相关依赖了。
spring-mail配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
">
<!-- 引入属性文件 -->
<context:property-placeholder location="classpath:mail.properties" />
<!-- 邮件发送器 -->
<bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
<property name="host" value="${mail.host}" />
<property name="username" value="${mail.username}" />
<property name="password" value="${mail.password}" />
<property name="defaultEncoding" value="UTF-8"></property>
<property name="javaMailProperties">
<props>
<prop key="mail.smtp.auth">${mail.smtp.auth}</prop>
<prop key="mail.smtp.timeout">${mail.smtp.timeout}</prop>
<prop key="mail.smtp.port">${mail.smtp.port}</prop>
</props>
</property>
</bean>
<bean id="simpleMailMessage" class="org.springframework.mail.SimpleMailMessage">
<!-- 发件人email -->
<property name="from" value="${mail.username}" />
</bean>
<bean id="mailUtil" class="com.study.mail.MailUtil">
<property name="mailSender" ref="mailSender"></property>
<property name="simpleMailMessage" ref="simpleMailMessage"></property>
</bean>
</beans>
这个也没啥好说的,估计大家都懂。
mail属性文件:mail.host=smtp.163.com
mail.username=xx@163.com
mail.password=xx
mail.smtp.auth=true
mail.smtp.timeout=25000
mail.smtp.port=25
MailUtil.java:
/**
*
*/
package com.study.mail;
import java.util.List;
import org.springframework.mail.MailSender;
import org.springframework.mail.SimpleMailMessage;
/**
*
*
* @author <a href="ls.zhaoxiangyu@gmail.com">zhao</>
* @date 2015-9-23
*/
public class MailUtil {
private MailSender mailSender;
private SimpleMailMessage simpleMailMessage;
//Spring 依赖注入
public void setMailSender(MailSender mailSender) {
this.mailSender = mailSender;
}
//Spring 依赖注入
public void setSimpleMailMessage(SimpleMailMessage simpleMailMessage) {
this.simpleMailMessage = simpleMailMessage;
}
/**
* 单发
*
* @param recipient 收件人
* @param subject 主题
* @param content 内容
*/
public void send(String recipient,String subject,String content){
simpleMailMessage.setTo(recipient);
simpleMailMessage.setSubject(subject);
simpleMailMessage.setText(content);
mailSender.send(simpleMailMessage);
}
/**
* 群发
*
* @param recipients 收件人
* @param subject 主题
* @param content 内容
*/
public void send(List<String> recipients,String subject,String content){
simpleMailMessage.setTo(recipients.toArray(new String[recipients.size()]));
simpleMailMessage.setSubject(subject);
simpleMailMessage.setText(content);
mailSender.send(simpleMailMessage);
}
}
Spring JUnit Test:
/**
*
*/
package com.test.mail;
import java.util.ArrayList;
import java.util.List;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import com.study.mail.MailUtil;
/**
*
*
* @author <a href="ls.zhaoxiangyu@gmail.com">zhao</>
* @date 2015-9-23
*/
@RunWith(SpringJUnit4ClassRunner.class)//@RunWith(SpringJUnit4ClassRunner.class) 来启动 Spring 对测试类的支持
@ContextConfiguration("/spring.xml")//@ContextConfiguration 注释标签来指定 Spring 配置文件或者配置类的位置
public class MailTest {
private static final Logger log = LoggerFactory.getLogger(MailTest.class);
@Autowired
private MailUtil mailUtil;
@Test
public void sendSingleTest(){
log.info("sendSingleTest");
mailUtil.send("xx@sina.com", "This is a test single mail", "Hello Single!");
}
@Test
public void sendMassTest(){
log.info("sendMassTest");
List<String> recipients=new ArrayList<String>();
recipients.add("xx@sina.com");
recipients.add("xx@qq.com");
mailUtil.send(recipients, "This is a test mass mail", "Hello Mass!");
}
}
ok,上面基本就是全部了,运行单元测试就可以成功发送邮件了(单发与群发),晒一张收到邮件图:
最后提供工程源码下载(免费):http://download.csdn.net/download/osaymissyou0/9133825