/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package ro.nextreports.server.distribution; import java.io.File; import java.util.List; import java.util.ArrayList; import org.springframework.mail.javamail.JavaMailSenderImpl; import org.springframework.mail.javamail.MimeMessageHelper; import org.springframework.mail.SimpleMailMessage; import org.springframework.core.io.FileSystemResource; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import ro.nextreports.server.domain.Group; import ro.nextreports.server.domain.RunReportHistory; import ro.nextreports.server.domain.SmtpDestination; import ro.nextreports.server.domain.User; import ro.nextreports.server.report.util.ReportUtil; import ro.nextreports.server.util.MailUtil; import ro.nextreports.server.util.PermissionUtil; import javax.mail.internet.MimeMessage; /** * @author Decebal Suiu * @author Mihai Dinca-Panaitescu */ public class SmtpDistributor implements Distributor { private List<String> users = new ArrayList<String>(); private static final Logger LOG = LoggerFactory.getLogger(SmtpDistributor.class); public void distribute(File exportedFile, Destination destination, DistributionContext context) throws DistributionException { SmtpDestination smtpDestination = (SmtpDestination) destination; if (smtpDestination.getChangedFileName() != null) { String fileName = DistributorUtil.replaceTemplates(smtpDestination.getChangedFileName(), context); exportedFile = DistributorUtil.getFileCopy(exportedFile, fileName); } if (smtpDestination.getUserRecipients() != null) { users = new ArrayList<String>(smtpDestination.getUserRecipients()); } else { users = new ArrayList<String>(); } String body = smtpDestination.getMailBody(); if (body == null) { body = ""; } if (context.isError()) { body = body + "\r\n" + context.getMessage(); } else if (!smtpDestination.isAttachFile()) { body = body + "\r\n" + context.getUrl().replaceAll("\\+", "%20"); } body = DistributorUtil.replaceTemplates(body, context); try { List<String> groups = smtpDestination.getGroupRecipients(); for (String groupName : groups) { Group group = context.getSecurityService().getGroupByName(groupName); for (String userName : group.getMembers()) { if (!users.contains(userName)) { users.add(userName); } } } List<String> mails = new ArrayList<String>(smtpDestination.getMailRecipients()); for (String userName : users) { User user = context.getSecurityService().getUserByName(userName); String email = user.getEmail(); if (MailUtil.isEmailValid(email) && !mails.contains(email)) { mails.add(email); } } if ((context.getBatchValue() != null) && (context.getBatchMailMap() != null)) { String batchEmail = context.getBatchMailMap().get(context.getBatchValue()); if (batchEmail != null) { String[] emails = batchEmail.split(";"); for (String email : emails) { if (MailUtil.isEmailValid(email) && !mails.contains(email)) { mails.add(email); } } } else { LOG.error("Please check your batch email SQL! Batch Email SQL obtained null email string for value (id) = '" + context.getBatchValue() + "'"); } } if ((mails != null) && (mails.size() > 0)) { String mailServerIp = ((JavaMailSenderImpl) context.getMailSender()).getHost(); if ((mailServerIp == null) || "".equals(mailServerIp)) { throw new DistributionException("Mail Server not configured"); } else { if (LOG.isDebugEnabled()) { LOG.debug("Send mail to " + mails); } String subject = smtpDestination.getMailSubject(); if (subject == null) { subject = "NextServer"; } else { subject = DistributorUtil.replaceTemplates(subject, context); } if (smtpDestination.isAttachFile()) { MimeMessage mailMessage = context.getMailSender().createMimeMessage(); // use the true flag to indicate you need a multipart message MimeMessageHelper helper = new MimeMessageHelper(mailMessage, true); helper.setFrom(context.getMailFrom()); helper.setTo(mails.toArray(new String[mails.size()])); helper.setSubject(subject); helper.setText(body); if (exportedFile != null) { FileSystemResource file = new FileSystemResource(exportedFile); helper.addAttachment(exportedFile.getName(), file); if (exportedFile.getName().endsWith(".html")) { // images are taken from html because jasper modifies them (immg_0_0_1) // !! @todo test for big html files List<String> images = ReportUtil.getHtmlImages(exportedFile); for (String image : images) { FileSystemResource imageFile = new FileSystemResource(new File(context.getReportsPath(), image)); helper.addAttachment(image, imageFile); } } } context.getMailSender().send(mailMessage); } else { SimpleMailMessage mailMessage = new SimpleMailMessage(); mailMessage.setFrom(context.getMailFrom()); mailMessage.setTo(mails.toArray(new String[mails.size()])); mailMessage.setSubject(subject); mailMessage.setText(body); context.getMailSender().send(mailMessage); } } } } catch (Exception e) { LOG.error(e.getMessage(), e); throw new DistributionException(e.getMessage()); } finally { DistributorUtil.deleteFileCopy(smtpDestination.getChangedFileName(), exportedFile); } } // update acl for run report history public void afterDistribute(RunReportHistory history, DistributionContext context) { for (String username : users) { try { context.getSecurityService().grantUser(history.getPath(), username, PermissionUtil.getRead(), false); } catch (Exception e) { LOG.error(e.getMessage(), e); } } } public boolean isTestable() { return false; } public void test(Destination destination) throws DistributionException { } }