1.引入JavaMail
javax.mail
${mail.version}
2.配置mailSender和线程池
${mail.customer.transport.protocol}
${mail.customer.mail.smtp.auth}
true
3.建实体类
public classMailEntry {privateString recipient;//可以是String[]数组,多个收件人privateString subject;privateString text;publicString getSubject() {returnsubject;
}public voidsetSubject(String subject) {this.subject =subject;
}publicString getText() {returntext;
}public voidsetText(String text) {this.text =text;
}publicString getRecipient() {returnrecipient;
}public voidsetRecipient(String recipient) {this.recipient =recipient;
}
4.发送邮件的业务层实现
public classMailSendUtil {public static Logger logger = LoggerFactory.getLogger(MailSendUtil.class);private static final String[] configLocations = {"config/applicationContext-mail.xml"};public static ApplicationContext ctx = newClassPathXmlApplicationContext(configLocations);public TaskExecutor taskExecutor = (ThreadPoolTaskExecutor) ctx.getBean("taskExecutor");public JavaMailSender javaMailSender = (JavaMailSender) ctx.getBean("cusMailSender");public voidsendMailToCus(MailEntry mailEntry) {
MimeMessage message=javaMailSender.createMimeMessage();try{//设置回执//message.addHeader("Disposition-Notification-To", "1");
MimeMessageHelper helper = new MimeMessageHelper(message, true, "utf-8");
helper.setFrom(ActionMessage.getStaMessage("mail.customer.senderAddress"));
helper.setSubject(mailEntry.getSubject());//设置为TRUE则可以使用Html标记
helper.setText(mailEntry.getText(), true);
helper.setTo(mailEntry.getRecipient());
addSendMailTask(mailEntry.getRecipient(), message);
}catch(MessagingException e) {
logger.error("邮件转换异常,邮件详细信息为", e.getMessage());
}
}/***@paramemail 邮箱地址
*@parammessage MimeMessage邮件封装类
* @desc 使用多线程发送邮件*/
private void addSendMailTask(final String email, finalMimeMessage message) {try{
taskExecutor.execute(newRunnable() {
@Overridepublic voidrun() {
javaMailSender.send(message);long threadId =Thread.currentThread().getId();
logger.info("线程ID:"+threadId+"发送邮件:" +email);
}
});
}catch(Exception e) {
logger.error(email+ "邮件发送异常,邮件详细信息为", e.getMessage());
}
}
}
线程池中线程数量达到最大允许的线程数量,然后所有线程都同时进入空闲状态且空闲时间超过keepAliveTime,停止多余的线程并保留核心数量的线程