MailServiceImpl.java 3.4 KB
package com.framework.mail;

import java.io.File;
import java.util.List;
import java.util.Properties;

import javax.mail.internet.MimeMessage;

import org.apache.commons.lang3.StringUtils;
import org.springframework.core.io.FileSystemResource;
import org.springframework.core.task.TaskExecutor;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import org.springframework.mail.javamail.MimeMessageHelper;

public class MailServiceImpl implements MailService {

	private JavaMailSender mailSender; // 注入
	private TaskExecutor taskExecutor;

	// 判断同步或者异步发送
	@Override
	public void sendMail(Email email) throws Exception {

		JavaMailSenderImpl senderImpl = (JavaMailSenderImpl) mailSender;
		Properties mailProperties = senderImpl.getJavaMailProperties();
		// 获取接收人信息
		String to = email.getTo();
		if (StringUtils.isEmpty(to)) {
			String sendTo = mailProperties.getProperty("mail.sendTo");
			email.setTo(sendTo);
		}
		if (email.getToArray().length > 500) { // 收件地址大于5时,异步发送
			sendMailByAsynchronousMode(email);
		} else {
			try {
				sendMailBySynchronizationMode(email);
			} catch (Exception e) {
				throw new Exception(e);
			}
		}
	}

	// 实现异步只需把同步发送放到Concurrent里面执行
	@Override
	public void sendMailByAsynchronousMode(final Email email) throws Exception {
		taskExecutor.execute(new Runnable() {
			public void run() {
				try {
					sendMailBySynchronizationMode(email);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	// 同步发送邮件
	@Override
	public void sendMailBySynchronizationMode(Email email) throws Exception {
		try {
			JavaMailSenderImpl senderImpl = (JavaMailSenderImpl) mailSender;

			MimeMessage mime = mailSender.createMimeMessage();
			MimeMessageHelper helper = null;
			if (email.getAttachList() != null && email.getAttachList().size() > 0) {
				helper = new MimeMessageHelper(mime, true, "utf-8");
			} else {
				helper = new MimeMessageHelper(mime, false, "utf-8");
			}

			helper.setFrom(StringUtils.isEmpty(email.getFrom()) ? senderImpl.getUsername() : email.getFrom()); // 发件人
			helper.setTo(email.getToArray()); // 收件人

			if (email.getCc() != null && email.getCc().trim().length() > 0) {
				String[] cc = email.getCc().split(";");
				helper.setCc(cc); // 抄送
			}
			if (email.getBccMail() != null) {
				helper.setBcc(email.getBccMail());
			}
			helper.setSubject(email.getSubject()); // 邮件主题
			if (null != email.getContent()) {
				helper.setText(email.getContent(), true); // true表示设定html格式
			}

			List<String> attachList = email.getAttachList();
			if (null != attachList && 0 < attachList.size()) {
				for (String attach : attachList) {
					FileSystemResource file = new FileSystemResource(new File(attach));
					helper.addAttachment(file.getFilename(), file);
				}
			}
			mailSender.send(mime);
		} catch (Exception e) {
			e.printStackTrace();
			throw new Exception(e);
		}
	}

	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;
	}

}