/**
* See the NOTICE file distributed with this work for additional information
* regarding copyright ownership.
*
* 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 com.medsavant.mailer;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import javax.mail.*;
import javax.mail.internet.*;
import java.util.*;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.CommandLineParser;
import org.apache.commons.cli.GnuParser;
import org.apache.commons.cli.HelpFormatter;
import org.apache.commons.cli.Option;
import org.apache.commons.cli.Options;
import org.apache.commons.io.IOUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class Mail {
private static final Log LOG = LogFactory.getLog(Mail.class);
static String src;
static String srcName = "MedSavant Development Team";
static String pw;
static String host = "smtp.gmail.com";
static int port = 465;
static String starttls = "true";
static String auth = "true";
static String socketFactoryClass = "javax.net.ssl.SSLSocketFactory";
static String fallback = "false";
public static void main(String[] args) throws IOException {
CommandLineParser parser = new GnuParser();
Options ops = getOptions();
try {
// parse the command line arguments
CommandLine line = parser.parse(ops, args);
// print help
if (line.hasOption('h') || line.getOptions().length == 0) {
printHelp();
return;
}
// parse args
String email = null;
String emailPass = null;
String mailingList = null;
String subject = null;
String htmlFile = null;
for (Option o : line.getOptions()) {
switch(o.getOpt().charAt(0)) {
case 's':
subject = o.getValue();
break;
case 'e':
htmlFile = o.getValue();
break;
case 'u':
email = o.getValue();
break;
case 'p':
emailPass = o.getValue();
break;
case 'l':
mailingList = o.getValue();
break;
}
}
setMailCredentials(email,emailPass,host,port);
String text = readFileIntoString(new File(htmlFile));
sendEmail(mailingList,subject,text);
} catch (org.apache.commons.cli.ParseException exp) {
printHelp();
// oops, something went wrong
System.err.println("Parsing failed. Reason: " + exp.getMessage());
}
}
public synchronized static boolean sendEmail(String to, String subject, String text) {
return sendEmail(to, subject, text, null);
}
public static Options getOptions() {
// create Options object
Options options = new Options();
options.addOption("h", false, "help");
options.addOption("u", true, "Gmail username");
options.addOption("p", true, "Gmail password");
//options.addOption("h", true, "email host");
//options.addOption("o", true, "email port");
options.addOption("l", true, "mailing list (comma separated list of emails)");
options.addOption("s", true, "subject");
options.addOption("e", true, "path to html file");
return options;
}
public static void setMailCredentials(String username, String password, String smtp, int port) {
Mail.src = username;
Mail.pw = password;
Mail.host = smtp;
Mail.port = port;
}
public synchronized static boolean sendEmail(String to, String subject, String text, File attachment) {
try {
if (src == null || pw == null || host == null || port == -1) {
return false;
}
if (to.isEmpty()) {
return false;
}
LOG.info("Sending email to " + to + " with subject " + subject);
// create some properties and get the default Session
Properties props = new Properties();
props.put("mail.smtp.user", src);
props.put("mail.smtp.host", host);
props.put("mail.smtp.port", port);
props.put("mail.smtp.starttls.enable", starttls);
props.put("mail.smtp.auth", auth);
props.put("mail.smtp.socketFactory.port", port);
props.put("mail.smtp.socketFactory.class", socketFactoryClass);
props.put("mail.smtp.socketFactory.fallback", fallback);
Session session = Session.getInstance(props, null);
// create a message
MimeMessage msg = new MimeMessage(session);
msg.setFrom(new InternetAddress(src, srcName));
InternetAddress[] address = InternetAddress.parse(to);
msg.setRecipients(Message.RecipientType.BCC, address);
msg.setSubject(subject);
// create and fill the first message part
MimeBodyPart mbp1 = new MimeBodyPart();
mbp1.setContent(text, "text/html");
// create the Multipart and add its parts to it
Multipart mp = new MimeMultipart();
mp.addBodyPart(mbp1);
if (attachment != null) {
// create the second message part
MimeBodyPart mbp2 = new MimeBodyPart();
// attach the file to the message
FileDataSource fds = new FileDataSource(attachment);
mbp2.setDataHandler(new DataHandler(fds));
mbp2.setFileName(fds.getName());
mp.addBodyPart(mbp2);
}
// add the Multipart to the message
msg.setContent(mp);
// set the Date: header
msg.setSentDate(new Date());
// send the message
Transport transport = session.getTransport("smtp");
transport.connect(host, src, pw);
transport.sendMessage(msg, msg.getAllRecipients());
transport.close();
LOG.info("Mail sent");
return true;
} catch (Exception ex) {
ex.printStackTrace();
LOG.error(ex);
return false;
}
}
private static void printHelp() {
HelpFormatter formatter = new HelpFormatter();
formatter.printHelp("savant-mailer", getOptions());
}
private static String readFileIntoString(File file) throws IOException {
return IOUtils.toString(new FileInputStream(file));
}
}