All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.meltmedia.cadmium.email.TestingMessageTransformer Maven / Gradle / Ivy

/**
 *    Copyright 2012 meltmedia
 *
 *    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 com.meltmedia.cadmium.email;

import java.io.ByteArrayOutputStream;
import java.io.IOException;

import javax.activation.DataHandler;
import javax.mail.Address;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import static org.apache.commons.lang.StringEscapeUtils.escapeHtml;

public class TestingMessageTransformer
  implements MessageTransformer
{
  private static final Logger log = LoggerFactory.getLogger(TestingMessageTransformer.class);

  /** The system property that turns message logging on and off. {@value} */
  public static final String LOG_SYSTEM_PROPERTY = "com.meltmedia.email.test.log";

  /** The system property that turns message sending on and off. {@value} */
  public static final String SEND_SYSTEM_PROPERTY = "com.meltmedia.email.test.send";

  /** The system property for test email to address. {@value} */
  public static final String TO_SYSTEM_PROPERTY = "com.meltmedia.email.test.to";

  /** The system property for test email to address. {@value} */
  public static final String FROM_SYSTEM_PROPERTY = "com.meltmedia.email.test.from";

  /** The system property for test email subjects. {@value} */
  public static final String SUBJECT_SYSTEM_PROPERTY = "com.meltmedia.email.test.subject";

  /** {@value} */
  public static final boolean LOG_DEFAULT_VALUE = true;

  /** {@value} */
  public static final boolean SEND_DEFAULT_VALUE = false;

  /** {@value} */
  public static final String TO_DEFAULT_VALUE = "[email protected]";

  /** {@value} */
  public static final String FROM_DEFAULT_VALUE = "[email protected]";

  /** {@value} */
  public static final String SUBJECT_DEFAULT_VALUE = "[TEST]";

  public static boolean getLogProperty()
  {
    return getBooleanSystemProperty(LOG_SYSTEM_PROPERTY, LOG_DEFAULT_VALUE);
  }

  public static boolean getSendProperty()
  {
    return getBooleanSystemProperty(SEND_SYSTEM_PROPERTY, SEND_DEFAULT_VALUE);
  }

  public static String getToProperty()
  {
    return getStringSystemProperty(TO_SYSTEM_PROPERTY, TO_DEFAULT_VALUE);
  }

  public static String getFromProperty()
  {
    return getStringSystemProperty(FROM_SYSTEM_PROPERTY, FROM_DEFAULT_VALUE);
  }

  public static String getSubjectProperty()
  {
    return getStringSystemProperty(SUBJECT_SYSTEM_PROPERTY, SUBJECT_DEFAULT_VALUE);
  }

  public static boolean getBooleanSystemProperty( String systemProperty, boolean defaultValue )
  {
    String propertyValue = System.getProperty(systemProperty);
    return propertyValue != null ? Boolean.valueOf(propertyValue).booleanValue() : defaultValue;
  }

  public static String getStringSystemProperty( String systemProperty, String defaultValue )
  {
    String propertyValue = System.getProperty(systemProperty);
    return propertyValue != null ? propertyValue : defaultValue;
  }


  public MimeMessage transform( MimeMessage message )
    throws MessagingException
  {
    MimeBodyPart sentToBodyPart = newSentToBodyPart( message );
    MimeBodyPart originalBodyPart = newOriginalBodyPart( message );

    // create a new multipart content for this message.
    MimeMultipart multipart = new MimeMultipart(EmailUtil.SUBTYPE_MIXED);

    // add the parts to the body.
    multipart.addBodyPart(originalBodyPart);
    multipart.addBodyPart(sentToBodyPart);

    // get the new values for all of the headers.
    InternetAddress newFromAddress = newFromAddress(message);
    InternetAddress[] newToAddresses = newToAddresses(message);
    InternetAddress[] newCcAddresses = newCcAddresses(message);
    InternetAddress[] newBccAddresses = newBccAddresses(message);
    String newSubject = newSubject(message);

    // update the message.
    message.setFrom(newFromAddress);
    message.setRecipients(Message.RecipientType.TO, newToAddresses);
    message.setRecipients(Message.RecipientType.CC, newCcAddresses);
    message.setRecipients(Message.RecipientType.BCC, newBccAddresses);
    message.setSubject(newSubject);
    message.setContent(multipart);

    // save the message.
    message.saveChanges();

    if( getLogProperty() ) {
      try {
      ByteArrayOutputStream out = new ByteArrayOutputStream();
      message.writeTo(out);
      log.info("Email Message Sent:\n{}", out.toString());
      }
      catch( IOException ioe ) {
        throw new MessagingException("Exception thrown while writing message to log.", ioe);
      }
    }
    if( !getSendProperty() ) {
      message = null;
    }

    // return the message.
    return message;
  }

  public InternetAddress newFromAddress( MimeMessage message )
    throws MessagingException
  {
    return new InternetAddress(getFromProperty());
  }

  public InternetAddress[] newToAddresses( MimeMessage message )
    throws MessagingException
  {
    return new InternetAddress[] {new InternetAddress(getToProperty())};
  }

  public InternetAddress[] newCcAddresses( MimeMessage message )
    throws MessagingException
  {
    return new InternetAddress[] {};
  }

  public InternetAddress[] newBccAddresses( MimeMessage message )
    throws MessagingException
  {
    return new InternetAddress[] {};
  }

  public String newSubject( MimeMessage message )
    throws MessagingException
  {
    return getSubjectProperty()+message.getSubject();
  }

  public MimeBodyPart newSentToBodyPart( MimeMessage message )
    throws MessagingException
  {
    // get information about the original message.
    Address[] originalFromRecipient = message.getFrom();
    Address[] originalToRecipient = message.getRecipients(Message.RecipientType.TO);
    Address[] originalCcRecipient = message.getRecipients(Message.RecipientType.CC);
    Address[] originalBccRecipient = message.getRecipients(Message.RecipientType.BCC);
    String originalSubject = message.getSubject();

    // create the html for the string buffer.
    StringBuffer html = new StringBuffer();
    html.append("");
    html.append("");

    // iterate over the addresses.
    if( originalFromRecipient != null ) {
      for( int i = 0; i < originalFromRecipient.length; i++ ) {
        html.append("");
      }
    }
    if( originalToRecipient != null ) {
      for( int i = 0; i < originalToRecipient.length; i++ ) {
        html.append("");
      }
    }
    if( originalCcRecipient != null ) {
      for( int i = 0; i < originalCcRecipient.length; i++ ) {
        html.append("");
      }
    }
    if( originalBccRecipient != null ) {
      for( int i = 0; i < originalBccRecipient.length; i++ ) {
        html.append("");
      }
    }
    html.append("
headervalue
Subject:").append(escape(originalSubject)).append("
FROM:").append(escape(originalFromRecipient[i])).append("
TO:").append(escape(originalToRecipient[i])).append("
CC:").append(escape(originalCcRecipient[i])).append("
BCC:").append(escape(originalBccRecipient[i])).append("
"); MimeBodyPart sentToBodyPart = new MimeBodyPart(); sentToBodyPart.setContent(html.toString(), "text/html"); sentToBodyPart.setHeader("Content-ID", "original-addresses"); sentToBodyPart.setDisposition("inline"); return sentToBodyPart; } /** * Executes toString() on the given object and returns the string properly escaped for use in * the original message information section of an email. The string will be properly HTML * escaped and will be replaced with the empty string if null. */ protected String escape(Object o) { return escapeHtml(defaultToString(o)); } private static String defaultToString(Object o) { return o == null? "" : o.toString() == null? "" : o.toString(); } public MimeBodyPart newOriginalBodyPart( MimeMessage message ) throws MessagingException { // get the data handler for this message. DataHandler handler = message.getDataHandler(); // add the original body to the new body part. MimeBodyPart originalPart = new MimeBodyPart(); originalPart.setDataHandler(handler); originalPart.setHeader("Content-ID", "original-message"); return originalPart; } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy