001 /** 002 * 003 * Licensed to the Apache Software Foundation (ASF) under one or more 004 * contributor license agreements. See the NOTICE file distributed with 005 * this work for additional information regarding copyright ownership. 006 * The ASF licenses this file to You under the Apache License, Version 2.0 007 * (the "License"); you may not use this file except in compliance with 008 * the License. You may obtain a copy of the License at 009 * 010 * http://www.apache.org/licenses/LICENSE-2.0 011 * 012 * Unless required by applicable law or agreed to in writing, software 013 * distributed under the License is distributed on an "AS IS" BASIS, 014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 015 * See the License for the specific language governing permissions and 016 * limitations under the License. 017 */ 018 package org.apache.camel.component.mail; 019 020 import org.apache.camel.Exchange; 021 import org.apache.camel.converter.ObjectConverter; 022 023 import javax.mail.Address; 024 import javax.mail.Message; 025 import javax.mail.MessagingException; 026 import javax.mail.internet.InternetAddress; 027 import javax.mail.internet.MimeMessage; 028 import java.util.Iterator; 029 import java.util.Map; 030 import java.util.Set; 031 032 /** 033 * A Strategy used to convert between a Camel {@Exchange} and {@Message} to and from a 034 * Mail {@link MimeMessage} 035 * 036 * @version $Revision: 521240 $ 037 */ 038 public class MailBinding { 039 public void populateMailMessage(MailEndpoint endpoint, MimeMessage mimeMessage, Exchange exchange) { 040 try { 041 appendHeadersFromCamel(mimeMessage, exchange, exchange.getIn()); 042 043 String destination = endpoint.getConfiguration().getDestination(); 044 if (destination != null) { 045 mimeMessage.setRecipients(Message.RecipientType.TO, destination); 046 } 047 048 if (empty(mimeMessage.getFrom())) { 049 // lets default the address to the endpoint destination 050 String from = endpoint.getConfiguration().getFrom(); 051 mimeMessage.setFrom(new InternetAddress(from)); 052 } 053 mimeMessage.setText(exchange.getIn().getBody(String.class)); 054 } 055 catch (Exception e) { 056 throw new RuntimeMailException("Failed to populate body due to: " + e + ". Exchange: " + exchange, e); 057 } 058 } 059 060 protected boolean empty(Address[] addresses) { 061 return addresses == null || addresses.length == 0; 062 } 063 064 /** 065 * Extracts the body from the Mail message 066 * 067 * @param exchange 068 * @param message 069 */ 070 public Object extractBodyFromMail(MailExchange exchange, Message message) { 071 try { 072 return message.getContent(); 073 } 074 catch (Exception e) { 075 throw new RuntimeMailException("Failed to extract body due to: " + e + ". Message: " + message, e); 076 } 077 } 078 079 /** 080 * Appends the Mail headers from the Camel {@link MailMessage} 081 */ 082 protected void appendHeadersFromCamel(MimeMessage mimeMessage, Exchange exchange, org.apache.camel.Message camelMessage) throws MessagingException { 083 Set<Map.Entry<String, Object>> entries = camelMessage.getHeaders().entrySet(); 084 for (Map.Entry<String, Object> entry : entries) { 085 String headerName = entry.getKey(); 086 Object headerValue = entry.getValue(); 087 if (headerValue != null) { 088 if (shouldOutputHeader(camelMessage, headerName, headerValue)) { 089 090 // Mail messages can repeat the same header... 091 if (ObjectConverter.isCollection(headerValue)) { 092 Iterator iter = ObjectConverter.iterator(headerValue); 093 while (iter.hasNext()) { 094 Object value = iter.next(); 095 mimeMessage.addHeader(headerName, asString(exchange, value)); 096 } 097 } 098 else { 099 mimeMessage.setHeader(headerName, asString(exchange, headerValue)); 100 } 101 } 102 } 103 } 104 } 105 106 /** 107 * Converts the given object value to a String 108 */ 109 protected String asString(Exchange exchange, Object value) { 110 return exchange.getContext().getTypeConverter().convertTo(String.class, value); 111 } 112 113 /** 114 * Strategy to allow filtering of headers which are put on the Mail message 115 */ 116 protected boolean shouldOutputHeader(org.apache.camel.Message camelMessage, String headerName, Object headerValue) { 117 return true; 118 } 119 }