Java异步邮件工具类SpringMailUtil2.0
很给力的邮件发送工具类,支持线程池异步发送。
JavaWeb工具类目录 [http://baike.xsoftlab.net/view/1059.html](http://baike.xsoftlab.net/view/1059.html)
源码:
```
package com.itshidu.ssh.commons.util;
import java.io.File;
import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.task.TaskExecutor;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Component;
/**
* 快速发送邮件
* @author Mr.Xia v1.0 create:2016.03.29 http://www.zhenzhigu.com
* @author Mr.Xia v2.0 create:2017.01.11 http://www.zhenzhigu.com
*/
@Component
public class MailUtil {
//Spring不支持静态属性注入
private static JavaMailSenderImpl sender;
private static TaskExecutor executor;
@Autowired
public void setSender(JavaMailSenderImpl jmsi){
MailUtil.sender = jmsi;
}
@Autowired
public void setExecutor(TaskExecutor executor){
MailUtil.executor = executor;
}
public static void addSendMailTask(final MimeMessage mimeMessage) {
try {
executor.execute(new Runnable() {
public void run(){
sender.send(mimeMessage);
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 发送带附件的Mime邮件,可指定附件名
* @param to
* @param subject
* @param text
* @param fileNames[]
* @param files[]
* @param asyn 是否异步
* @throws MessagingException
*/
public static void send(String to,String subject,String text,String[] fileNames,File[] files,boolean asyn) throws MessagingException{
//使用JavaMail的MimeMessage,支付更加复杂的邮件格式和内容
MimeMessage msg = sender.createMimeMessage();
//创建MimeMessageHelper对象,处理MimeMessage的辅助类
MimeMessageHelper helper = new MimeMessageHelper(msg, true);
//使用辅助类MimeMessage设定参数
helper.setFrom(sender.getUsername());
helper.setTo(to);
helper.setSubject(subject);
helper.setText(text,true);
//加入附件
if(files!=null&&files.length>0){
for(int i=0;i<files.length;i++){
if(fileNames!=null&&i<fileNames.length&&fileNames[i]!=null){
helper.addAttachment(fileNames[i], files[i]);
}else{
helper.addAttachment(files[i].getName(), files[i]);
}
}
}
if(asyn){
//使用线程池异步发送
addSendMailTask(msg);
}else{
sender.send(msg);
}
}
/**
* 发送带单个附件的Mime邮件,可指定附件名
* @param to
* @param subject
* @param text
* @param file
* @param asyn 是否异步
* @throws MessagingException
*/
public static void send(String to,String subject,String text,String fileName,File file,boolean asyn) throws MessagingException{
send(to, subject, text, new String[]{fileName}, new File[]{file},asyn);
}
/**
* 发送带附件的Mime邮件
* @param to
* @param subject
* @param text
* @param fileNames[]
* @param files[]
* @param asyn 是否异步
* @throws MessagingException
*/
public static void send(String to,String subject,String text,File[] files,boolean asyn) throws MessagingException{
send(to, subject, text, null, files,asyn);
}
/**
* 发送带单个附件的Mime邮件,使用默认附件名
* @param to
* @param subject
* @param text
* @param file
* @param asyn 是否异步
* @throws MessagingException
*/
public static void send(String to,String subject,String text,File file,boolean asyn) throws MessagingException{
send(to, subject, text, file==null? null:file.getName(), file,asyn);
}
/**
* 发送无附件的mime邮件
* @param to
* @param subject
* @param text
* @param asyn 是否异步
* @throws MessagingException
*/
public static void send(String to,String subject,String text,boolean asyn) throws MessagingException{
send(to, subject, text, new File[]{},asyn);
}
}
```
applicationContext.xml
```
<!-- JavaMail相关配置 -->
<bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl" >
<property name="host" value="smtp.zhenzhigu.com"></property>
<property name="username" value="xxx@itshidu.com"></property>
<property name="password" value="xxxxxx"></property>
<property name="protocol" value="smtp"></property>
<property name="defaultEncoding" value="utf-8"></property>
<property name="javaMailProperties">
<props>
<prop key="mail.smtp.auth">true</prop>
<prop key="mail.smtp.from">xxx@itshidu.com</prop>
<prop key="mail.debug">false</prop>
</props>
</property>
</bean>
<!-- 用于异步发送邮件的线程池 -->
<bean id="mailTaskExecutor"
class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
<!-- 核心线程数 -->
<property name="corePoolSize" value="10" />
<!-- 最大线程数 -->
<property name="maxPoolSize" value="50" />
<!-- 最大队列数 -->
<property name="queueCapacity" value="10000" />
<!-- 线程池维护线程所允许的空闲时间 -->
<property name="keepAliveSeconds" value="60" />
</bean>
```
使用方法
```
SpringMailUtil.send("shoujianren@itshidu.com", "测试邮件", "测试一下新的邮件工具类",
new File[]{
new File("d:/abc/单词表.txt"),
new File("d:/abc/book.xml"),
new File("d:/abc/笔记-零配置.txt")
},true);
```
支持html格式,也可以在邮件中添加附件
最后一个参数代表是否使用线程池进行异步发送,true使用,false不使用