    001    //$HeadURL: https://svn.wald.intevation.org/svn/deegree/base/branches/2.4_testing/src/org/deegree/framework/mail/MailHelper.java $
    002    /*----------------------------------------------------------------------------
    003     This file is part of deegree, http://deegree.org/
    004     Copyright (C) 2001-2009 by:
    005       Department of Geography, University of Bonn
    006     and
    007       lat/lon GmbH
    008
    009     This library is free software; you can redistribute it and/or modify it under
    010     the terms of the GNU Lesser General Public License as published by the Free
    011     Software Foundation; either version 2.1 of the License, or (at your option)
    012     any later version.
    013     This library is distributed in the hope that it will be useful, but WITHOUT
    014     ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
    015     FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
    016     details.
    017     You should have received a copy of the GNU Lesser General Public License
    018     along with this library; if not, write to the Free Software Foundation, Inc.,
    019     59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
    020
    021     Contact information:
    022
    023     lat/lon GmbH
    024     Aennchenstr. 19, 53177 Bonn
    025     Germany
    026     http://lat-lon.de/
    027
    028     Department of Geography, University of Bonn
    029     Prof. Dr. Klaus Greve
    030     Postfach 1147, 53001 Bonn
    031     Germany
    032     http://www.geographie.uni-bonn.de/deegree/
    033
    034     e-mail: info@deegree.org
    035    ----------------------------------------------------------------------------*/
    036    package org.deegree.framework.mail;
    037
    038    // J2EE 1.2
    039    import java.io.File;
    040    import java.util.ArrayList;
    041    import java.util.Date;
    042    import java.util.List;
    043    import java.util.Properties;
    044
    045    import javax.mail.Message;
    046    import javax.mail.Multipart;
    047    import javax.mail.PasswordAuthentication;
    048    import javax.mail.Session;
    049    import javax.mail.Transport;
    050    import javax.mail.internet.InternetAddress;
    051    import javax.mail.internet.MimeBodyPart;
    052    import javax.mail.internet.MimeMessage;
    053    import javax.mail.internet.MimeMultipart;
    054
    055    import org.deegree.framework.log.ILogger;
    056    import org.deegree.framework.log.LoggerFactory;
    057    import org.deegree.framework.util.CharsetUtils;
    058    import org.deegree.framework.util.StringTools;
    059    import org.deegree.i18n.Messages;
    060
    061    /**
    062     * A helper class to create and send mail.
    063     *
    064     * @author <a href="mailto:tfr@users.sourceforge.net">Torsten Friebe </A>
    065     * @author last edited by: $Author: mschneider $
    066     *
    067     * @version $Revision: 18195 $,$Date: 2009-06-18 17:55:39 +0200 (Do, 18. Jun 2009) $
    068     *
    069     * @see javax.mail.Message
    070     * @see javax.mail.internet.MimeMessage
    071     */
    072
    073    public final class MailHelper {
    074
    075        private static final ILogger LOG = LoggerFactory.getLogger( MailHelper.class );
    076
    077        /**
    078         * Creates a mail helper to send a message.
    079         *
    080         */
    081        public MailHelper() {
    082            // EMpty And useless ConstructorS not typed with emacs
    083        }
    084
    085        /**
    086         * This method creates an email message and sends it using the J2EE mail services
    087         *
    088         * @param eMess
    089         *            a email message
    090         * @param mailHost
    091         *            name of the SMTP host
    092         *
    093         * @throws SendMailException
    094         *             an exception if the message is undeliverable
    095         */
    096        public static void createAndSendMail( MailMessage eMess, String mailHost )
    097                                throws SendMailException {
    098            Properties p = System.getProperties();
    099            p.put( "mail.smtp.host", mailHost );
    100            new MailHelper().createAndSendMail( eMess, Session.getDefaultInstance( p ) );
    101        }
    102
    103        /**
    104         * This method creates an email message and sends it using the J2EE mail services
    105         *
    106         * @param eMess
    107         *            a email message
    108         * @param mailHost
    109         *            name of the SMTP host
    110         * @param mailHostUser
    111         *            user name for mail host
    112         * @param mailHostPassword
    113         *            password of user
    114         *
    115         *
    116         * @throws SendMailException
    117         *             an exception if the message is undeliverable
    118         */
    119        public static void createAndSendMail( MailMessage eMess, String mailHost, String mailHostUser,
    120                                              String mailHostPassword )
    121                                throws SendMailException {
    122            Properties p = System.getProperties();
    123            p.put( "mail.smtp.host", mailHost );
    124            p.setProperty( "mail.smtp.submitter", mailHostUser );
    125            p.setProperty( "mail.smtp.auth", "true" );
    126            Authenticator authenticator = new Authenticator( mailHostUser, mailHostPassword );
    127
    128            new MailHelper().createAndSendMail( eMess, Session.getInstance( p, authenticator ) );
    129        }
    130
    131        /**
    132         * This method creates an email message and sends it using the J2EE mail services
    133         *
    134         * @param eMess
    135         *            a email message
    136         * @param mailHost
    137         *            name of the SMTP host
    138         * @param attachment
    139         *            Object to attach to a mail
    140         * @param mimeType
    141         *            mimetype of the attchment
    142         *
    143         * @throws SendMailException
    144         */
    145        public static void createAndSendMail( MailMessage eMess, String mailHost, Object[] attachment, String[] mimeType )
    146                                throws SendMailException {
    147            Properties p = System.getProperties();
    148            p.put( "mail.smtp.host", mailHost );
    149            new MailHelper().createAndSendMail( eMess, Session.getDefaultInstance( p ), attachment, mimeType );
    150        }
    151
    152        /**
    153         * This method creates an email message and sends it using the J2EE mail services
    154         *
    155         * @param eMess
    156         *            a email message
    157         * @param mailHost
    158         *            name of the SMTP host
    159         * @param attachment
    160         *            Object to attach to a mail
    161         * @param mimeType
    162         *            mimetype of the attchment
    163         * @param mailHostUser
    164         *            user name for mail host
    165         * @param mailHostPassword
    166         *            password of user
    167         * @throws SendMailException
    168         */
    169        public static void createAndSendMail( MailMessage eMess, String mailHost, Object[] attachment, String[] mimeType,
    170                                              String mailHostUser, String mailHostPassword )
    171                                throws SendMailException {
    172            Properties p = System.getProperties();
    173            p.put( "mail.smtp.host", mailHost );
    174            p.setProperty( "mail.smtp.submitter", mailHostUser );
    175            p.setProperty( "mail.smtp.auth", "true" );
    176            Authenticator authenticator = new Authenticator( mailHostUser, mailHostPassword );
    177
    178            new MailHelper().createAndSendMail( eMess, Session.getInstance( p, authenticator ), attachment, mimeType );
    179        }
    180
    181        /**
    182         * This method creates an email message and sends it using the J2EE mail services
    183         *
    184         * @param eMess
    185         *            a email message
    186         * @param mailHost
    187         *            name of the SMTP host
    188         * @param files
    189         *            files to attach to a mail
    190         * @param mimeType
    191         *            mimetype of the attchment
    192         * @throws SendMailException
    193         */
    194        public static void createAndSendMail( MailMessage eMess, String mailHost, File[] files, String[] mimeType )
    195                                throws SendMailException {
    196            Properties p = System.getProperties();
    197            p.put( "mail.smtp.host", mailHost );
    198            new MailHelper().createAndSendMail( eMess, Session.getDefaultInstance( p ), files, mimeType );
    199        }
    200
    201        /**
    202         * This method creates an email message and sends it using the J2EE mail services
    203         *
    204         * @param eMess
    205         *            a email message
    206         * @param mailHost
    207         *            name of the SMTP host
    208         * @param files
    209         *            files to attach to a mail
    210         * @param mimeType
    211         *            mimetype of the attchment
    212         * @param mailHostUser
    213         * @param mailHostPassword
    214         * @throws SendMailException
    215         */
    216        public static void createAndSendMail( MailMessage eMess, String mailHost, File[] files, String[] mimeType,
    217                                              String mailHostUser, String mailHostPassword )
    218                                throws SendMailException {
    219            Properties p = System.getProperties();
    220            p.put( "mail.smtp.host", mailHost );
    221            p.setProperty( "mail.smtp.submitter", mailHostUser );
    222            p.setProperty( "mail.smtp.auth", "true" );
    223            Authenticator authenticator = new Authenticator( mailHostUser, mailHostPassword );
    224
    225            new MailHelper().createAndSendMail( eMess, Session.getInstance( p, authenticator ), files, mimeType );
    226        }
    227
    228        /**
    229         * This method creates an email message and sends it using the J2EE mail services
    230         *
    231         * @param eMess
    232         *            a email message
    233         * @param session
    234         *
    235         * @throws SendMailException
    236         *             an exception if the message is undeliverable
    237         *
    238         * @see javax.mail.Transport
    239         * @see <a href="http://java.sun.com/j2ee/tutorial/1_3-fcs/doc/Resources4.html#63060">J2EE Mail Session connection
    240         *      </a>
    241         */
    242        public void createAndSendMail( MailMessage eMess, Session session )
    243                                throws SendMailException {
    244            createAndSendMail( eMess, session, (Object[]) null, null );
    245        }
    246
    247        /**
    248         * This method creates an email message and sends it using the J2EE mail services
    249         *
    250         * @param eMess
    251         *            a email message
    252         * @param session
    253         * @param mailHostUser
    254         * @param mailHostPassword
    255         *
    256         * @throws SendMailException
    257         *             an exception if the message is undeliverable
    258         *
    259         * @see javax.mail.Transport
    260         * @see <a href="http://java.sun.com/j2ee/tutorial/1_3-fcs/doc/Resources4.html#63060">J2EE Mail Session connection
    261         *      </a>
    262         */
    263        public void createAndSendMail( MailMessage eMess, Session session, String mailHostUser, String mailHostPassword )
    264                                throws SendMailException {
    265            createAndSendMail( eMess, session, (Object[]) null, null );
    266        }
    267
    268        /**
    269         * This method creates an email message and sends it using the J2EE mail services
    270         *
    271         * @param eMess
    272         *            an email message
    273         * @param session
    274         * @param attachment
    275         *            Object to attach to a mail
    276         * @param mimeType
    277         *            mimetype of the attchment
    278         * @throws SendMailException
    279         *             an exception if the message is undeliverable
    280         */
    281        public void createAndSendMail( MailMessage eMess, Session session, Object[] attachment, String[] mimeType )
    282                                throws SendMailException {
    283            if ( eMess == null || !eMess.isValid() ) {
    284                throw new SendMailException( "Not a valid e-mail!" );
    285            }
    286            try {
    287                int k = eMess.getMessageBody().length() > 60 ? 60 : eMess.getMessageBody().length() - 1;
    288                LOG.logDebug( StringTools.concat( 500, "Sending message, From: ", eMess.getSender(), "\nTo: ",
    289                                                  eMess.getReceiver(), "\nSubject: ", eMess.getSubject(), "\nContents: ",
    290                                                  eMess.getMessageBody().substring( 0, k ), "..." ) );
    291                // construct the message
    292                MimeMessage msg = new MimeMessage( session );
    293                msg.setFrom( new InternetAddress( eMess.getSender() ) );
    294                msg.setRecipients( Message.RecipientType.TO, InternetAddress.parse( eMess.getReceiver(), false ) );
    295                msg.setSubject( eMess.getSubject(), CharsetUtils.getSystemCharset() );
    296                msg.setHeader( "X-Mailer", "JavaMail" );
    297                msg.setSentDate( new Date() );
    298
    299                // create and fill the first message part
    300                List<MimeBodyPart> mbps = new ArrayList<MimeBodyPart>();
    301                MimeBodyPart mbp = new MimeBodyPart();
    302                mbp.setContent( eMess.getMessageBody(), eMess.getMimeType() );
    303                mbps.add( mbp );
    304                if ( attachment != null ) {
    305                    if ( attachment.length != mimeType.length ) {
    306                        throw new SendMailException( Messages.getMessage( "FRAMEWORK_MAIL_ATTACH" ) );
    307                    }
    308                    for ( int i = 0; i < attachment.length; i++ ) {
    309                        mbp = new MimeBodyPart();
    310                        mbp.setContent( attachment[i], mimeType[i] );
    311                        mbp.setFileName( "file" + i );
    312                        mbps.add( mbp );
    313                    }
    314                }
    315                // create the Multipart and add its parts to it
    316                Multipart mp = new MimeMultipart();
    317                for ( int i = 0; i < mbps.size(); i++ ) {
    318                    mp.addBodyPart( mbps.get( i ) );
    319                }
    320                msg.setContent( mp );
    321
    322                // Transport tr = session.getTransport( "smtp" );
    323                // if ( mailHostUser != null ) {
    324                // tr.connect( mailHostUser, mailHostPassword );
    325                // } else {
    326                // tr.connect();
    327                // }
    328                // msg.saveChanges(); // don't forget this
    329                // tr.sendMessage( msg, msg.getAllRecipients() );
    330                // tr.close();
    331
    332                Transport.send( msg );
    333                LOG.logDebug( "Mail sent successfully! Header=", eMess.getHeader() );
    334            } catch ( Exception e ) {
    335                LOG.logError( e.getMessage(), e );
    336                String s = Messages.getMessage( "FRAMEWORK_MAIL_SEND_ERROR", eMess.getHeader() );
    337                throw new SendMailException( s, e );
    338            }
    339        }
    340
    341        /**
    342         * This method creates an email message and sends it using the J2EE mail services
    343         *
    344         * @param eMess
    345         *            an email message
    346         * @param session
    347         * @param files
    348         *            files to attach to a mail
    349         * @param mimeType
    350         *            mimetype of the attchment
    351         * @throws SendMailException
    352         *             an exception if the message is undeliverable
    353         */
    354        public void createAndSendMail( MailMessage eMess, Session session, File[] files, String[] mimeType )
    355                                throws SendMailException {
    356            if ( eMess == null || !eMess.isValid() ) {
    357                throw new SendMailException( "Not a valid e-mail!" );
    358            }
    359            try {
    360                int k = eMess.getMessageBody().length() > 60 ? 60 : eMess.getMessageBody().length() - 1;
    361                LOG.logDebug( StringTools.concat( 500, "Sending message, From: ", eMess.getSender(), "\nTo: ",
    362                                                  eMess.getReceiver(), "\nSubject: ", eMess.getSubject(), "\nContents: ",
    363                                                  eMess.getMessageBody().substring( 0, k ), "..." ) );
    364                // construct the message
    365                MimeMessage msg = new MimeMessage( session );
    366                msg.setFrom( new InternetAddress( eMess.getSender() ) );
    367                msg.setRecipients( Message.RecipientType.TO, InternetAddress.parse( eMess.getReceiver(), false ) );
    368                msg.setSubject( eMess.getSubject(), CharsetUtils.getSystemCharset() );
    369                msg.setHeader( "X-Mailer", "JavaMail" );
    370                msg.setSentDate( new Date() );
    371
    372                // create and fill the first message part
    373                List<MimeBodyPart> mbps = new ArrayList<MimeBodyPart>();
    374                MimeBodyPart mbp = new MimeBodyPart();
    375                mbp.setContent( eMess.getMessageBody(), eMess.getMimeType() );
    376                mbps.add( mbp );
    377                if ( files != null ) {
    378                    if ( files.length != mimeType.length ) {
    379                        throw new SendMailException( Messages.getMessage( "FRAMEWORK_MAIL_ATTACH" ) );
    380                    }
    381                    for ( int i = 0; i < files.length; i++ ) {
    382                        mbp = new MimeBodyPart();
    383                        mbp.attachFile( files[i] );
    384                        mbp.setHeader( "Content-Type", mimeType[i] );
    385                        mbps.add( mbp );
    386                    }
    387                }
    388                // create the Multipart and add its parts to it
    389                Multipart mp = new MimeMultipart();
    390                for ( int i = 0; i < mbps.size(); i++ ) {
    391                    mp.addBodyPart( mbps.get( i ) );
    392                }
    393                msg.setContent( mp );
    394
    395                // send the mail off
    396                // Transport tr = session.getTransport( "smtp" );
    397                // if ( mailHostUser != null ) {
    398                // tr.connect( mailHostUser, mailHostPassword );
    399                // } else {
    400                // tr.connect();
    401                // }
    402                // msg.saveChanges(); // don't forget this
    403                // tr.sendMessage( msg, msg.getAllRecipients() );
    404                // tr.close();
    405                Transport.send( msg );
    406                LOG.logDebug( "Mail sent successfully! Header=", eMess.getHeader() );
    407            } catch ( Exception e ) {
    408                LOG.logError( e.getMessage(), e );
    409                String s = Messages.getMessage( "FRAMEWORK_MAIL_SEND_ERROR", eMess.getHeader() );
    410                throw new SendMailException( s, e );
    411            }
    412        }
    413
    414        private static class Authenticator extends javax.mail.Authenticator {
    415            private PasswordAuthentication authentication;
    416
    417            public Authenticator( String username, String password ) {
    418                // String username = "auth-user";
    419                // String password = "auth-password";
    420                authentication = new PasswordAuthentication( username, password );
    421            }
    422
    423            @Override
    424            protected PasswordAuthentication getPasswordAuthentication() {
    425                return authentication;
    426            }
    427        }
    428
    429    }