/*
* Copyright 2000-2013 Enonic AS
* http://www.enonic.com/license
*/
package com.enonic.cms.core.mail;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.util.Map;
import javax.mail.MessagingException;
import org.apache.commons.io.IOUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.io.ByteArrayResource;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import com.enonic.cms.core.security.user.QualifiedUsername;
import com.enonic.cms.core.security.user.UserEntity;
import com.enonic.cms.store.dao.UserDao;
public abstract class AbstractSendMailService
{
protected final Logger log;
private JavaMailSender mailSender;
private UserDao userDao;
private static final String MAIL_ENCODING = "UTF-8";
public AbstractSendMailService()
{
this.log = LoggerFactory.getLogger( getClass() );
}
private String fromMail;
public final void setFromMail( String value )
{
this.fromMail = value;
}
public final void sendMail( AbstractMailTemplate template )
throws IOException, MessagingException
{
MessageSettings settings = new MessageSettings();
setFromSettings( template, settings );
settings.setBody( template.getBody() );
final MimeMessageHelper message = createMessage( settings, template.isHtml() || !template.getAttachments().isEmpty() );
message.setSubject( template.getSubject() );
final Map<String,InputStream> attachments = template.getAttachments();
for ( final Map.Entry<String, InputStream> attachment : attachments.entrySet() )
{
message.addAttachment( attachment.getKey(), new ByteArrayResource( IOUtils.toByteArray( attachment.getValue() ) ) );
}
if ( template.isHtml() )
{
message.setText( "[You need html supported mail client to read this email]", template.getBody() );
}
else
{
message.setText( template.getBody() );
}
if ( template.getMailRecipients().size() == 0 )
{
this.log.info( "No recipients specified, mail not sent." );
}
for ( MailRecipient recipient : template.getMailRecipients() )
{
if ( recipient.getEmail() != null )
{
final MailRecipientType type = recipient.getType();
switch ( type )
{
case TO_RECIPIENT:
message.addTo( recipient.getEmail(), recipient.getName() );
break;
case BCC_RECIPIENT:
message.addBcc( recipient.getEmail(), recipient.getName() );
break;
case CC_RECIPIENT:
message.addCc( recipient.getEmail(), recipient.getName() );
break;
default:
throw new RuntimeException( "Unknown recipient type: " + type );
}
}
}
sendMessage( message );
}
private void setFromSettings( AbstractMailTemplate template, MessageSettings settings )
{
MailRecipient fromRecipient = template.getFrom();
if ( fromRecipient != null && fromRecipient.getEmail() != null )
{
settings.setFromMail( fromRecipient.getEmail() );
settings.setFromName( fromRecipient.getName() );
}
else
{
settings.setFromMail( this.fromMail );
settings.setFromName( null );
}
}
public final void sendChangePasswordMail( QualifiedUsername userName, String newPassword )
{
sendChangePasswordMail( userName, newPassword, null );
}
public final void sendChangePasswordMail( QualifiedUsername userName, String newPassword, MessageSettings settings )
{
UserEntity entity = this.userDao.findByQualifiedUsername( userName );
if ( entity != null )
{
sendChangePasswordMail( entity, newPassword, settings );
}
else
{
this.log.warn( "Unknown user [" + userName + "]. Skipped sending mail." );
}
}
private void sendChangePasswordMail( UserEntity user, String newPassword, MessageSettings settings )
{
try
{
settings = createSettingsIfNeeded( settings );
MimeMessageHelper message = createMessage( settings, false );
composeChangePasswordMail( message, user, newPassword, settings );
sendMessage( message );
}
catch ( Exception e )
{
throw new RuntimeException( "Failed to send mail", e );
}
}
private MessageSettings createSettingsIfNeeded( MessageSettings settings )
{
if ( settings == null )
{
settings = new MessageSettings();
}
if ( settings.getFromMail() == null )
{
settings.setFromMail( this.fromMail );
settings.setFromName( null );
}
return settings;
}
private MimeMessageHelper createMessage( MessageSettings settings, boolean multipart )
throws UnsupportedEncodingException, MessagingException
{
final MimeMessageHelper message = new MimeMessageHelper( this.mailSender.createMimeMessage(), multipart, MAIL_ENCODING );
message.setFrom( settings.getFromMail(), settings.getFromName() );
return message;
}
private void sendMessage( MimeMessageHelper message )
{
this.mailSender.send( message.getMimeMessage() );
}
protected abstract void composeChangePasswordMail( MimeMessageHelper message, UserEntity user, String newPassword,
MessageSettings settings )
throws Exception;
public void setMailSender( final JavaMailSender mailSender )
{
this.mailSender = mailSender;
}
public void setUserDao( final UserDao userDao )
{
this.userDao = userDao;
}
}