package com.mossle.core.mail; import java.net.UnknownHostException; import java.util.Map; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; import com.mossle.core.util.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.core.io.InputStreamSource; import org.springframework.mail.javamail.JavaMailSender; import org.springframework.mail.javamail.MimeMessageHelper; import org.springframework.util.Assert; public class MailHelper { private static Logger logger = LoggerFactory.getLogger(MailHelper.class); private HostGenerator hostGenerator = new HostGeneratorImpl(); private MailServerInfoCache mailServerInfoCache = new MemoryMailServerInfoCache(); public MailDTO send(String from, String to, String subject, String content) { return this.send(from, to, subject, content, this.getDefaultMailServerInfo()); } public MailDTO send(String from, String to, String subject, String content, String mailServerInfoName) { return this.send(from, to, subject, content, mailServerInfoCache.getMailServerInfo(mailServerInfoName)); } public MailDTO send(String from, String to, String subject, String content, MailServerInfo mailServerInfo) { MailDTO mailDto = new MailDTO(); mailDto.setFrom(from); mailDto.setTo(to); mailDto.setSubject(subject); mailDto.setContent(content); MailDTO resultMailDto = this.send(mailDto, mailServerInfo); return resultMailDto; } public MailDTO send(MailDTO mailDto) { logger.debug("send : {}", mailDto); return this.send(mailDto, this.getDefaultMailServerInfo()); } public MailDTO send(MailDTO mailDto, MailServerInfo mailServerInfo) { try { if (mailServerInfo == null) { mailServerInfo = this.getDefaultMailServerInfo(); } String from = mailDto.getFrom(); String to = mailDto.getTo(); String subject = mailDto.getSubject(); String content = mailDto.getContent(); if (StringUtils.isBlank(from)) { from = mailServerInfo.getDefaultFrom(); mailDto.setFrom(from); } logger.debug("{} : {}", from, to); if (mailServerInfo.isSkip()) { logger.info("send mail from {} to {}", from, to); if (StringUtils.isNotBlank(mailDto.getCc())) { logger.info("cc : " + mailDto.getCc() + "\n"); } if (StringUtils.isNotBlank(mailDto.getBcc())) { logger.info("bcc : " + mailDto.getBcc() + "\n"); } logger.info("subject : {}, content : {}", subject, content); mailDto.setSuccess(true); return mailDto; } else if (mailServerInfo.isTest()) { return this.sendTestMail(mailDto, mailServerInfo); } else { return this.sendRealMail(mailDto, mailServerInfo); } } catch (Exception ex) { logger.error(ex.getMessage(), ex); return null; } } protected MailDTO sendTestMail(MailDTO mailDto, MailServerInfo mailServerInfo) { String from = mailDto.getFrom(); String to = mailDto.getTo(); String subject = mailDto.getSubject(); String content = mailDto.getContent(); String address = ""; try { address = hostGenerator.generateLocalAddress(); } catch (UnknownHostException ex) { logger.error(ex.getMessage(), ex); } String decoratedContent = "address : " + address + "\nfrom : " + from + "\nto : " + to + "\n"; if (StringUtils.isNotBlank(mailDto.getCc())) { decoratedContent += ("cc : " + mailDto.getCc() + "\n"); mailDto.setCc(null); } if (StringUtils.isNotBlank(mailDto.getBcc())) { decoratedContent += ("bcc : " + mailDto.getBcc() + "\n"); mailDto.setBcc(null); } decoratedContent += ("subject : " + subject + "\ncontent : " + content); String decoratedSubject = "[test]" + subject; String decoratedFrom = from; String testMail = mailServerInfo.getTestMail(); logger.info("send mail from {} to {}", decoratedFrom, testMail); logger.info("subject : {}, content : {}", decoratedSubject, decoratedContent); mailDto.setFrom(decoratedFrom); mailDto.setTo(testMail); mailDto.setSubject(decoratedSubject); mailDto.setContent(decoratedContent); return this.sendRealMail(mailDto, mailServerInfo); } protected MailDTO sendRealMail(MailDTO mailDto, MailServerInfo mailServerInfo) { String from = mailDto.getFrom(); String to = mailDto.getTo(); String cc = mailDto.getCc(); String bcc = mailDto.getBcc(); String subject = mailDto.getSubject(); String content = mailDto.getContent(); to = to.replaceAll("\n", ",").replaceAll(";", ","); if (StringUtils.isBlank(cc)) { cc = null; } else { cc = cc.replaceAll("\n", ",").replaceAll(";", ","); } if (StringUtils.isBlank(bcc)) { bcc = null; } else { bcc = bcc.replaceAll("\n", ",").replaceAll(";", ","); } logger.debug("from : {}, to : {}", from, to); logger.debug("cc : {}, bcc : {}", cc, bcc); logger.debug("subject : {}", subject); try { JavaMailSender javaMailSender = mailServerInfo.getJavaMailSender(); MimeMessage msg = javaMailSender.createMimeMessage(); MimeMessageHelper helper = new MimeMessageHelper(msg, true, "UTF-8"); helper.setFrom(from); helper.setSubject(subject); helper.setTo(InternetAddress.parse(to)); helper.setText(content, true); if (StringUtils.isNotBlank(cc)) { helper.setCc(InternetAddress.parse(cc)); } if (StringUtils.isNotBlank(bcc)) { helper.setBcc(InternetAddress.parse(bcc)); } for (Map.Entry<String, InputStreamSource> entry : mailDto .getInlines().entrySet()) { helper.addInline(entry.getKey(), entry.getValue(), "image/png"); } for (Map.Entry<String, InputStreamSource> entry : mailDto .getAttachments().entrySet()) { helper.addAttachment(entry.getKey(), entry.getValue()); } javaMailSender.send(msg); logger.debug("send mail from {} to {}", from, to); mailDto.setSuccess(true); } catch (Exception e) { logger.error("send mail error", e); mailDto.setSuccess(false); if (e.getCause() != null) { mailDto.setException(e.getCause()); } else { mailDto.setException(e); } } return mailDto; } public MailServerInfo getDefaultMailServerInfo() { return mailServerInfoCache.getDefaultMailServerInfo(); } public void setDefaultMailServerInfo(MailServerInfo defaultMailServerInfo) { Assert.notNull(defaultMailServerInfo); mailServerInfoCache.setDefaultMailServerInfo(defaultMailServerInfo); } }