/** * Copyright (C) 2008-2010, Squale Project - http://www.squale.org * * This file is part of Squale. * * Squale 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 3 of the * License, or any later version. * * Squale 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 Lesser General Public License * along with Squale. If not, see <http://www.gnu.org/licenses/>. */ package org.squale.squalecommon.util.mail.javamail; import java.util.Collection; import java.util.Iterator; import java.util.Properties; import javax.mail.Message; import javax.mail.MessagingException; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.AddressException; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.squale.jraf.commons.exception.JrafDaoException; import org.squale.jraf.helper.PersistenceHelper; import org.squale.jraf.spi.persistence.ISession; import org.squale.squalecommon.daolayer.config.AdminParamsDAOImpl; import org.squale.squalecommon.enterpriselayer.businessobject.config.AdminParamsBO; import org.squale.squalecommon.util.mail.IMailerProvider; import org.squale.squalecommon.util.mail.MailException; import org.squale.squalecommon.util.mail.MailMessages; /** * Mail provider, implementation for javaMail */ public class JavaMailProviderImpl implements IMailerProvider { /** logger */ private static final Log LOG = LogFactory.getLog( JavaMailProviderImpl.class ); /** * SMTP server to use for sent mail. */ private static String smtpServer; /** * Default sender. */ private static String senderAddress; /** * SMTP authentication needed ? */ private static boolean isSmtpAuthenticationNeeded; /** * SMTP authentication : user name */ private static String username; /** * SMTP authentication : password */ private static String password; /** * Constructor */ protected JavaMailProviderImpl() { } /** * This method send mail * * @param sender Sender Address * @param recipients List of recipient address * @param subject Subject of the mail * @param content Content of the mail * @throws MailException Exception happened the send of the mail */ public void sendMail( String sender, String[] recipients, String subject, String content ) throws MailException { // Initialization of the mail provider init(); // if there is mail configuration information if ( smtpServer != null && ( senderAddress != null || sender != null ) ) { // Properties used for sending mails Properties props = System.getProperties(); props.put( "mail.smtp.host", smtpServer ); Session session = smtpAuthent( props ); // Header message definition MimeMessage message = new MimeMessage( session ); try { // If a sender argument is not null we use it if ( sender != null ) { message.setFrom( new InternetAddress( sender ) ); } // If the sender argument is null else { message.setFrom( new InternetAddress( senderAddress ) ); } // We send to each recipient for ( int i = 0; i <= recipients.length - 1; i++ ) { String mailAddress = (String) recipients[i]; LOG.debug( "Recipent : " + recipients[i] ); message.addRecipient( Message.RecipientType.BCC, new InternetAddress( mailAddress ) ); } // Body message definition message.setSubject( subject ); message.setText( content, "iso-8859-1" ); // Send of the mail Transport.send( message ); } catch ( AddressException e ) { throw new MailException( e ); } catch ( MessagingException e ) { throw new MailException( e ); } } else { String message = MailMessages.getString( "mail.exception.noConfig" ); throw new MailException( message ); } } /** * Initialize the mail provider */ public static void init() { try { AdminParamsDAOImpl dao = AdminParamsDAOImpl.getInstance(); AdminParamsBO bo; ISession session = PersistenceHelper.getPersistenceProvider().getSession(); Collection<AdminParamsBO> adminParamsBOCollection = dao.findByKeyLike( session, AdminParamsBO.MAIL ); Iterator<AdminParamsBO> adminParamsIterator = adminParamsBOCollection.iterator(); while ( adminParamsIterator.hasNext() ) { bo = adminParamsIterator.next(); if ( bo.getParamKey().equals( AdminParamsBO.MAIL_SMTP_SERVER ) ) { smtpServer = bo.getParamValue(); } else if ( bo.getParamKey().equals( AdminParamsBO.MAIL_SENDER_ADDRESS ) ) { senderAddress = bo.getParamValue(); } else if ( bo.getParamKey().equals( AdminParamsBO.MAIL_SMTP_AUTHENT_NEEDED ) ) { if ( bo.getParamValue().equals( true ) ) { isSmtpAuthenticationNeeded = true; } else { isSmtpAuthenticationNeeded = false; } } else if ( bo.getParamKey().equals( AdminParamsBO.MAIL_SMTP_USERNAME ) ) { username = bo.getParamValue(); } else if ( bo.getParamKey().equals( AdminParamsBO.MAIL_SMTP_PASSWORD ) ) { password = bo.getParamValue(); } } } catch ( JrafDaoException e ) { LOG.error( MailMessages.getString( "mail.exception.initialization" ) ); LOG.error( e.getMessage() ); } } /** * This method return a session according to we use the SMTP authentication or not * * @param props the properties for sending a mail * @return the session for sending the mail */ private Session smtpAuthent( Properties props ) { Session session = null; if ( isSmtpAuthenticationNeeded ) { SmtpAuthenticator authent = new SmtpAuthenticator( username, password ); props.put( "mail.smtp.auth", "true" ); session = Session.getDefaultInstance( props, authent ); } else { // Session recovering session = Session.getDefaultInstance( props, null ); } return session; } }