View Javadoc

1   /**
2    * Copyright 2005-2012 The Kuali Foundation
3    *
4    * Licensed under the Educational Community License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    * http://www.opensource.org/licenses/ecl2.php
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   */
16  package org.kuali.rice.core.mail;
17  
18  import org.kuali.rice.core.api.config.property.ConfigContext;
19  import org.springframework.beans.factory.config.AbstractFactoryBean;
20  import org.springframework.mail.javamail.JavaMailSenderImpl;
21  
22  import javax.mail.Authenticator;
23  import javax.mail.PasswordAuthentication;
24  import javax.mail.Session;
25  import java.util.Properties;
26  
27  /**
28   * A factory bean which reads mail-related properties from the Configuration system and
29   * generates a Spring Java Mail Sender instance for use by services that send e-mail.
30   * 
31   * @author Kuali Rice Team (rice.collab@kuali.org)
32   *
33   */
34  @SuppressWarnings("unchecked")
35  public class MailSenderFactoryBean extends AbstractFactoryBean {
36  
37  	protected final org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(MailSenderFactoryBean.class);
38  	
39      private static final String MAIL_PREFIX = "mail";
40      private static final String USERNAME_PROPERTY = "mail.smtp.username";
41      private static final String PASSWORD_PROPERTY = "mail.smtp.password";
42      private static final String HOST_PROPERTY = "mail.smtp.host";
43      private static final String PORT_PROPERTY = "mail.smtp.port";
44      
45      private Session mailSession;
46      
47      @Override
48  	protected  Object createInstance() throws Exception {
49  	    // Retrieve "mail.*" properties from the configuration system and construct a Properties object
50  		Properties properties = new Properties();
51  		Properties configProps = ConfigContext.getCurrentContextConfig().getProperties();
52  		LOG.debug("createInstance(): collecting mail properties.");
53  		for (Object keyObj : configProps.keySet()) {
54  		    if (keyObj instanceof String) {
55  		    	String key = (String)keyObj;
56  		    	if (key.startsWith(MAIL_PREFIX)){
57  		    		properties.put(key, configProps.get(key));
58  		    	}
59  		    }
60  		}
61  		
62  		// Construct an appropriate Java Mail Session
63  		// If username and password properties are found, construct a Session with SMTP authentication
64  		String username = properties.getProperty(USERNAME_PROPERTY);
65  		String password = properties.getProperty(PASSWORD_PROPERTY);
66  		if (username != null && password != null) {
67  			mailSession = Session.getInstance(properties, new SimpleAuthenticator(username, password));
68  			LOG.info("createInstance(): Initializing mail session using SMTP authentication.");
69  		} else {
70  			mailSession = Session.getInstance(properties);
71  			LOG.info("createInstance(): Initializing mail session. No SMTP authentication.");
72  		}
73  		
74  		// Construct and return a Spring Java Mail Sender
75  		JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
76  		LOG.debug("createInstance(): setting SMTP host.");
77  		mailSender.setHost(properties.getProperty(HOST_PROPERTY));
78  		if (properties.getProperty(PORT_PROPERTY) != null) {
79  			LOG.debug("createInstance(): setting SMTP port.");
80  			int smtpPort = Integer.parseInt(properties.getProperty(PORT_PROPERTY).trim());
81  			mailSender.setPort(smtpPort);
82  		}
83  		mailSender.setSession(mailSession);
84  		
85  		LOG.info("createInstance(): Mail Sender Factory Bean initialized.");
86  		return mailSender;
87      }
88      
89      private class SimpleAuthenticator extends Authenticator {
90      	
91      	private final PasswordAuthentication passwordAuthentication;
92  
93          private SimpleAuthenticator(String username, String password) {
94          	this.passwordAuthentication = new PasswordAuthentication(username, password);
95          }
96  
97          public PasswordAuthentication getPasswordAuthentication() {
98              return passwordAuthentication;
99          }
100     }
101     
102     @SuppressWarnings("unchecked")
103 	@Override
104     public Class getObjectType() {
105 	return JavaMailSenderImpl.class;
106     }
107 
108 }