/*******************************************************************************
* Copyright (c) 2015 IBH SYSTEMS GmbH.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBH SYSTEMS GmbH - initial API and implementation
*******************************************************************************/
package org.eclipse.packagedrone.mail.java;
import java.util.Dictionary;
import java.util.Enumeration;
import java.util.Properties;
import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.NoSuchProviderException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import org.eclipse.packagedrone.mail.MailService;
import org.osgi.service.component.ComponentContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.io.CharStreams;
public class DefaultMailService implements MailService
{
private final static Logger logger = LoggerFactory.getLogger ( DefaultMailService.class );
public static final String PROPERTY_PREFIX = "properties.";
public static final String SERVICE_PID = "org.eclipse.packagedrone.mail.default";
private Session session;
private Dictionary<String, Object> config;
public DefaultMailService ()
{
}
public void updated ( final ComponentContext context )
{
stop ();
start ( context );
}
public void start ( final ComponentContext context )
{
this.config = context.getProperties ();
final String username = getString ( "username" );
final String password = getString ( "password" );
final Properties properties = new Properties ();
final Enumeration<String> keys = this.config.keys ();
while ( keys.hasMoreElements () )
{
final String key = keys.nextElement ();
logger.debug ( "Checking key: {}", key );
if ( key.startsWith ( PROPERTY_PREFIX ) )
{
final Object val = this.config.get ( key );
if ( val == null )
{
continue;
}
final String mkey = key.substring ( PROPERTY_PREFIX.length () );
logger.info ( "Property - {} = {}", mkey, val );
properties.put ( mkey, val );
}
}
Authenticator auth = null;
if ( username != null && password != null )
{
auth = new Authenticator () {
@Override
protected PasswordAuthentication getPasswordAuthentication ()
{
return new PasswordAuthentication ( username, password );
}
};
properties.put ( "mail.smtp.auth", "true" );
}
this.session = Session.getInstance ( properties, auth );
}
private String getString ( final String key )
{
final Object val = this.config.get ( key );
if ( val != null )
{
return val.toString ();
}
return null;
}
public void stop ()
{
this.session = null;
}
@Override
public void sendMessage ( final String to, final String subject, final Readable readable ) throws Exception
{
// create message
final Message message = createMessage ( to, subject );
// set text
message.setText ( CharStreams.toString ( readable ) );
// send message
sendMessage ( message );
}
@Override
public void sendMessage ( final String to, final String subject, final String text, final String html ) throws Exception
{
// create message
final Message message = createMessage ( to, subject );
if ( html != null && !html.isEmpty () )
{
// create multipart
final Multipart parts = new MimeMultipart ( "alternative" );
// set text
final MimeBodyPart textPart = new MimeBodyPart ();
textPart.setText ( text, "UTF-8" );
parts.addBodyPart ( textPart );
// set HTML, optionally
final MimeBodyPart htmlPart = new MimeBodyPart ();
htmlPart.setContent ( html, "text/html; charset=utf-8" );
parts.addBodyPart ( htmlPart );
// set parts
message.setContent ( parts );
}
else
{
// plain text
message.setText ( text );
}
// send message
sendMessage ( message );
}
private void sendMessage ( final Message message ) throws MessagingException, NoSuchProviderException
{
final ClassLoader oldClassLoader = Thread.currentThread ().getContextClassLoader ();
Thread.currentThread ().setContextClassLoader ( getClass ().getClassLoader () );
try
{
// commit
message.saveChanges ();
// connect
final Transport transport = this.session.getTransport ();
transport.connect ();
// send
try
{
transport.sendMessage ( message, message.getAllRecipients () );
}
finally
{
// close
transport.close ();
}
}
finally
{
Thread.currentThread ().setContextClassLoader ( oldClassLoader );
}
}
private Message createMessage ( final String to, final String subject ) throws MessagingException, AddressException
{
final MimeMessage message = new MimeMessage ( this.session );
final String from = getString ( "from" );
if ( from != null )
{
message.setFrom ( new InternetAddress ( from ) );
}
else
{
message.setFrom ();
}
// recipient
final InternetAddress recipient = new InternetAddress ();
recipient.setAddress ( to );
message.setRecipient ( javax.mail.Message.RecipientType.TO, recipient );
// mail
final String prefix = getString ( "prefix" );
if ( prefix != null )
{
message.setSubject ( prefix + " " + subject );
}
else
{
message.setSubject ( subject );
}
message.setHeader ( "Return-Path", "<>" );
return message;
}
}