原理可以參考
http://blog.csdn.net/guozebo/article/details/51090612
http://hstrust.iteye.com/blog/2316429
項目中需要定時檢測數據庫Email表,把issend=false的取出來發送,採用ScheduledExecutorService實現
import com.alibaba.fastjson.JSON;
import com.ymatou.envmanagement.constants.Constants;
import com.ymatou.envmanagement.domain.repository.EmailReposity;
import com.ymatou.envmanagement.holder.RuleHolder;
import com.ymatou.envmanagement.infrastructure.mysqldb.model.EmailPo;
import com.ymatou.envmanagement.infrastructure.mysqldb.model.NodePo;
import com.ymatou.envmanagement.service.EmailService;
import com.ymatou.envmanagement.support.ScheduledExecutorHelper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.PostConstruct;
import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
/**
* Created by chenjiazhu on 2017/8/23.
*/
@Component
public class EmailSendExecutor {
private static final Logger logger = LoggerFactory.getLogger(RuleDiscoverer.class);
private ScheduledExecutorService scheduledExecutorService = ScheduledExecutorHelper.newSingleThreadScheduledExecutor("rule discover2");
@Autowired
private EmailReposity emailReposity;
@Autowired
private EmailService emailService;
@PostConstruct
public void execute() {
scheduledExecutorService.scheduleAtFixedRate(() -> {
try {
sendEmail();
} catch (Exception ex) {
logger.error("reload rule error", ex);
}
},0L, 5L, TimeUnit.MINUTES );
}
@Transactional
public void sendEmail() {
List<Map> titles = emailReposity.selectSendTitle();
for (Map title:titles)
{
String address = title.get("address")!=null?title.get("address").toString():"";
String titleStr = title.get("title")!=null?title.get("title").toString():"";
if((!address.equals("")) && (!title.equals("")))
{
List<EmailPo> emails = emailReposity.selectSendMessage(titleStr,address);
if(emails!=null&&emails.size()>0) {
int i=1;
StringBuilder body = new StringBuilder();
for (EmailPo email : emails) {
body.append(i++);
body.append(". ");
body.append(email.getBody());
body.append("<br/>");
email.setIssend(true);
email.setSendtime(LocalDateTime.now().format(Constants.FORMATTER_YYYYMMDDHHMM));
emailReposity.updateByPrimaryKeySelective(email);
}
emailService.sendHtmlMail(address, titleStr+" 共"+emails.size()+"個站點異常", body.toString());
}
}
}
logger.info("Send Email finished");
}
}
發郵件
import com.ymatou.envmanagement.config.BizConfig;
import com.ymatou.envmanagement.config.EmailConfig;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import javax.mail.MessagingException;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeUtility;
import java.util.Properties;
/**
* Created by zhangxiaoming on 2016/11/24.
*/
@Service
public class EmailService implements InitializingBean {
protected static final Logger logger = LoggerFactory.getLogger(EmailService.class);
private JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
@Resource
private EmailConfig emailConfig;
@Autowired
private BizConfig bizConfig;
public void sendHtmlMail(String toAddress, String title, String text) {
if (StringUtils.isBlank(toAddress) || StringUtils.isBlank(title) || StringUtils.isBlank(text) || !bizConfig.isEnableSend())
return;
String[] tos = StringUtils.split(toAddress, ";");
sendHtmlMail(tos, title, text);
}
/**
* 發送html郵件
* @param text
* @throws AddressException
* @throws MessagingException
*/
public void sendHtmlMail(String[] to, String title, String text) {
try {
MimeMessage mimeMessage = mailSender.createMimeMessage();
MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage, true, "UTF-8");
String nick = MimeUtility.encodeText("報警系統");
InternetAddress[] toArray = new InternetAddress[to.length];
for (int i = 0; i < to.length; i++) {
toArray[i] = new InternetAddress(to[i]);
}
messageHelper.setFrom(new InternetAddress(String.format("%s<%s>", nick, emailConfig.getFromMailAddress())));
messageHelper.setTo(toArray);
messageHelper.setSubject(title);
messageHelper.setText(text, true);
mimeMessage = messageHelper.getMimeMessage();
mailSender.send(mimeMessage);
} catch (Exception ex) {
StringBuilder sb = new StringBuilder();
sb.append("mailto:");
sb.append(StringUtils.join(to, ";"));
sb.append(ex.getMessage());
logger.error(sb.toString(), ex);
//Throwables.propagate(ex);
}
}
/**
* 設置郵箱host,用戶名和密碼
*/
@Override
public void afterPropertiesSet() throws Exception {
mailSender.setHost(emailConfig.getSmtpHost());
mailSender.setUsername(emailConfig.getFromMailAddress());
mailSender.setPassword(emailConfig.getFromMailPassword());
Properties properties = new Properties();
properties.setProperty("mail.smtp.connectiontimeout","10000");
properties.setProperty("mail.smtp.timeout","10000");
mailSender.setJavaMailProperties(properties);
}
}