All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.crsh.mail.MailPlugin Maven / Gradle / Ivy

There is a newer version: 1.3.2
Show newest version
/*
 * Copyright (C) 2012 eXo Platform SAS.
 *
 * This is free software; you can redistribute it and/or modify it
 * under the terms of the GNU Lesser General Public License as
 * published by the Free Software Foundation; either version 2.1 of
 * the License, or (at your option) any later version.
 *
 * This software is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this software; if not, write to the Free
 * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
 * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
 */
package org.crsh.mail;

import org.crsh.plugin.CRaSHPlugin;
import org.crsh.plugin.PropertyDescriptor;
import org.crsh.util.Utils;

import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.mail.AuthenticationFailedException;
import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.mail.internet.MimePart;
import java.util.Properties;
import java.util.concurrent.Callable;
import java.util.concurrent.Future;

/**
 * The mail plugin integrates JavaMail for sending commands.
 *
 * @author Julien Viet
 */
public class MailPlugin extends CRaSHPlugin {

  /** . */
  public static PropertyDescriptor SMTP_HOST = new PropertyDescriptor(String.class, "mail.smtp.host", "localhost", "The mail server host") {
    @Override
    protected String doParse(String s) throws Exception {
      return s;
    }
  };

  /** . */
  public static PropertyDescriptor SMTP_PORT = new PropertyDescriptor(Integer.class, "mail.smtp.port", 25, "The mail server port") {
    @Override
    protected Integer doParse(String s) throws Exception {
      return Integer.parseInt(s);
    }
  };

  /** . */
  public static PropertyDescriptor SMTP_SECURE = new PropertyDescriptor(SmtpSecure.class, "mail.smtp.secure", SmtpSecure.NONE, "The mail server port") {
    @Override
    protected SmtpSecure doParse(String s) throws Exception {
      return SmtpSecure.valueOf(s.toUpperCase());
    }
  };

  /** . */
  public static PropertyDescriptor SMTP_USERNAME = new PropertyDescriptor(String.class, "mail.smtp.username", null, "The mail server user name") {
    @Override
    protected String doParse(String s) throws Exception {
      return s;
    }
  };

  /** . */
  public static PropertyDescriptor SMTP_PASSWORD = new PropertyDescriptor(String.class, "mail.smtp.password", null, "The mail server passord", true) {
    @Override
    protected String doParse(String s) throws Exception {
      return s;
    }
  };

  /** . */
  public static PropertyDescriptor SMTP_FROM = new PropertyDescriptor(String.class, "mail.smtp.from", null, "The mail sender address") {
    @Override
    protected String doParse(String s) throws Exception {
      return s;
    }
  };

  /** . */
  public static PropertyDescriptor DEBUG = new PropertyDescriptor(Boolean.class, "mail.debug", false, "The mail smtp debug mode") {
    @Override
    protected Boolean doParse(String s) throws Exception {
      return Boolean.parseBoolean(s);
    }
  };

  @Override
  protected Iterable> createConfigurationCapabilities() {
    return Utils.>list(SMTP_HOST, SMTP_PORT, SMTP_SECURE, SMTP_USERNAME, SMTP_PASSWORD, SMTP_FROM, DEBUG);
  }

  /** . */
  private String smtpHost;

  /** . */
  private Integer smtpPort;

  /** . */
  private SmtpSecure smtpSecure;

  /** . */
  private String smtpUsername;

  /** . */
  private String smtpPassword;

  /** . */
  private String smtpFrom;

  /** . */
  private Boolean debug;

  @Override
  public MailPlugin getImplementation() {
    return this;
  }

  @Override
  public void init() {
    smtpHost = getContext().getProperty(SMTP_HOST);
    smtpPort = getContext().getProperty(SMTP_PORT);
    smtpSecure = getContext().getProperty(SMTP_SECURE);
    smtpUsername = getContext().getProperty(SMTP_USERNAME);
    smtpPassword = getContext().getProperty(SMTP_PASSWORD);
    smtpFrom = getContext().getProperty(SMTP_FROM);
    debug = getContext().getProperty(DEBUG);
  }

  public Future send(
      Iterable recipients,
      final String subject,
      final String body,
      final DataSource... attachments) throws MessagingException {
    return send(recipients, subject, body, null, attachments);
  }
  public Future send(
      Iterable recipients,
      final String subject,
      final Object body,
      final String type,
      final DataSource... attachments) throws MessagingException {

    //
    final InternetAddress[] addresses = InternetAddress.parse(Utils.join(recipients, ","));

    //
    Callable f = (new Callable() {
      public Boolean call() throws Exception {
        Properties props = new Properties();
        props.setProperty("mail.smtp.host", smtpHost);
        if (smtpPort != null) {
          props.setProperty("mail.smtp.port", Integer.toString(smtpPort));
        }

        //
        final String username = smtpUsername, password = smtpPassword;
        Authenticator authenticator;
        if (username != null && password != null) {
          props.setProperty("mail.smtp.auth", "true");
          authenticator = new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
              return new PasswordAuthentication(username, password);
            }
          };
        } else {
          authenticator = null;
        }

        //
        if (Boolean.TRUE.equals(debug)) {
          props.setProperty("mail.debug", "true");
        }

        //
        if (smtpSecure != null) {
          switch (smtpSecure) {
            case NONE:
              break;
            case TLS:
              props.setProperty("mail.smtp.starttls.enable", "true");
              break;
            case SSL:
              throw new UnsupportedOperationException();
          }
        }

        //
        Session session = Session.getInstance(props, authenticator);
        MimeMessage message = new MimeMessage(session);

        //
        if (smtpFrom != null) {
          message.setFrom(new InternetAddress(smtpFrom));
        }

        //
        message.setRecipients(Message.RecipientType.TO, addresses);
        if (subject != null) {
          message.setSubject(subject);
        }

        //
        MimePart bodyPart;
        if (attachments != null && attachments.length > 0) {
          Multipart multipart = new MimeMultipart();
          bodyPart = new MimeBodyPart();
          bodyPart.setContent(body, type);
          for (DataSource attachment : attachments) {
            MimeBodyPart attachmentPart = new MimeBodyPart();
            attachmentPart.setDataHandler(new DataHandler(attachment));
            attachmentPart.setFileName(attachment.getName());
            multipart.addBodyPart(attachmentPart);
          }
          message.setContent(multipart);
        } else {
          bodyPart = message;
        }

        //
        if (type != null) {
          bodyPart.setContent(body, type);
        } else {
          bodyPart.setText(body.toString());
        }

        //
        try {
          Transport.send(message);
        }
        catch (AuthenticationFailedException e) {
          return false;
        }
        return true;
      }
    });

    //
    return getContext().getExecutor().submit(f);
  }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy