/* * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. * * Copyright (c) 1997-2012 Oracle and/or its affiliates. All rights reserved. * * The contents of this file are subject to the terms of either the GNU * General Public License Version 2 only ("GPL") or the Common Development * and Distribution License("CDDL") (collectively, the "License"). You * may not use this file except in compliance with the License. You can * obtain a copy of the License at * https://glassfish.dev.java.net/public/CDDL+GPL_1_1.html * or packager/legal/LICENSE.txt. See the License for the specific * language governing permissions and limitations under the License. * * When distributing the software, include this License Header Notice in each * file and include the License file at packager/legal/LICENSE.txt. * * GPL Classpath Exception: * Oracle designates this particular file as subject to the "Classpath" * exception as provided by Oracle in the GPL Version 2 section of the License * file that accompanied this code. * * Modifications: * If applicable, add the following below the License Header, with the fields * enclosed by brackets [] replaced by your own identifying information: * "Portions Copyright [year] [name of copyright owner]" * * Contributor(s): * If you wish your version of this file to be governed by only the CDDL or * only the GPL Version 2, indicate your decision by adding "[Contributor] * elects to include this software in this distribution under the [CDDL or GPL * Version 2] license." If you don't indicate a single choice of license, a * recipient has the option to distribute your version of this file under * either the CDDL, the GPL Version 2 or to extend the choice of license to * its licensees as provided above. However, if you add GPL Version 2 code * and therefore, elected the GPL Version 2 license, then the option applies * only if the new code is made subject to such option by the copyright * holder. * * * This file incorporates work covered by the following copyright and * permission notice: * * Copyright 2004 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.naming.factory; import java.security.AccessController; import java.security.PrivilegedAction; import java.util.Hashtable; import java.util.Properties; import java.util.Enumeration; import javax.mail.Session; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimePart; import javax.mail.internet.MimePartDataSource; import javax.naming.Name; import javax.naming.Context; import javax.naming.Reference; import javax.naming.RefAddr; import javax.naming.spi.ObjectFactory; /** * Factory class that creates a JNDI named javamail MimePartDataSource * object which can be used for sending email using SMTP. * <p> * Can be configured in the DefaultContext or Context scope * of your server.xml configuration file. * <p> * Example: * <p> * <pre> * <Resource name="mail/send" auth="CONTAINER" * type="javax.mail.internet.MimePartDataSource"/> * <ResourceParams name="mail/send"> * <parameter><name>factory</name> * <value>org.apache.naming.factory.SendMailFactory</value> * </parameter> * <parameter><name>mail.smtp.host</name> * <value>your.smtp.host</value> * </parameter> * <parameter><name>mail.smtp.user</name> * <value>someuser</value> * </parameter> * <parameter><name>mail.from</name> * <value>someuser@some.host</value> * </parameter> * <parameter><name>mail.smtp.sendpartial</name> * <value>true</value> * </parameter> * <parameter><name>mail.smtp.dsn.notify</name> * <value>FAILURE</value> * </parameter> * <parameter><name>mail.smtp.dsn.ret</name> * <value>FULL</value> * </parameter> * </ResourceParams> * </pre> * * @author Glenn Nielsen Rich Catlett */ public class SendMailFactory implements ObjectFactory { // The class name for the javamail MimeMessageDataSource protected static final String DataSourceClassName = "javax.mail.internet.MimePartDataSource"; public Object getObjectInstance(Object RefObj, Name Nm, Context Ctx, Hashtable<?,?> Env) throws Exception { final Reference Ref = (Reference)RefObj; // Creation of the DataSource is wrapped inside a doPrivileged // so that javamail can read its default properties without // throwing Security Exceptions if (Ref.getClassName().equals(DataSourceClassName)) { return AccessController.doPrivileged( new PrivilegedAction<MimePartDataSource>() { public MimePartDataSource run() { // set up the smtp session that will send the message Properties props = new Properties(); // enumeration of all refaddr Enumeration<RefAddr> list = Ref.getAll(); // current refaddr to be set RefAddr refaddr; // set transport to smtp props.put("mail.transport.protocol", "smtp"); while (list.hasMoreElements()) { refaddr = list.nextElement(); // set property props.put(refaddr.getType(), refaddr.getContent()); } try { MimeMessage message = new MimeMessage( Session.getInstance(props)); String from = (String)Ref.get("mail.from").getContent(); message.setFrom(new InternetAddress(from)); message.setSubject(""); MimePartDataSource mds = new MimePartDataSource( (MimePart)message); return mds; } catch (Exception e) { return null; } } } ); } else { // We can't create an instance of the DataSource return null; } } }