/** * Copyright 2010 Red Hat, Inc. and/or its affiliates. * * 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 org.jbpm.process.workitem.email; import java.io.File; import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; import java.util.Date; import java.util.List; import java.util.Properties; import javax.activation.DataHandler; import javax.activation.MimetypesFileTypeMap; import javax.mail.Message; import javax.mail.Message.RecipientType; import javax.mail.MessagingException; import javax.mail.Multipart; import javax.mail.PasswordAuthentication; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeBodyPart; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeMultipart; import javax.mail.util.ByteArrayDataSource; import javax.naming.InitialContext; import javax.naming.NamingException; public class SendHtml { private static final String MAIL_JNDI_KEY = System.getProperty("org.kie.mail.session", "mail/jbpmMailSession"); private static boolean debug = Boolean.parseBoolean(System.getProperty("org.kie.mail.debug", "false")); public static void sendHtml(Email email) { sendHtml(email, email.getConnection()); } public static void sendHtml(Email email, boolean debug) { sendHtml(email, email.getConnection(), debug); } public static void sendHtml(Email email, Connection connection) { sendHtml(email, connection, debug); } public static void sendHtml(Email email, Connection connection, boolean debug) { int port = Integer.parseInt(connection.getPort()); String mailhost = connection.getHost(); String username = connection.getUserName(); String password = connection.getPassword(); Session session = getSession(connection); session.setDebug( debug ); try { Message msg = fillMessage(email, session); // send the thing off Transport t = (Transport)session.getTransport("smtp"); try { t.connect(mailhost, port, username, password); t.sendMessage(msg, msg.getAllRecipients()); } catch (Exception e) { throw new RuntimeException( "Connection failure", e ); } finally { t.close(); } } catch ( Exception e ) { throw new RuntimeException( "Unable to send email", e ); } } private static Message fillMessage(Email email, Session session) { org.jbpm.process.workitem.email.Message message = email.getMessage(); String subject = message.getSubject(); String from = message.getFrom(); String replyTo = message.getReplyTo(); String mailer = "sendhtml"; if ( from == null ) { throw new RuntimeException("Email must have 'from' address" ); } if ( replyTo == null ) { replyTo = from; } // Construct and fill the Message Message msg = null; try { msg = new MimeMessage( session ); msg.setFrom( new InternetAddress( from ) ); msg.setReplyTo( new InternetAddress[] { new InternetAddress( replyTo ) } ); for ( Recipient recipient : message.getRecipients().getRecipients() ) { RecipientType type = null; if ( "To".equals( recipient.getType() ) ) { type = Message.RecipientType.TO; } else if ( "Cc".equals( recipient.getType() ) ) { type = Message.RecipientType.CC; } else if ( "Bcc".equals( recipient.getType() ) ) { type = Message.RecipientType.BCC; } else { throw new RuntimeException( "Unable to determine recipient type" ); } msg.addRecipients( type, InternetAddress.parse( recipient.getEmail(), false ) ); } if (message.hasAttachment()) { Multipart multipart = new MimeMultipart(); // prepare body as first mime body part MimeBodyPart messageBodyPart = new MimeBodyPart(); messageBodyPart.setDataHandler( new DataHandler( new ByteArrayDataSource( message.getBody(), "text/html" ) ) ); multipart.addBodyPart(messageBodyPart); List<String> attachments = message.getAttachments(); for (String attachment : attachments) { MimeBodyPart attachementBodyPart = new MimeBodyPart(); URL attachmentUrl = getAttachemntURL(attachment); String contentType = MimetypesFileTypeMap.getDefaultFileTypeMap().getContentType(attachmentUrl.getFile()); attachementBodyPart.setDataHandler(new DataHandler(new ByteArrayDataSource( attachmentUrl.openStream(), contentType ) )); String fileName = new File(attachmentUrl.getFile()).getName(); attachementBodyPart.setFileName(fileName); attachementBodyPart.setContentID("<"+fileName+">"); multipart.addBodyPart(attachementBodyPart); } // Put parts in message msg.setContent(multipart); } else { msg.setDataHandler( new DataHandler( new ByteArrayDataSource( message.getBody(), "text/html" ) ) ); } msg.setSubject( subject ); msg.setHeader( "X-Mailer", mailer ); msg.setSentDate( new Date() ); } catch ( Exception e ) { throw new RuntimeException( "Unable to send email", e ); } return msg; } public static void collect(String body, Message msg) throws MessagingException, IOException { // String subject = msg.getSubject(); StringBuffer sb = new StringBuffer(); // sb.append( "<HTML>\n" ); // sb.append( "<HEAD>\n" ); // sb.append( "<TITLE>\n" ); // sb.append( subject + "\n" ); // sb.append( "</TITLE>\n" ); // sb.append( "</HEAD>\n" ); // sb.append( "<BODY>\n" ); // sb.append( "<H1>" + subject + "</H1>" + "\n" ); sb.append( body ); // sb.append( "</BODY>\n" ); // sb.append( "</HTML>\n" ); } private static Session getSession(Connection connection) { Session session = null; try { session = InitialContext.doLookup(MAIL_JNDI_KEY); } catch (NamingException e1) { String username = connection.getUserName(); String password = connection.getPassword(); Properties properties = new Properties(); properties.setProperty("mail.smtp.host", connection.getHost()); properties.setProperty("mail.smtp.port", connection.getPort()); if( connection.getStartTls() != null && connection.getStartTls() ) { properties.put("mail.smtp.starttls.enable","true"); } if( username != null ) { properties.setProperty("mail.smtp.submitter", username); if( password != null) { Authenticator authenticator = new Authenticator(username, password); properties.setProperty("mail.smtp.auth", "true"); session = Session.getInstance(properties, authenticator); } else { session = Session.getInstance(properties); } } else { session = Session.getInstance(properties); } } return session; } protected static URL getAttachemntURL(String attachment) throws MalformedURLException { if (attachment.startsWith("classpath:")) { String location = attachment.replaceFirst("classpath:", ""); return SendHtml.class.getResource(location); } else { URL attachmentUrl = new URL(attachment); return attachmentUrl; } } private static class Authenticator extends javax.mail.Authenticator { private PasswordAuthentication authentication; public Authenticator(String username, String password) { authentication = new PasswordAuthentication(username, password); } protected PasswordAuthentication getPasswordAuthentication() { return authentication; } } }