Java tutorial
/* * Copyright (C) 2001-2016 Food and Agriculture Organization of the * United Nations (FAO-UN), United Nations World Food Programme (WFP) * and United Nations Environment Programme (UNEP) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program 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 * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA * * Contact: Jeroen Ticheler - FAO - Viale delle Terme di Caracalla 2, * Rome - Italy. email: geonetwork@osgeo.org */ package org.fao.geonet.util; import org.apache.commons.lang.StringUtils; import org.apache.commons.mail.*; import org.fao.geonet.kernel.setting.SettingManager; import org.fao.geonet.kernel.setting.Settings; import org.fao.geonet.utils.Log; import javax.annotation.Nonnull; import javax.mail.Session; import javax.mail.internet.InternetAddress; import java.io.UnsupportedEncodingException; import java.util.ArrayList; import java.util.List; import java.util.Properties; /** * Utility class to send mails. Supports both html and plain text. It usually * takes the settings from the database, but you can also indicate all params. * * @author delawen */ public class MailUtil { public static final String LOG_MODULE_NAME = "geonetwork"; /** * Send an html mail. Will look on the settings directly to know the * remitent * * @param toAddress * @param subject * @param htmlMessage * @param settings * @throws EmailException */ public static Boolean sendHtmlMail(List<String> toAddress, String subject, String htmlMessage, SettingManager settings) { // Create data information to compose the mail HtmlEmail email = new HtmlEmail(); configureBasics(settings, email); email.setSubject(subject); try { email.setHtmlMsg(htmlMessage); } catch (EmailException e1) { Log.error("Error setting email HTML content. Subject:" + subject, e1); return false; } // send to all mails extracted from settings for (String add : toAddress) { try { email.addBcc(add); } catch (EmailException e) { Log.error(LOG_MODULE_NAME, "Error setting email BCC address " + add, e); return false; } } return send(email); } /** * Send a plain text mail. Will look on the settings directly to know the * remitent * * @param toAddress * @param subject * @param message * @param settings * @throws EmailException */ public static Boolean sendMail(List<String> toAddress, String subject, String message, SettingManager settings) { // Create data information to compose the mail Email email = new SimpleEmail(); configureBasics(settings, email); email.setSubject(subject); try { email.setMsg(message); } catch (EmailException e1) { Log.error(LOG_MODULE_NAME, "Error setting email message", e1); return false; } // send to all mails extracted from settings for (String add : toAddress) { try { email.addBcc(add); } catch (EmailException e) { Log.error(LOG_MODULE_NAME, "Error setting email BCC address " + add, e); } } return send(email); } /** * Send a plain text mail. Will look on the settings directly to know the * remitent * * @param toAddress * @param subject * @param message * @param htmlMessage * @param settings * @param replyTo * @param replyToDesc @throws EmailException */ public static Boolean sendMail(List<String> toAddress, String subject, String message, String htmlMessage, SettingManager settings, String replyTo, String replyToDesc) { // Create data information to compose the mail boolean isHtml = StringUtils.isNotBlank(htmlMessage); Email email = isHtml ? new HtmlEmail() : new SimpleEmail(); configureBasics(settings, email); List<InternetAddress> addressColl = new ArrayList<InternetAddress>(); if (StringUtils.isNotEmpty(replyTo)) { try { addressColl.add(new InternetAddress(replyTo, replyToDesc)); email.setReplyTo(addressColl); } catch (UnsupportedEncodingException e2) { Log.error(LOG_MODULE_NAME, "Error setting email replyTo. Characters not supported in \"" + replyToDesc + "\"", e2); return false; } catch (EmailException e) { Log.error(LOG_MODULE_NAME, "Error setting email replyTo. Invalid email address \"" + replyTo + "\"", e); return false; } } email.setSubject(subject); try { if (StringUtils.isNotBlank(message)) { email.setMsg(message); } if (isHtml) { ((HtmlEmail) email).setHtmlMsg(htmlMessage); } } catch (EmailException e1) { Log.error(LOG_MODULE_NAME, "Error setting email message", e1); return false; } // send to all mails extracted from settings for (String add : toAddress) { try { email.addBcc(add); } catch (EmailException e) { Log.error(LOG_MODULE_NAME, "Error setting email BCC address " + add, e); } } return send(email); } /** * Send an html mail with atachments * * @param toAddress * @param from * @param subject * @param htmlMessage * @param attachment * @throws EmailException */ public static Boolean sendHtmlMailWithAttachment(List<String> toAddress, String from, String subject, String htmlMessage, List<EmailAttachment> attachment, SettingManager settings) { // Create data information to compose the mail HtmlEmail email = new HtmlEmail(); String username = settings.getValue(Settings.SYSTEM_FEEDBACK_MAILSERVER_USERNAME); String password = settings.getValue(Settings.SYSTEM_FEEDBACK_MAILSERVER_PASSWORD); Boolean ssl = settings.getValueAsBool(Settings.SYSTEM_FEEDBACK_MAILSERVER_SSL, false); Boolean tls = settings.getValueAsBool(Settings.SYSTEM_FEEDBACK_MAILSERVER_TLS, false); String hostName = settings.getValue(Settings.SYSTEM_FEEDBACK_MAILSERVER_HOST); Integer smtpPort = Integer.valueOf(settings.getValue(Settings.SYSTEM_FEEDBACK_MAILSERVER_PORT)); Boolean ignoreSslCertificateErrors = settings .getValueAsBool(Settings.SYSTEM_FEEDBACK_MAILSERVER_IGNORE_SSL_CERTIFICATE_ERRORS, false); configureBasics(hostName, smtpPort, from, username, password, email, ssl, tls, ignoreSslCertificateErrors); for (EmailAttachment attach : attachment) { try { email.attach(attach); } catch (EmailException e) { Log.error(LOG_MODULE_NAME, "Error attaching attachment " + attach.getName(), e); } } email.setSubject(subject); try { email.setHtmlMsg(htmlMessage); } catch (EmailException e1) { Log.error(LOG_MODULE_NAME, "Error setting email HTML message", e1); return false; } // send to all mails extracted from settings for (String add : toAddress) { try { email.addBcc(add); } catch (EmailException e) { Log.error(LOG_MODULE_NAME, "Error setting email BCC address " + add, e); return false; } } return send(email); } private static Boolean send(final Email email) { try { email.send(); } catch (EmailException e) { Log.error(LOG_MODULE_NAME, "Error sending email \"" + email.getSubject() + "\"", e); return false; } return true; } private static void sendWithThread(@Nonnull final Email email) { try { Thread t = new Thread() { @Override public void run() { super.run(); try { email.send(); } catch (EmailException e) { Log.error(LOG_MODULE_NAME, "Error sending email \"" + email.getSubject() + "\" unsing other " + "thread", e); } } }; t.start(); } catch (Exception e) { Log.error(LOG_MODULE_NAME, "Error sending email \"" + email.getSubject() + "\" unsing other " + "thread", e); } } /** * Send a plain text mail * * @param toAddress * @param from * @param subject * @param message * @throws EmailException */ public static Boolean sendMail(List<String> toAddress, String from, String subject, String message, SettingManager settings) { Email email = new SimpleEmail(); String username = settings.getValue(Settings.SYSTEM_FEEDBACK_MAILSERVER_USERNAME); String password = settings.getValue(Settings.SYSTEM_FEEDBACK_MAILSERVER_PASSWORD); Boolean ssl = settings.getValueAsBool(Settings.SYSTEM_FEEDBACK_MAILSERVER_SSL, false); Boolean tls = settings.getValueAsBool(Settings.SYSTEM_FEEDBACK_MAILSERVER_TLS, false); String hostName = settings.getValue(Settings.SYSTEM_FEEDBACK_MAILSERVER_HOST); Integer smtpPort = Integer.valueOf(settings.getValue(Settings.SYSTEM_FEEDBACK_MAILSERVER_PORT)); Boolean ignoreSslCertificateErrors = settings .getValueAsBool(Settings.SYSTEM_FEEDBACK_MAILSERVER_IGNORE_SSL_CERTIFICATE_ERRORS, false); configureBasics(hostName, smtpPort, from, username, password, email, ssl, tls, ignoreSslCertificateErrors); email.setSubject(subject); try { email.setMsg(message); } catch (EmailException e1) { Log.error(LOG_MODULE_NAME, "Error setting email message", e1); return false; } // send to all mails extracted from settings for (String add : toAddress) { try { email.addBcc(add); } catch (EmailException e) { Log.error(LOG_MODULE_NAME, "Error setting email BCC address " + add, e); return false; } } return send(email); } /** * Create data information to compose the mail * * @param hostName * @param smtpPort * @param from * @param username * @param password * @param email * @param ssl * @param tls * @param ignoreSslCertificateErrors */ private static void configureBasics(String hostName, Integer smtpPort, String from, String username, String password, Email email, Boolean ssl, Boolean tls, Boolean ignoreSslCertificateErrors) { if (hostName != null) { email.setHostName(hostName); } else { throw new IllegalArgumentException( "Missing settings in System Configuration (see Administration menu) - cannot send mail"); } if (StringUtils.isNotBlank(smtpPort + "")) { email.setSmtpPort(smtpPort); } else { throw new IllegalArgumentException( "Missing settings in System Configuration (see Administration menu) - cannot send mail"); } if (username != null) { email.setAuthenticator(new DefaultAuthenticator(username, password)); } email.setDebug(true); if (tls != null && tls) { email.setStartTLSEnabled(tls); email.setStartTLSRequired(tls); } if (ssl != null && ssl) { email.setSSLOnConnect(ssl); if (StringUtils.isNotBlank(smtpPort + "")) { email.setSslSmtpPort(smtpPort + ""); } } if (ignoreSslCertificateErrors != null && ignoreSslCertificateErrors) { try { Session mailSession = email.getMailSession(); Properties p = mailSession.getProperties(); p.setProperty("mail.smtp.ssl.trust", "*"); } catch (EmailException e) { // Ignore the exception. Can't be reached because the host name is always set above or an // IllegalArgumentException is thrown. } } if (StringUtils.isNotBlank(from)) { try { email.setFrom(from); } catch (EmailException e) { throw new IllegalArgumentException( "Invalid 'from' email setting in System Configuration (see Administration menu) - cannot send " + "mail", e); } } else { throw new IllegalArgumentException( "Missing settings in System Configuration (see Administration menu) - cannot send mail"); } } /** * Configure the basics (hostname, port, username, password,...) * * @param settings * @param email */ private static void configureBasics(SettingManager settings, Email email) { String username = settings.getValue(Settings.SYSTEM_FEEDBACK_MAILSERVER_USERNAME); String password = settings.getValue(Settings.SYSTEM_FEEDBACK_MAILSERVER_PASSWORD); Boolean ssl = settings.getValueAsBool(Settings.SYSTEM_FEEDBACK_MAILSERVER_SSL, false); Boolean tls = settings.getValueAsBool(Settings.SYSTEM_FEEDBACK_MAILSERVER_TLS, false); String hostName = settings.getValue(Settings.SYSTEM_FEEDBACK_MAILSERVER_HOST); Integer smtpPort = Integer.valueOf(settings.getValue(Settings.SYSTEM_FEEDBACK_MAILSERVER_PORT)); String from = settings.getValue(Settings.SYSTEM_FEEDBACK_EMAIL); Boolean ignoreSslCertificateErrors = settings .getValueAsBool(Settings.SYSTEM_FEEDBACK_MAILSERVER_IGNORE_SSL_CERTIFICATE_ERRORS, false); configureBasics(hostName, smtpPort, from, username, password, email, ssl, tls, ignoreSslCertificateErrors); } public static Boolean sendMail(String email, String subject, String message, String htmlMessage, SettingManager sm) { List<String> to = new ArrayList<String>(1); to.add(email); return sendMail(to, subject, message, htmlMessage, sm, null, null); } public static Boolean sendMail(String to, String subject, String message, String htmlMessage, SettingManager sm, String replyTo, String replyToDescr) { List<String> to_ = new ArrayList<String>(1); to_.add(to); return sendMail(to_, subject, message, htmlMessage, sm, replyTo, replyToDescr); } public static void testSendMail(String to, String subject, String message, String htmlMessage, SettingManager sm, String replyTo, String replyToDescr) throws Exception { List<String> to_ = new ArrayList<String>(1); to_.add(to); testSendMail(to_, subject, message, htmlMessage, sm, replyTo, replyToDescr); } public static void testSendMail(List<String> toAddress, String subject, String message, String htmlMessage, SettingManager settings, String replyTo, String replyToDesc) throws Exception { // Create data information to compose the mail boolean isHtml = StringUtils.isNotBlank(htmlMessage); Email email = isHtml ? new HtmlEmail() : new SimpleEmail(); configureBasics(settings, email); List<InternetAddress> addressColl = new ArrayList<InternetAddress>(); addressColl.add(new InternetAddress(replyTo, replyToDesc)); email.setReplyTo(addressColl); email.setSubject(subject); if (StringUtils.isNotBlank(message)) { email.setMsg(message); } if (isHtml) { ((HtmlEmail) email).setHtmlMsg(htmlMessage); } // send to all mails extracted from settings for (String add : toAddress) { email.addBcc(add); } email.send(); } }