/**
* The contents of this file are subject to the license and copyright
* detailed in the LICENSE and NOTICE files at the root of the source
* tree and available online at
*
* http://www.dspace.org/license/
*/
package org.dspace.services.email;
import java.util.Properties;
import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import org.dspace.kernel.mixins.InitializedService;
import org.dspace.services.ConfigurationService;
import org.dspace.services.EmailService;
import org.dspace.services.factory.DSpaceServicesFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Required;
/**
* Provides mail sending services through JavaMail. If a {@link javax.mail.Session}
* instance is provided through JNDI, it will be used. If not, then a session
* will be created from DSpace configuration data ({@code mail.server} etc.)
*
* @author mwood
*/
public class EmailServiceImpl
extends Authenticator
implements EmailService, InitializedService
{
private static final Logger logger = (Logger) LoggerFactory.getLogger(EmailServiceImpl.class);
private Session session = null;
private ConfigurationService cfg = null;
/**
* Inject/set the ConfigurationService
* @param cfg the configurationService object
*/
@Autowired
@Required
public void setCfg(ConfigurationService cfg)
{
this.cfg = cfg;
}
/**
* Provide a reference to the JavaMail session.
*
* @return the managed Session, or null if none could be created.
*/
@Override
public Session getSession()
{
return session;
}
@Override
public void init()
{
// See if there is already a Session in our environment
String sessionName = cfg.getProperty("mail.session.name");
if (null == sessionName)
{
sessionName = "Session";
}
try
{
InitialContext ctx = new InitialContext(null);
session = (Session) ctx.lookup("java:comp/env/mail/" + sessionName);
} catch (NamingException ex)
{
logger.warn("Couldn't get an email session from environment: {}",
ex.getMessage());
}
if (null != session)
{
logger.info("Email session retrieved from environment.");
}
else
{ // No Session provided, so create one
logger.info("Initializing an email session from configuration.");
Properties props = new Properties();
props.put("mail.transport.protocol", "smtp");
String host = cfg.getProperty("mail.server");
if (null != host)
{
props.put("mail.host", cfg.getProperty("mail.server"));
}
String port = cfg.getProperty("mail.server.port");
if (null != port)
{
props.put("mail.smtp.port", port);
}
// Set extra configuration properties
String[] extras = cfg.getArrayProperty("mail.extraproperties");
if (extras != null)
{
String key, value;
for (String argument : extras)
{
key = argument.substring(0, argument.indexOf('=')).trim();
value = argument.substring(argument.indexOf('=') + 1).trim();
props.put(key, value);
}
}
if (null == cfg.getProperty("mail.server.username"))
{
session = Session.getInstance(props);
}
else
{
props.put("mail.smtp.auth", "true");
session = Session.getInstance(props, this);
}
}
}
@Override
protected PasswordAuthentication getPasswordAuthentication()
{
if (null == cfg)
{
cfg = DSpaceServicesFactory.getInstance().getConfigurationService();
}
return new PasswordAuthentication(
cfg.getProperty("mail.server.username"),
cfg.getProperty("mail.server.password"));
}
}