package com.mossle.internal.sendmail.service; import java.io.PrintWriter; import java.io.StringWriter; import java.util.Date; import java.util.List; import java.util.Map; import javax.annotation.Resource; import com.mossle.api.store.StoreConnector; import com.mossle.api.store.StoreDTO; import com.mossle.core.mail.MailDTO; import com.mossle.core.mail.MailHelper; import com.mossle.core.mail.MailServerInfo; import com.mossle.core.mapper.BeanMapper; import com.mossle.core.mapper.JsonMapper; import com.mossle.core.store.DataSourceInputStreamSource; import com.mossle.core.template.TemplateService; import com.mossle.core.util.StringUtils; import com.mossle.internal.sendmail.persistence.domain.SendmailAttachment; import com.mossle.internal.sendmail.persistence.domain.SendmailConfig; import com.mossle.internal.sendmail.persistence.domain.SendmailHistory; import com.mossle.internal.sendmail.persistence.domain.SendmailQueue; import com.mossle.internal.sendmail.persistence.domain.SendmailTemplate; import com.mossle.internal.sendmail.persistence.manager.SendmailConfigManager; import com.mossle.internal.sendmail.persistence.manager.SendmailHistoryManager; import com.mossle.internal.sendmail.persistence.manager.SendmailQueueManager; import com.mossle.internal.sendmail.persistence.manager.SendmailTemplateManager; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @Service @Transactional public class SendmailDataService { private static Logger logger = LoggerFactory .getLogger(SendmailDataService.class); private SendmailConfigManager sendmailConfigManager; private SendmailQueueManager sendmailQueueManager; private SendmailHistoryManager sendmailHistoryManager; private SendmailTemplateManager sendmailTemplateManager; private StoreConnector storeConnector; private BeanMapper beanMapper = new BeanMapper(); private MailHelper mailHelper; private TemplateService templateService; private JsonMapper jsonMapper = new JsonMapper(); public void send(String to, String subject, String content, String configCode, String tenantId) { SendmailConfig sendmailConfig = sendmailConfigManager.findUnique( "from SendmailConfig where name=? and tenantId=?", configCode, tenantId); SendmailQueue sendmailQueue = new SendmailQueue(); sendmailQueue.setReceiver(to); sendmailQueue.setSubject(subject); sendmailQueue.setContent(content); sendmailQueue.setSendmailConfig(sendmailConfig); sendmailQueue.setTenantId(tenantId); sendmailQueueManager.save(sendmailQueue); } public void sendTemplate(String to, String data, String templateCode, String configCode, String tenantId) { SendmailConfig sendmailConfig = sendmailConfigManager.findUnique( "from SendmailConfig where name=? and tenantId=?", configCode, tenantId); SendmailTemplate sendmailTemplate = sendmailTemplateManager.findUnique( "from SendmailTemplate where name=? and tenantId=?", templateCode, tenantId); SendmailQueue sendmailQueue = new SendmailQueue(); sendmailQueue.setReceiver(to); sendmailQueue.setData(data); sendmailQueue.setSendmailTemplate(sendmailTemplate); sendmailQueue.setSendmailConfig(sendmailConfig); sendmailQueue.setTenantId(tenantId); sendmailQueueManager.save(sendmailQueue); } public void saveSendmailQueue(String from, String to, String subject, String content, long sendmailConfigId) { SendmailConfig sendmailConfig = sendmailConfigManager .get(sendmailConfigId); SendmailQueue sendmailQueue = new SendmailQueue(); sendmailQueue.setSender(from); sendmailQueue.setReceiver(to); sendmailQueue.setSubject(subject); sendmailQueue.setContent(content); sendmailQueue.setSendmailConfig(sendmailConfig); sendmailQueue.setTenantId(sendmailConfig.getTenantId()); sendmailQueueManager.save(sendmailQueue); } public void saveSendmailQueue(String from, String to, String subject, String content, String tenantId) { SendmailQueue sendmailQueue = new SendmailQueue(); sendmailQueue.setSender(from); sendmailQueue.setReceiver(to); sendmailQueue.setSubject(subject); sendmailQueue.setContent(content); sendmailQueue.setTenantId(tenantId); sendmailQueueManager.save(sendmailQueue); } public List<SendmailQueue> findTopSendmailQueues(int size, String tenantId) { return (List<SendmailQueue>) sendmailQueueManager.pagedQuery( "from SendmailQueue where tenantId=?", 1, size, tenantId) .getResult(); } public void processSendmailQueue(SendmailQueue sendmailQueue) throws Exception { MailDTO mailDto = new MailDTO(); MailDTO resultMailDto = null; if (sendmailQueue.getSendmailConfig() != null) { SendmailTemplate sendmailTemplate = sendmailQueue .getSendmailTemplate(); SendmailConfig sendmailConfig = sendmailQueue.getSendmailConfig(); MailServerInfo mailServerInfo = new MailServerInfo(); mailServerInfo.setHost(sendmailConfig.getHost()); mailServerInfo.setPort(sendmailConfig.getPort()); mailServerInfo.setSmtpAuth(sendmailConfig.getSmtpAuth() == 1); mailServerInfo .setSmtpStarttls(sendmailConfig.getSmtpStarttls() == 1); mailServerInfo.setSmtpSsl(sendmailConfig.getSmtpSsl() == 1); mailServerInfo.setUsername(sendmailConfig.getUsername()); mailServerInfo.setPassword(sendmailConfig.getPassword()); mailServerInfo.setDefaultFrom(sendmailConfig.getDefaultFrom()); mailServerInfo.setMode(sendmailConfig.getStatus()); mailServerInfo.setTestMail(sendmailConfig.getTestMail()); // config this.configSender(mailDto, sendmailQueue, sendmailTemplate); this.configReceiver(mailDto, sendmailQueue, sendmailTemplate); this.configCc(mailDto, sendmailQueue, sendmailTemplate); this.configBcc(mailDto, sendmailQueue, sendmailTemplate); if (StringUtils.isBlank(sendmailQueue.getSubject())) { if (StringUtils.isBlank(sendmailQueue.getData())) { mailDto.setSubject(sendmailTemplate.getSubject()); } else { Map<String, Object> map = jsonMapper.fromJson( sendmailQueue.getData(), Map.class); String subject = templateService.renderText( sendmailTemplate.getSubject(), map); mailDto.setSubject(subject); } } else { mailDto.setSubject(sendmailQueue.getSubject()); } if (StringUtils.isBlank(sendmailQueue.getContent())) { if (StringUtils.isBlank(sendmailQueue.getData())) { mailDto.setContent(sendmailTemplate.getContent()); } else { Map<String, Object> map = jsonMapper.fromJson( sendmailQueue.getData(), Map.class); String content = templateService.renderText( sendmailTemplate.getContent(), map); mailDto.setContent(content); } } else { mailDto.setContent(sendmailQueue.getContent()); } // mailDto.setFrom(mailTemplate.getSender()); // mailDto.setTo(mailTemplate.getReceiver()); // mailDto.setCc(mailTemplate.getCc()); // mailDto.setBcc(mailTemplate.getBcc()); // mailDto.setSubject(mailTemplate.getSubject()); // mailDto.setContent(mailTemplate.getContent()); if (sendmailTemplate != null) { for (SendmailAttachment sendmailAttachment : sendmailTemplate .getSendmailAttachments()) { StoreDTO storeDto = storeConnector.getStore( "sendmailattachment", sendmailAttachment.getPath(), sendmailQueue.getTenantId()); mailDto.addAttachment( sendmailAttachment.getName(), new DataSourceInputStreamSource(storeDto .getDataSource())); } } resultMailDto = new MailHelper().send(mailDto, mailServerInfo); // model.addAttribute("mailDto", mailDto); if (!resultMailDto.isSuccess()) { StringWriter writer = new StringWriter(); resultMailDto.getException().printStackTrace( new PrintWriter(writer)); // model.addAttribute("exception", writer.toString()); } } else { mailDto.setFrom(sendmailQueue.getSender()); mailDto.setTo(sendmailQueue.getReceiver()); mailDto.setSubject(sendmailQueue.getSubject()); mailDto.setContent(sendmailQueue.getContent()); resultMailDto = mailHelper.send(mailDto); } if (resultMailDto == null) { logger.info("result mailDto is null"); return; } this.saveMailHistory(sendmailQueue, resultMailDto); } public void configSender(MailDTO mailDto, SendmailQueue sendmailQueue, SendmailTemplate sendmailTemplate) { if (StringUtils.isBlank(sendmailQueue.getSender())) { if ((sendmailTemplate != null) && (sendmailTemplate.getSender() != null)) { mailDto.setFrom(sendmailTemplate.getSender().trim()); } } else { mailDto.setFrom(sendmailQueue.getSender().trim()); } } public void configReceiver(MailDTO mailDto, SendmailQueue sendmailQueue, SendmailTemplate sendmailTemplate) { if (StringUtils.isBlank(sendmailQueue.getReceiver())) { if ((sendmailTemplate != null) && (sendmailTemplate.getReceiver() != null)) { mailDto.setTo(sendmailTemplate.getReceiver().trim()); } } else { mailDto.setTo(sendmailQueue.getReceiver().trim()); } } public void configCc(MailDTO mailDto, SendmailQueue sendmailQueue, SendmailTemplate sendmailTemplate) { if (StringUtils.isBlank(sendmailQueue.getCc())) { if ((sendmailTemplate != null) && (sendmailTemplate.getCc() != null)) { mailDto.setCc(sendmailTemplate.getCc().trim()); } } else { mailDto.setCc(sendmailQueue.getCc().trim()); } } public void configBcc(MailDTO mailDto, SendmailQueue sendmailQueue, SendmailTemplate sendmailTemplate) { if (StringUtils.isBlank(sendmailQueue.getBcc())) { if ((sendmailTemplate != null) && (sendmailTemplate.getBcc() != null)) { mailDto.setBcc(sendmailTemplate.getBcc().trim()); } } else { mailDto.setBcc(sendmailQueue.getBcc().trim()); } } public void saveMailHistory(SendmailQueue sendmailQueue, MailDTO mailDto) { if (mailDto == null) { logger.info("mailDto is null"); return; } SendmailHistory sendmailHistory = new SendmailHistory(); beanMapper.copy(mailDto, sendmailHistory); sendmailHistory.setSender(mailDto.getFrom()); sendmailHistory.setReceiver(mailDto.getTo()); sendmailHistory.setStatus(mailDto.isSuccess() ? "success" : "error"); sendmailHistory.setTenantId(sendmailQueue.getTenantId()); if (mailDto.getException() != null) { sendmailHistory.setInfo(mailDto.getException().getMessage()); } sendmailHistory .setSendmailTemplate(sendmailQueue.getSendmailTemplate()); sendmailHistory.setSendmailConfig(sendmailQueue.getSendmailConfig()); sendmailHistory.setData(sendmailQueue.getData()); sendmailHistory.setCreateTime(new Date()); sendmailHistoryManager.save(sendmailHistory); sendmailQueueManager.remove(sendmailQueue); } public boolean checkConfigCodeExists(String configCode, String tenantId) { SendmailConfig sendmailConfig = sendmailConfigManager.findUnique( "from SendmailConfig where name=? and tenantId=?", configCode, tenantId); return sendmailConfig != null; } public boolean checkTemplateCodeExists(String templateCode, String tenantId) { SendmailTemplate sendmailTemplate = sendmailTemplateManager.findUnique( "from SendmailTemplate where name=? and tenantId=?", templateCode, tenantId); return sendmailTemplate != null; } @Resource public void setSendmailConfigManager( SendmailConfigManager sendmailConfigManager) { this.sendmailConfigManager = sendmailConfigManager; } @Resource public void setSendmailQueueManager( SendmailQueueManager sendmailQueueManager) { this.sendmailQueueManager = sendmailQueueManager; } @Resource public void setSendmailHistoryManager( SendmailHistoryManager sendmailHistoryManager) { this.sendmailHistoryManager = sendmailHistoryManager; } @Resource public void setSendmailTemplateManager( SendmailTemplateManager sendmailTemplateManager) { this.sendmailTemplateManager = sendmailTemplateManager; } @Resource public void setStoreConnector(StoreConnector storeConnector) { this.storeConnector = storeConnector; } @Resource public void setMailHelper(MailHelper mailHelper) { this.mailHelper = mailHelper; } @Resource public void setTemplateService(TemplateService templateService) { this.templateService = templateService; } }