spring的javamail较javax.mail简洁,使用方便很多。
1. 需要jar包
spring-context.jar
mail.jar
spring-core.jar
activation.jar
2. Email实体类
/** 收件人 **/
private List<String> address;
/** 暗送 **/
private String bcc;
/** 抄送给 **/
private List<String> cc;
/** 邮件主题 **/
private String subject;
/** 邮件内容 **/
private String content;
/** 附件 **/
private List<File> annexFile;
(get和set方法此处省略。。。)
3. xml配置
<context:annotation-config />
<!-- 加载配置文件 -->
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>/WEB-INF/springcfg/dataSource.properties</value>
<value>/WEB-INF/springcfg/mail.properties</value>
</list>
</property>
</bean>
<!--邮件服务器-->
<bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
<property name="host">
<value>${mail.smtp.host}</value>
</property>
<property name="javaMailProperties">
<props>
<prop key="mail.smtp.auth">${mail.smtp.auth}</prop>
<prop key="mail.smtp.timeout">${mail.smtp.timeout}</prop>
</props>
</property>
<property name="username">
<value>${mail.user}</value>
</property>
<property name="password">
<value>${mail.pwd}</value>
</property>
</bean>
<!--异步线程执行器-->
<bean id="taskExecutor"
class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
<property name="corePoolSize" value="10" />
<property name="maxPoolSize" value="30" />
</bean>
<!-- Email -->
<bean id="mailUtil" class="org.abc.commons.MailUtil" scope="prototype">
<property name="mailSender" ref="mailSender" />
<property name="taskExecutor" ref="taskExecutor" />
<property name="mailProperty">
<props>
<prop key="mail.from">${mail.from}</prop>
<prop key="mail.replyTo">${mail.replyTo}</prop>
</props>
</property>
</bean>
部分属性在mail.properties中配置,也可以写入xml
4. 邮件发送工具类
package org.abc.commons;
import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.Properties;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeUtility;
import org.springframework.core.task.TaskExecutor;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
public class MailUtil {
private JavaMailSender mailSender;
private TaskExecutor taskExecutor;
private Properties mailProperty;
private StringBuffer message = new StringBuffer();
/**
* 发送邮件
* @param email 封装的Email实体类
* @throws Exception
*/
public void sendMail(Email email) throws Exception {
if (email.getAddress() == null || email.getAddress().size() == 0) {
this.message.append("没有收件人");
return;
}
if (email.getAddress().size() > 5) {// 收件人大于5封时,采用异步发送
sendMailByAsynchronousMode(email);
this.message.append("收件人过多,正在采用异步方式发送...<br/>");
} else {
sendMailBySynchronizationMode(email);
this.message.append("正在同步方式发送邮件...<br/>");
}
}
/**
* 异步发送
*/
public void sendMailByAsynchronousMode(final Email email) {
taskExecutor.execute(new Runnable() {
public void run() {
try {
sendMailBySynchronizationMode(email);
} catch (Exception e) {
}
}
});
}
/**
* 同步发送
* @throws IOException
*/
public void sendMailBySynchronizationMode(Email email) throws Exception {
// 简单邮件
// SimpleMailMessage mime = new SimpleMailMessage();
// HTML邮件
MimeMessage mime = mailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(mime, true, "utf-8");
helper.setFrom(this.mailProperty.getProperty("mail.from"));// 发件人
List<String> list = email.getAddress();
String[] addrs = new String[list.size()];
for (int i = 0; i < list.size(); i++) {
addrs[i] = list.get(i);
}
helper.setTo(addrs);// 收件人
helper.setBcc(email.getBcc());// 暗送
List<String> ccList = email.getCc();
if(ccList!=null ){
String[] cc = new String[ccList.size()];
for (int i = 0; i < ccList.size(); i++) {
cc[i] = ccList.get(i);
}
helper.setCc(cc);// 抄送
}
// 内嵌资源,这种功能很少用,因为大部分资源都在网上,只需在邮件正文中给个URL就足够了.
if(email.getAnnexFile()!=null){
for (File file : email.getAnnexFile()) {
if (file == null) {
continue;
}
helper.addAttachment(MimeUtility.encodeWord(file.getName()), file);
}
}
helper.setReplyTo(this.mailProperty.getProperty("mail.replyTo"));// 回复到
helper.setSubject(email.getSubject());// 邮件主题
helper.setText(email.getContent(), true);// true表示设定html格式
mailSender.send(mime);
}
public JavaMailSender getMailSender() {
return mailSender;
}
public void setMailSender(JavaMailSender mailSender) {
this.mailSender = mailSender;
}
public TaskExecutor getTaskExecutor() {
return taskExecutor;
}
public void setTaskExecutor(TaskExecutor taskExecutor) {
this.taskExecutor = taskExecutor;
}
public void setMailProperty(Properties mailProperty) {
this.mailProperty = mailProperty;
}
}