org.crsh.mail.MailPlugin Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of crash.plugins.mail Show documentation
Show all versions of crash.plugins.mail Show documentation
This plugin allows to integrate JavaMail in CRaSH and provides a mail command
/*
* 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);
}
}