001    //$HeadURL: svn+ssh://rbezema@svn.wald.intevation.org/deegree/base/branches/2.2_testing/src/org/deegree/framework/mail/MailHelper.java $
002    /*----------------    FILE HEADER  ------------------------------------------
003    
004     This file is part of deegree.
005     Copyright (C) 2001-2008 by:
006     EXSE, Department of Geography, University of Bonn
007     http://www.giub.uni-bonn.de/deegree/
008     lat/lon GmbH
009     http://www.lat-lon.de
010    
011     This library is free software; you can redistribute it and/or
012     modify it under the terms of the GNU Lesser General Public
013     License as published by the Free Software Foundation; either
014     version 2.1 of the License, or (at your option) any later version.
015    
016     This library is distributed in the hope that it will be useful,
017     but WITHOUT ANY WARRANTY; without even the implied warranty of
018     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
019     Lesser General Public License for more details.
020    
021     You should have received a copy of the GNU Lesser General Public
022     License along with this library; if not, write to the Free Software
023     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
024    
025     Contact:
026    
027     Andreas Poth
028     lat/lon GmbH
029     Aennchenstr. 19
030     53115 Bonn
031     Germany
032     E-Mail: poth@lat-lon.de
033    
034     Prof. Dr. Klaus Greve
035     Department of Geography
036     University of Bonn
037     Meckenheimer Allee 166
038     53115 Bonn
039     Germany
040     E-Mail: greve@giub.uni-bonn.de
041    
042     
043     ---------------------------------------------------------------------------*/
044    package org.deegree.framework.mail;
045    
046    // J2EE 1.2
047    import java.io.File;
048    import java.util.ArrayList;
049    import java.util.Date;
050    import java.util.List;
051    import java.util.Properties;
052    
053    import javax.mail.Message;
054    import javax.mail.Multipart;
055    import javax.mail.Session;
056    import javax.mail.Transport;
057    import javax.mail.internet.InternetAddress;
058    import javax.mail.internet.MimeBodyPart;
059    import javax.mail.internet.MimeMessage;
060    import javax.mail.internet.MimeMultipart;
061    
062    import org.deegree.framework.log.ILogger;
063    import org.deegree.framework.log.LoggerFactory;
064    import org.deegree.framework.util.CharsetUtils;
065    import org.deegree.framework.util.StringTools;
066    import org.deegree.i18n.Messages;
067    
068    /**
069     * A helper class to create and send mail.
070     * 
071     * @author <a href="mailto:tfr@users.sourceforge.net">Torsten Friebe </A>
072     * @author last edited by: $Author: apoth $
073     * 
074     * @version $Revision: 9339 $,$Date: 2007-12-27 13:31:52 +0100 (Do, 27 Dez 2007) $
075     * 
076     * @see javax.mail.Message
077     * @see javax.mail.internet.MimeMessage
078     */
079    
080    public final class MailHelper {
081    
082        private static final ILogger LOG = LoggerFactory.getLogger( MailHelper.class );
083    
084        /**
085         * Creates a mail helper to send a message.
086         * 
087         */
088        public MailHelper() {
089        }
090    
091        /**
092         * This method creates an email message and sends it using the J2EE mail services
093         * 
094         * @param eMess
095         *            a email message
096         * @param mailHost
097         *            name of the SMTP host
098         * 
099         * @throws SendMailException
100         *             an exception if the message is undeliverable
101         */
102        public static void createAndSendMail( MailMessage eMess, String mailHost )
103                                throws SendMailException {
104            Properties p = System.getProperties();
105            p.put( "mail.smtp.host", mailHost );
106            new MailHelper().createAndSendMail( eMess, Session.getDefaultInstance( p ) );
107        }
108    
109        /**
110         * This method creates an email message and sends it using the J2EE mail services
111         * 
112         * @param eMess
113         *            a email message
114         * @param mailHost
115         *            name of the SMTP host
116         * @param attachment
117         *            Object to attach to a mail
118         * @param mimeType
119         *            mimetype of the attchment
120         * @throws SendMailException
121         */
122        public static void createAndSendMail( MailMessage eMess, String mailHost, Object[] attachment,
123                                              String[] mimeType )
124                                throws SendMailException {
125            Properties p = System.getProperties();
126            p.put( "mail.smtp.host", mailHost );
127            new MailHelper().createAndSendMail( eMess, Session.getDefaultInstance( p ), attachment,
128                                                mimeType );
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 files
139         *            files to attach to a mail
140         * @param mimeType
141         *            mimetype of the attchment
142         * @throws SendMailException
143         */
144        public static void createAndSendMail( MailMessage eMess, String mailHost, File[] files,
145                                              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 ), files,
150                                                mimeType );
151        }
152    
153        /**
154         * This method creates an email message and sends it using the J2EE mail services
155         * 
156         * @param eMess
157         *            a email message
158         * @param session
159         * 
160         * @throws SendMailException
161         *             an exception if the message is undeliverable
162         * 
163         * @see javax.mail.Transport
164         * @see <a href="http://java.sun.com/j2ee/tutorial/1_3-fcs/doc/Resources4.html#63060">J2EE Mail
165         *      Session connection </a>
166         */
167        public void createAndSendMail( MailMessage eMess, Session session )
168                                throws SendMailException {
169            createAndSendMail( eMess, session, null, null );
170        }
171    
172        /**
173         * This method creates an email message and sends it using the J2EE mail services
174         * 
175         * @param eMess
176         *            an email message
177         * @param session
178         * @param attachment
179         *            Object to attach to a mail
180         * @param mimeType
181         *            mimetype of the attchment
182         * @throws SendMailException
183         *             an exception if the message is undeliverable
184         */
185        public void createAndSendMail( MailMessage eMess, Session session, Object[] attachment,
186                                       String[] mimeType )
187                                throws SendMailException {
188            if ( eMess == null || !eMess.isValid() ) {
189                throw new SendMailException( "Not a valid e-mail!" );
190            }
191            try {
192                int k = eMess.getMessageBody().length() > 60 ? 60 : eMess.getMessageBody().length() - 1;
193                LOG.logDebug( StringTools.concat( 500, "Sending message, From: ", eMess.getSender(),
194                                                  "\nTo: ", eMess.getReceiver(), "\nSubject: ",
195                                                  eMess.getSubject(), "\nContents: ",
196                                                  eMess.getMessageBody().substring( 0, k ), "..." ) );
197                // construct the message
198                MimeMessage msg = new MimeMessage( session );
199                msg.setFrom( new InternetAddress( eMess.getSender() ) );
200                msg.setRecipients( Message.RecipientType.TO,
201                                   InternetAddress.parse( eMess.getReceiver(), false ) );
202                msg.setSubject( eMess.getSubject(), CharsetUtils.getSystemCharset() );
203                msg.setHeader( "X-Mailer", "JavaMail" );
204                msg.setSentDate( new Date() );
205    
206                // create and fill the first message part
207                List<MimeBodyPart> mbps = new ArrayList<MimeBodyPart>();
208                MimeBodyPart mbp = new MimeBodyPart();
209                mbp.setContent( eMess.getMessageBody(), eMess.getMimeType() );
210                mbps.add( mbp );
211                if ( attachment != null ) {
212                    if ( attachment.length != mimeType.length ) {
213                        throw new SendMailException( Messages.getMessage( "FRAMEWORK_MAIL_ATTACH" ) );
214                    }
215                    for ( int i = 0; i < attachment.length; i++ ) {
216                        mbp = new MimeBodyPart();
217                        mbp.setContent( attachment[i], mimeType[i] );
218                        mbp.setFileName( "file" + i );
219                        mbps.add( mbp );
220                    }
221                }
222                // create the Multipart and add its parts to it
223                Multipart mp = new MimeMultipart();
224                for ( int i = 0; i < mbps.size(); i++ ) {
225                    mp.addBodyPart( mbps.get( i ) );
226                }
227                msg.setContent( mp );
228                // send the mail off
229                Transport.send( msg );
230                LOG.logDebug( "Mail sent successfully! Header=", eMess.getHeader() );
231            } catch ( Exception e ) {
232                LOG.logError( e.getMessage(), e );
233                String s = Messages.getMessage( "FRAMEWORK_MAIL_SEND_ERROR", eMess.getHeader() );
234                throw new SendMailException( s, e );
235            }
236        }
237    
238        /**
239         * This method creates an email message and sends it using the J2EE mail services
240         * 
241         * @param eMess
242         *            an email message
243         * @param session
244         * @param files
245         *            files to attach to a mail
246         * @param mimeType
247         *            mimetype of the attchment
248         * @throws SendMailException
249         *             an exception if the message is undeliverable
250         */
251        public void createAndSendMail( MailMessage eMess, Session session, File[] files,
252                                       String[] mimeType )
253                                throws SendMailException {
254            if ( eMess == null || !eMess.isValid() ) {
255                throw new SendMailException( "Not a valid e-mail!" );
256            }
257            try {
258                int k = eMess.getMessageBody().length() > 60 ? 60 : eMess.getMessageBody().length() - 1;
259                LOG.logDebug( StringTools.concat( 500, "Sending message, From: ", eMess.getSender(),
260                                                  "\nTo: ", eMess.getReceiver(), "\nSubject: ",
261                                                  eMess.getSubject(), "\nContents: ",
262                                                  eMess.getMessageBody().substring( 0, k ), "..." ) );
263                // construct the message
264                MimeMessage msg = new MimeMessage( session );
265                msg.setFrom( new InternetAddress( eMess.getSender() ) );
266                msg.setRecipients( Message.RecipientType.TO,
267                                   InternetAddress.parse( eMess.getReceiver(), false ) );
268                msg.setSubject( eMess.getSubject(), CharsetUtils.getSystemCharset() );
269                msg.setHeader( "X-Mailer", "JavaMail" );
270                msg.setSentDate( new Date() );
271    
272                // create and fill the first message part
273                List<MimeBodyPart> mbps = new ArrayList<MimeBodyPart>();
274                MimeBodyPart mbp = new MimeBodyPart();
275                mbp.setContent( eMess.getMessageBody(), eMess.getMimeType() );
276                mbps.add( mbp );
277                if ( files != null ) {
278                    if ( files.length != mimeType.length ) {
279                        throw new SendMailException( Messages.getMessage( "FRAMEWORK_MAIL_ATTACH" ) );
280                    }
281                    for ( int i = 0; i < files.length; i++ ) {
282                        mbp = new MimeBodyPart();
283                        mbp.attachFile( files[i] );
284                        mbp.setHeader( "Content-Type", mimeType[i] );
285                        mbps.add( mbp );
286                    }
287                }
288                // create the Multipart and add its parts to it
289                Multipart mp = new MimeMultipart();
290                for ( int i = 0; i < mbps.size(); i++ ) {
291                    mp.addBodyPart( mbps.get( i ) );
292                }
293                msg.setContent( mp );
294                // send the mail off
295                Transport.send( msg );
296                LOG.logDebug( "Mail sent successfully! Header=", eMess.getHeader() );
297            } catch ( Exception e ) {
298                LOG.logError( e.getMessage(), e );
299                String s = Messages.getMessage( "FRAMEWORK_MAIL_SEND_ERROR", eMess.getHeader() );
300                throw new SendMailException( s, e );
301            }
302        }
303    }