/* * 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; } }