You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicemix.apache.org by lh...@apache.org on 2008/03/06 13:58:14 UTC

svn commit: r634253 [2/3] - in /servicemix/smx3/trunk: ./ archetypes/ archetypes/servicemix-archetypes-itests/ archetypes/servicemix-archetypes-itests/src/test/java/org/apache/servicemix/tooling/ archetypes/servicemix-mail-service-unit/ archetypes/serv...

Added: servicemix/smx3/trunk/deployables/bindingcomponents/servicemix-mail/src/main/java/org/apache/servicemix/mail/marshaler/DefaultMailMarshaler.java
URL: http://svn.apache.org/viewvc/servicemix/smx3/trunk/deployables/bindingcomponents/servicemix-mail/src/main/java/org/apache/servicemix/mail/marshaler/DefaultMailMarshaler.java?rev=634253&view=auto
==============================================================================
--- servicemix/smx3/trunk/deployables/bindingcomponents/servicemix-mail/src/main/java/org/apache/servicemix/mail/marshaler/DefaultMailMarshaler.java (added)
+++ servicemix/smx3/trunk/deployables/bindingcomponents/servicemix-mail/src/main/java/org/apache/servicemix/mail/marshaler/DefaultMailMarshaler.java Thu Mar  6 04:58:09 2008
@@ -0,0 +1,561 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.apache.servicemix.mail.marshaler;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.text.DateFormat;
+import java.util.Enumeration;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+
+import javax.activation.DataHandler;
+import javax.activation.DataSource;
+import javax.jbi.messaging.MessageExchange;
+import javax.jbi.messaging.MessagingException;
+import javax.jbi.messaging.NormalizedMessage;
+import javax.mail.Address;
+import javax.mail.BodyPart;
+import javax.mail.Header;
+import javax.mail.Message;
+import javax.mail.Multipart;
+import javax.mail.Part;
+import javax.mail.internet.InternetAddress;
+import javax.mail.internet.MimeBodyPart;
+import javax.mail.internet.MimeMessage;
+import javax.mail.internet.MimeMultipart;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.servicemix.jbi.jaxp.SourceTransformer;
+import org.apache.servicemix.jbi.jaxp.StringSource;
+import org.apache.servicemix.jbi.util.ByteArrayDataSource;
+
+/**
+ * this is the default marshaler for conversion between the normalized message
+ * format and the mail message format
+ * 
+ * @author lhein
+ */
+public class DefaultMailMarshaler extends AbstractMailMarshaler {
+    private static Log log = LogFactory.getLog(DefaultMailMarshaler.class);
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see net.compart.jbi.mail.AMailMarshallerSupport#convertMailToJBI(javax.jbi.messaging.MessageExchange,
+     *      javax.jbi.messaging.NormalizedMessage, javax.mail.internet.MimeMessage)
+     */
+    @Override
+    public void convertMailToJBI(MessageExchange exchange, NormalizedMessage nmsg, MimeMessage mailMsg)
+        throws javax.mail.MessagingException {
+        // copy headers
+        copyHeaders(exchange, nmsg, mailMsg);
+
+        // now copy the mail body and the attachments
+        copyBodyAndAttachments(exchange, nmsg, mailMsg);
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see net.compart.jbi.mail.AMailMarshallerSupport#convertJBIToMail(javax.mail.internet.MimeMessage,
+     *      javax.jbi.messaging.MessageExchange, javax.jbi.messaging.NormalizedMessage, String)
+     */
+    @Override
+    public void convertJBIToMail(MimeMessage mimeMessage, MessageExchange exchange, NormalizedMessage nmsg, String configuredSender)
+        throws javax.mail.MessagingException {
+        try {
+            // first fill the headers of the mail
+            fillMailHeaders(mimeMessage, exchange, nmsg, configuredSender);
+
+            // fill the body and attachments
+            fillMailBodyAndAttachments(mimeMessage, exchange, nmsg);
+        } catch (Exception ex) {
+            throw new javax.mail.MessagingException(ex.getMessage(), ex);
+        }
+    }
+
+    /**
+     * fills all attachments from the normalized message into the mail message
+     * 
+     * @param mimeMessage the mail message to fill
+     * @param exchange the received exchange
+     * @param nmsg the normalized message received
+     * @throws Exception on any errors
+     */
+    protected void fillMailBodyAndAttachments(MimeMessage mimeMessage, MessageExchange exchange,
+                                              NormalizedMessage nmsg) throws Exception {
+        // extract all attachments from the normalized message into a map
+        Map<String, DataSource> attachments = getAttachmentsMapFromNormalizedMessage(nmsg);
+
+        // if there are attachments, then a multipart mime mail with
+        // attachments will be sent
+        if (attachments.size() > 0) {
+            Set<String> attNames = attachments.keySet();
+            Iterator<String> itAttNames = attNames.iterator();
+
+            if (itAttNames.hasNext()) {
+                // there is at least one attachment
+
+                // Create a Multipart
+                MimeMultipart multipart = new MimeMultipart();
+
+                // fill the body with text, html or both
+                fillMailBody(mimeMessage, exchange, nmsg, multipart);
+
+                BodyPart messageBodyPart = null;
+
+                // loop the existing attachments and put them to the mail
+                while (itAttNames.hasNext()) {
+                    String oneAttachmentName = itAttNames.next();
+                    // Create another body part
+                    messageBodyPart = new MimeBodyPart();
+                    // Set the data handler to the attachment
+                    messageBodyPart.setDataHandler(new DataHandler(attachments.get(oneAttachmentName)));
+                    // Set the filename
+                    messageBodyPart.setFileName(oneAttachmentName);
+                    // Set Disposition
+                    messageBodyPart.setDisposition(Part.ATTACHMENT);
+                    // Add part to multipart
+                    multipart.addBodyPart(messageBodyPart);
+                }
+                // Put parts in message
+                mimeMessage.setContent(multipart);
+            }
+        } else {
+            // fill the body with text, html or both
+            fillMailBody(mimeMessage, exchange, nmsg, null);
+        }
+    }
+
+    /**
+     * fills the body of the mail
+     * 
+     * @param mimeMessage the mail message
+     * @param exchange the jbi exchange
+     * @param nmsg the normalized message
+     * @param content the content of a multipart to use or null
+     * @throws Exception on errors
+     */
+    protected void fillMailBody(MimeMessage mimeMessage, MessageExchange exchange, NormalizedMessage nmsg,
+                                MimeMultipart content) throws Exception {
+        // check if we are going to send a plain text mail or html or both
+        boolean isPlainTextMessage = nmsg.getProperty(AbstractMailMarshaler.MSG_TAG_TEXT) != null;
+        boolean isHtmlMessage = nmsg.getProperty(AbstractMailMarshaler.MSG_TAG_HTML) != null;
+
+        if (isPlainTextMessage && !isHtmlMessage) {
+            // a plain text mail will be sent - no attachments
+            if (content != null) {
+                content.setSubType("alternative");
+                MimeBodyPart textBodyPart = new MimeBodyPart();
+                textBodyPart.setContent(nmsg.getProperty(AbstractMailMarshaler.MSG_TAG_TEXT).toString(),
+                                        "text/plain");
+                content.addBodyPart(textBodyPart);
+            } else {
+                mimeMessage.setText(nmsg.getProperty(AbstractMailMarshaler.MSG_TAG_TEXT).toString());
+            }
+        } else if (isHtmlMessage && !isPlainTextMessage) {
+            // a html message will be sent - no attachments
+            if (content != null) {
+                content.setSubType("alternative");
+                MimeBodyPart htmlBodyPart = new MimeBodyPart();
+                htmlBodyPart.setContent(nmsg.getProperty(AbstractMailMarshaler.MSG_TAG_HTML).toString(),
+                                        "text/html");
+                content.addBodyPart(htmlBodyPart);
+            } else {
+                content = new MimeMultipart("alternative");
+                MimeBodyPart htmlBodyPart = new MimeBodyPart();
+                htmlBodyPart.setContent(nmsg.getProperty(AbstractMailMarshaler.MSG_TAG_HTML).toString(),
+                                        "text/html");
+                content.addBodyPart(htmlBodyPart);
+                // Put parts in message
+                mimeMessage.setContent(content);
+            }
+        } else if (isHtmlMessage && isPlainTextMessage) {
+            // both parts will be sent - plain text and html
+            if (content != null) {
+                content.setSubType("alternative");
+                MimeBodyPart textBodyPart = new MimeBodyPart();
+                MimeBodyPart htmlBodyPart = new MimeBodyPart();
+                textBodyPart.setContent(nmsg.getProperty(AbstractMailMarshaler.MSG_TAG_TEXT).toString(),
+                                        "text/plain");
+                htmlBodyPart.setContent(nmsg.getProperty(AbstractMailMarshaler.MSG_TAG_HTML).toString(),
+                                        "text/html");
+                content.addBodyPart(textBodyPart);
+                content.addBodyPart(htmlBodyPart);
+            } else {
+                content = new MimeMultipart("alternative");
+                MimeBodyPart textBodyPart = new MimeBodyPart();
+                MimeBodyPart htmlBodyPart = new MimeBodyPart();
+                textBodyPart.setContent(nmsg.getProperty(AbstractMailMarshaler.MSG_TAG_TEXT).toString(),
+                                        "text/plain");
+                htmlBodyPart.setContent(nmsg.getProperty(AbstractMailMarshaler.MSG_TAG_HTML).toString(),
+                                        "text/html");
+                content.addBodyPart(textBodyPart);
+                content.addBodyPart(htmlBodyPart);
+                // Put parts in message
+                mimeMessage.setContent(content);
+            }
+        } else {
+            // use the content of the message
+            SourceTransformer st = new SourceTransformer();
+            try {
+                st.toDOMDocument(nmsg);
+
+                // a html message will be sent
+                if (content != null) {
+                    content.setSubType("alternative");
+                    MimeBodyPart htmlBodyPart = new MimeBodyPart();
+                    htmlBodyPart.setContent(st.contentToString(nmsg), "text/html");
+                    content.addBodyPart(htmlBodyPart);
+                } else {
+                    content = new MimeMultipart("alternative");
+                    MimeBodyPart htmlBodyPart = new MimeBodyPart();
+                    htmlBodyPart.setContent(st.contentToString(nmsg), "text/html");
+                    content.addBodyPart(htmlBodyPart);
+                    // Put parts in message
+                    mimeMessage.setContent(content);
+                }
+            } catch (Exception ex) {
+                // no xml document - plain text used now
+                if (content != null) {
+                    content.setSubType("alternative");
+                    MimeBodyPart textBodyPart = new MimeBodyPart();
+                    textBodyPart.setContent(st.contentToString(nmsg), "text/plain");
+                    content.addBodyPart(textBodyPart);
+                } else {
+                    // Put text in message
+                    mimeMessage.setText(st.contentToString(nmsg));
+                }
+            }
+        }
+    }
+
+    /**
+     * fills the mail headers according to the normalized message headers
+     * 
+     * @param mimeMessage the mail message to fill
+     * @param exchange the exchange received
+     * @param nmsg the normalized message received
+     * @param configuredSender the configured sender from xbean
+     * @throws Exception on errors
+     */
+    protected void fillMailHeaders(MimeMessage mimeMessage, MessageExchange exchange, NormalizedMessage nmsg, String configuredSender)
+        throws Exception {
+        // fill the "To" field of the mail
+        if (nmsg.getProperty(AbstractMailMarshaler.MSG_TAG_TO) != null) {
+            Address[] to = InternetAddress.parse(nmsg.getProperty(AbstractMailMarshaler.MSG_TAG_TO)
+                .toString());
+            if (to != null) {
+                mimeMessage.setRecipients(Message.RecipientType.TO, to);
+            }
+        }
+
+        // fill the "Cc" field of the mail
+        if (nmsg.getProperty(AbstractMailMarshaler.MSG_TAG_CC) != null) {
+            Address[] cc = InternetAddress.parse(nmsg.getProperty(AbstractMailMarshaler.MSG_TAG_CC)
+                .toString());
+            if (cc != null) {
+                mimeMessage.setRecipients(Message.RecipientType.CC, cc);
+            }
+        }
+
+        // fill the "Bcc" field of the mail
+        if (nmsg.getProperty(AbstractMailMarshaler.MSG_TAG_BCC) != null) {
+            Address[] bcc = InternetAddress.parse(nmsg.getProperty(AbstractMailMarshaler.MSG_TAG_BCC)
+                .toString());
+            if (bcc != null) {
+                mimeMessage.setRecipients(Message.RecipientType.BCC, bcc);
+            }
+        }
+
+        // fill the "From" field of the mail
+        if (configuredSender != null && configuredSender.trim().length() > 0) {
+            // if sender is configured through xbean then use it
+            Address from = InternetAddress.parse(configuredSender)[0];
+            if (from != null) {
+                mimeMessage.setFrom(from);
+            }
+        } else if (nmsg.getProperty(AbstractMailMarshaler.MSG_TAG_FROM) != null) {
+            // use the delivered From field from the message
+            Address from = InternetAddress.parse(nmsg.getProperty(AbstractMailMarshaler.MSG_TAG_FROM)
+                .toString())[0];
+            if (from != null) {
+                mimeMessage.setFrom(from);
+            }
+        } else {
+            // there was no From field delivered, so use the default sender
+            Address from = InternetAddress.parse(getDefaultSenderForOutgoingMails())[0];
+            if (from != null) {
+                mimeMessage.setFrom(from);
+            }
+        }
+
+        // fill the "Subject" field of the mail
+        if (nmsg.getProperty(AbstractMailMarshaler.MSG_TAG_SUBJECT) != null) {
+            String subject = nmsg.getProperty(AbstractMailMarshaler.MSG_TAG_SUBJECT).toString();
+            if (subject != null) {
+                mimeMessage.setSubject(subject);
+            }
+        }
+
+        // fill the "Date" field of the mail
+        if (nmsg.getProperty(AbstractMailMarshaler.MSG_TAG_SENTDATE) != null) {
+            String sentDate = nmsg.getProperty(AbstractMailMarshaler.MSG_TAG_SENTDATE).toString();
+            if (sentDate != null) {
+                mimeMessage.setSentDate(DateFormat.getInstance().parse(sentDate));
+            }
+        }
+
+        // fill the "Reply-To" field of the mail
+        if (nmsg.getProperty(AbstractMailMarshaler.MSG_TAG_REPLYTO) != null) {
+            Address[] replyTo = InternetAddress.parse(nmsg.getProperty(AbstractMailMarshaler.MSG_TAG_REPLYTO)
+                .toString());
+            if (replyTo != null) {
+                mimeMessage.setReplyTo(replyTo);
+            }
+        }
+    }
+
+    /**
+     * copy the headers of the mail message into the normalized message headers
+     * 
+     * @param exchange the exchange to use
+     * @param nmsg the message to use
+     * @param mailMsg the mail message
+     * @throws javax.mail.MessagingException on any errors
+     */
+    protected void copyHeaders(MessageExchange exchange, NormalizedMessage nmsg, MimeMessage mailMsg)
+        throws javax.mail.MessagingException {
+        // first convert the headers of the mail to properties of the message
+        Enumeration headers = mailMsg.getAllHeaders();
+        while (headers.hasMoreElements()) {
+            Header header = (Header)headers.nextElement();
+            if (nmsg.getProperty(header.getName()) != null) {
+                // this is a multi line header - add it at the end
+                nmsg.setProperty(header.getName(), nmsg.getProperty(header.getName() + ";"
+                                                                    + header.getValue()));
+            } else {
+                // add it to the message properties
+                nmsg.setProperty(header.getName(), header.getValue());
+            }
+            log.debug("Setting property: " + header.getName() + " = " + header.getValue());
+        }
+
+        // now fill some predefined properties to the message
+        if (nmsg.getProperty(AbstractMailMarshaler.MAIL_TAG_BCC) != null) {
+            nmsg.setProperty(AbstractMailMarshaler.MSG_TAG_BCC, nmsg
+                .getProperty(AbstractMailMarshaler.MAIL_TAG_BCC));
+        }
+        if (nmsg.getProperty(AbstractMailMarshaler.MAIL_TAG_CC) != null) {
+            nmsg.setProperty(AbstractMailMarshaler.MSG_TAG_CC, nmsg
+                .getProperty(AbstractMailMarshaler.MAIL_TAG_CC));
+        }
+        if (nmsg.getProperty(AbstractMailMarshaler.MAIL_TAG_FROM) != null) {
+            nmsg.setProperty(AbstractMailMarshaler.MSG_TAG_FROM, nmsg
+                .getProperty(AbstractMailMarshaler.MAIL_TAG_FROM));
+        }
+        if (nmsg.getProperty(AbstractMailMarshaler.MAIL_TAG_REPLYTO) != null) {
+            nmsg.setProperty(AbstractMailMarshaler.MSG_TAG_REPLYTO, nmsg
+                .getProperty(AbstractMailMarshaler.MAIL_TAG_REPLYTO));
+        }
+        if (nmsg.getProperty(AbstractMailMarshaler.MAIL_TAG_SENTDATE) != null) {
+            nmsg.setProperty(AbstractMailMarshaler.MSG_TAG_SENTDATE, nmsg
+                .getProperty(AbstractMailMarshaler.MAIL_TAG_SENTDATE));
+        }
+        if (nmsg.getProperty(AbstractMailMarshaler.MAIL_TAG_SUBJECT) != null) {
+            nmsg.setProperty(AbstractMailMarshaler.MSG_TAG_SUBJECT, nmsg
+                .getProperty(AbstractMailMarshaler.MAIL_TAG_SUBJECT));
+        }
+        if (nmsg.getProperty(AbstractMailMarshaler.MAIL_TAG_TO) != null) {
+            nmsg.setProperty(AbstractMailMarshaler.MSG_TAG_TO, nmsg
+                .getProperty(AbstractMailMarshaler.MAIL_TAG_TO));
+        }
+    }
+
+    /**
+     * copies the mail body and attachments to the normalized message
+     * 
+     * @param exchange the exchange to use
+     * @param nmsg the message to use
+     * @param mailMsg the mail to use
+     * @throws javax.mail.MessagingException on any errors
+     */
+    protected void copyBodyAndAttachments(MessageExchange exchange, NormalizedMessage nmsg,
+                                          MimeMessage mailMsg) throws javax.mail.MessagingException {
+        // now convert the mail body and attachments and put it to the msg
+        Multipart mp;
+        Object content;
+        Multipart subMP;
+        String text = null;
+        String html = null;
+
+        try {
+            content = mailMsg.getContent();
+
+            if (content instanceof String) {
+                // simple mail
+                text = asString(content);
+            } else if (content instanceof Multipart) {
+                // mail with attachment
+                mp = (Multipart)content;
+                int nbMP = mp.getCount();
+                log.debug("MultiPart count: " + nbMP);
+                for (int i = 0; i < nbMP; i++) {
+                    Part part = mp.getBodyPart(i);
+                    String disposition = part.getDisposition();
+
+                    log.debug("MultiPart " + i + ": " + part);
+                    log.debug("Disposition: " + disposition);
+
+                    if (disposition != null
+                        && (disposition.equalsIgnoreCase(Part.ATTACHMENT) || disposition
+                            .equalsIgnoreCase(Part.INLINE))) {
+                        // only add named attachments
+                        if (part.getFileName() != null) {
+                            // Parts marked with a disposition of Part.ATTACHMENT
+                            // from part.getDisposition() are clearly attachments
+                            DataHandler att = part.getDataHandler();
+                            // this is clearly a attachment
+                            nmsg.addAttachment(att.getName(), att);
+                        } else {
+                            // inline part without name?
+                            text = part.getContent() != null ? part.getContent().toString() : "null";
+                        }
+                    } else if (disposition == null) {
+                        // Check if plain
+                        MimeBodyPart mbp = (MimeBodyPart)part;
+                        if (mbp.isMimeType("text/plain")) {
+                            // Handle plain text
+                            text = (String)mbp.getContent();
+                        } else if (mbp.isMimeType("text/html")) {
+                            // Handle html contents
+                            html = (String)mbp.getContent();
+                        } else {
+                            // Special non-attachment cases (image/gif, ...)
+                            if (mbp.getContent() instanceof MimeMultipart) {
+                                subMP = (MimeMultipart)mbp.getContent();
+                                int nbsubMP = subMP.getCount();
+                                for (int j = 0; j < nbsubMP; j++) {
+                                    MimeBodyPart subMBP = (MimeBodyPart)subMP.getBodyPart(j);
+
+                                    if (subMBP.getContent() instanceof InputStream) {
+                                        // parse the part
+                                        parsePart(subMBP, nmsg);
+                                    } else if (subMBP.isMimeType("text/plain")
+                                               && (text == null || text.length() <= 0)) {
+                                        // Handle plain text
+                                        text = (String)subMBP.getContent();
+                                    } else if (subMBP.isMimeType("text/html")
+                                               && (html == null || html.length() <= 0)) {
+                                        // Handle plain text
+                                        html = (String)subMBP.getContent();
+                                    } else {
+                                        // add as property into the normalize message
+                                        nmsg.setProperty(AbstractMailMarshaler.MSG_TAG_ALTERNATIVE_CONTENT
+                                                         + j, subMBP.getContent());
+                                    }
+                                }
+                            } else {
+                                // parse the part
+                                parsePart(mbp, nmsg);
+                            }
+                        }
+                    }
+                }
+            } else { // strange mail structure...log a warning
+                log.warn("The content of the mail message is not supported by this component. ("
+                         + content.getClass().getName() + ")");
+            }
+        } catch (MessagingException e) {
+            throw new javax.mail.MessagingException("Error while setting content on normalized message", e);
+        } catch (IOException e) {
+            throw new javax.mail.MessagingException("Error while fetching content", e);
+        }
+
+        String msgContent = null;
+
+        if (text == null && html != null) {
+            // html mail body
+            msgContent = html;
+            nmsg.setProperty(AbstractMailMarshaler.MSG_TAG_HTML, html);
+        } else if (text != null && html != null) {
+            // both text and html
+            msgContent = text;
+            nmsg.setProperty(AbstractMailMarshaler.MSG_TAG_HTML, html);
+            nmsg.setProperty(AbstractMailMarshaler.MSG_TAG_TEXT, text);
+        } else {
+            // text mail body
+            if (text == null) {
+                // text and html content is null
+                log.debug("No content found! \n" + nmsg.toString());
+            }
+
+            msgContent = text;
+            nmsg.setProperty(AbstractMailMarshaler.MSG_TAG_TEXT, text);
+        }
+
+        try {
+            // now set the converted content for the normalized message
+            nmsg.setContent(new StringSource(msgContent != null ? msgContent : "No mail content found!"));
+        } catch (javax.jbi.messaging.MessagingException e) {
+            throw new javax.mail.MessagingException("Error while setting message content", e);
+        }
+    }
+
+    /**
+     * extracts and parses the attachments found in the mail bodies and puts 
+     * them to the normalized message attachments
+     * 
+     * @param mbp           the mime body part to parse
+     * @param nmsg          the normalized message to fill
+     * @throws MessagingException
+     * @throws javax.mail.MessagingException
+     * @throws IOException
+     */
+    protected void parsePart(MimeBodyPart mbp, NormalizedMessage nmsg) throws MessagingException,
+        javax.mail.MessagingException, IOException {
+        Object subContent = mbp.getContent();
+
+        log.debug("Parsing: " + subContent.getClass().getName());
+
+        if (subContent instanceof InputStream) {
+            String altName = mbp.getContentID() + "."
+                             + mbp.getContentType().substring(mbp.getContentType().lastIndexOf('/') + 1);
+            altName = altName.replaceAll("<", "").replaceAll(">", "").toLowerCase();
+
+            log.debug("Adding special attachment: "
+                      + (mbp.getFileName() != null ? mbp.getFileName() : altName));
+
+            // read the stream into a byte array
+            byte[] data = new byte[mbp.getSize()];
+            InputStream stream = (InputStream)subContent;
+            stream.read(data);
+
+            // create a byte array data source for use in data handler
+            ByteArrayDataSource bads = new ByteArrayDataSource(data, mbp.getContentType());
+
+            // remember the name of the attachment
+            bads.setName(mbp.getFileName() != null ? mbp.getFileName() : altName);
+
+            // add the attachment to the message
+            nmsg.addAttachment(bads.getName(), new DataHandler(bads));
+        }
+    }
+}

Added: servicemix/smx3/trunk/deployables/bindingcomponents/servicemix-mail/src/main/java/org/apache/servicemix/mail/package.html
URL: http://svn.apache.org/viewvc/servicemix/smx3/trunk/deployables/bindingcomponents/servicemix-mail/src/main/java/org/apache/servicemix/mail/package.html?rev=634253&view=auto
==============================================================================
--- servicemix/smx3/trunk/deployables/bindingcomponents/servicemix-mail/src/main/java/org/apache/servicemix/mail/package.html (added)
+++ servicemix/smx3/trunk/deployables/bindingcomponents/servicemix-mail/src/main/java/org/apache/servicemix/mail/package.html Thu Mar  6 04:58:09 2008
@@ -0,0 +1,27 @@
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You 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.
+
+-->
+<html>
+<head>
+</head>
+<body>
+
+Component for Mail using the JavaMail API
+
+</body>
+</html>

Added: servicemix/smx3/trunk/deployables/bindingcomponents/servicemix-mail/src/main/java/org/apache/servicemix/mail/security/CustomSSLSocketFactory.java
URL: http://svn.apache.org/viewvc/servicemix/smx3/trunk/deployables/bindingcomponents/servicemix-mail/src/main/java/org/apache/servicemix/mail/security/CustomSSLSocketFactory.java?rev=634253&view=auto
==============================================================================
--- servicemix/smx3/trunk/deployables/bindingcomponents/servicemix-mail/src/main/java/org/apache/servicemix/mail/security/CustomSSLSocketFactory.java (added)
+++ servicemix/smx3/trunk/deployables/bindingcomponents/servicemix-mail/src/main/java/org/apache/servicemix/mail/security/CustomSSLSocketFactory.java Thu Mar  6 04:58:09 2008
@@ -0,0 +1,181 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.apache.servicemix.mail.security;
+
+import java.io.IOException;
+import java.net.InetAddress;
+import java.net.Socket;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.StringTokenizer;
+
+import javax.net.SocketFactory;
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLSocketFactory;
+import javax.net.ssl.TrustManager;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+/**
+ * CustomSSLSocketFactory providing no security at all
+ */
+public class CustomSSLSocketFactory extends SSLSocketFactory {
+    /**
+     * the content of this property will be used to initialize the list
+     * of trust managers for this SSL Socket Factory
+     */
+    public static final String PROPERTY_TRUSTMANAGERS = "custom-trust-managers";
+
+    /**
+     * this is the separator char for concatenating several managers
+     */
+    public static final String PROPERTY_SEPARATOR = ";";
+
+    private static final Log LOG = LogFactory.getLog(CustomSSLSocketFactory.class);
+
+    private SSLSocketFactory factory;
+
+    /**
+     * default constructor
+     */
+    public CustomSSLSocketFactory() {
+        try {
+            SSLContext sslcontext = SSLContext.getInstance("TLS");
+            if (System.getProperty(PROPERTY_TRUSTMANAGERS) != null
+                && System.getProperty(PROPERTY_TRUSTMANAGERS).trim().length() > 0) {
+                // use customized trust managers
+                sslcontext.init(null, getTrustManagers(), new java.security.SecureRandom());
+            } else {
+                // use defaults
+                sslcontext.init(null, null, null);
+            }
+            factory = (SSLSocketFactory)sslcontext.getSocketFactory();
+        } catch (Exception ex) {
+            LOG.error("Failed to create the dummy ssl socket factory.", ex);
+        }
+    }
+
+    /**
+     * prepares the trustmanagers to use
+     * 
+     * @return  an array of  trust managers
+     */
+    private TrustManager[] getTrustManagers() {
+        List<TrustManager> managers = new ArrayList<TrustManager>();
+
+        // look for trust managers in the system properties
+        String managersString = System.getProperty(PROPERTY_TRUSTMANAGERS);
+        if (managersString != null && managersString.trim().length() > 0) {
+            StringTokenizer strTok = new StringTokenizer(managersString, PROPERTY_SEPARATOR);
+            while (strTok.hasMoreTokens()) {
+                String name = strTok.nextToken();
+                try {
+                    Object tm = Class.forName(name).newInstance();
+                    if (tm instanceof TrustManager) {
+                        managers.add((TrustManager)tm);
+                    } else {
+                        LOG.error("Customized trust manager " + name
+                                  + " is not implementing TrustManager. Skipping...");
+                    }
+                } catch (IllegalAccessException iaex) {
+                    LOG.error("Customized trust manager " + name + " is not accessable. Skipping...", iaex);
+                } catch (InstantiationException iex) {
+                    LOG.error("Customized trust manager " + name + " could not be instantiated. Skipping...",
+                              iex);
+                } catch (ClassNotFoundException cnfex) {
+                    LOG.error("Customized trust manager " + name + " was not found. Skipping...", cnfex);
+                }
+            }
+        }
+
+        return managers.toArray(new TrustManager[managers.size()]);
+    }
+
+    /**
+     * returns a new instance of this factory
+     * 
+     * @return a new factory instance
+     */
+    public static SocketFactory getDefault() {
+        return new CustomSSLSocketFactory();
+    }
+
+    /*
+     * (non-Javadoc)
+     * @see javax.net.ssl.SSLSocketFactory#createSocket(java.net.Socket, java.lang.String, int, boolean)
+     */
+    public Socket createSocket(Socket socket, String s, int i, boolean flag) throws IOException {
+        return factory.createSocket(socket, s, i, flag);
+    }
+
+    /*
+     * (non-Javadoc)
+     * @see javax.net.SocketFactory#createSocket()
+     */
+    public Socket createSocket() throws IOException {
+        return factory.createSocket();
+    }
+
+    /*
+     * (non-Javadoc)
+     * @see javax.net.SocketFactory#createSocket(java.net.InetAddress, int, java.net.InetAddress, int)
+     */
+    public Socket createSocket(InetAddress inaddr, int i, InetAddress inaddr1, int j) throws IOException {
+        return factory.createSocket(inaddr, i, inaddr1, j);
+    }
+
+    /*
+     * (non-Javadoc)
+     * @see javax.net.SocketFactory#createSocket(java.net.InetAddress, int)
+     */
+    public Socket createSocket(InetAddress inaddr, int i) throws IOException {
+        return factory.createSocket(inaddr, i);
+    }
+
+    /*
+     * (non-Javadoc)
+     * @see javax.net.SocketFactory#createSocket(java.lang.String, int, java.net.InetAddress, int)
+     */
+    public Socket createSocket(String s, int i, InetAddress inaddr, int j) throws IOException {
+        return factory.createSocket(s, i, inaddr, j);
+    }
+
+    /*
+     * (non-Javadoc)
+     * @see javax.net.SocketFactory#createSocket(java.lang.String, int)
+     */
+    public Socket createSocket(String s, int i) throws IOException {
+        return factory.createSocket(s, i);
+    }
+
+    /*
+     * (non-Javadoc)
+     * @see javax.net.ssl.SSLSocketFactory#getDefaultCipherSuites()
+     */
+    public String[] getDefaultCipherSuites() {
+        return factory.getSupportedCipherSuites();
+    }
+
+    /*
+     * (non-Javadoc)
+     * @see javax.net.ssl.SSLSocketFactory#getSupportedCipherSuites()
+     */
+    public String[] getSupportedCipherSuites() {
+        return factory.getSupportedCipherSuites();
+    }
+}

Added: servicemix/smx3/trunk/deployables/bindingcomponents/servicemix-mail/src/main/java/org/apache/servicemix/mail/security/DummyTrustManager.java
URL: http://svn.apache.org/viewvc/servicemix/smx3/trunk/deployables/bindingcomponents/servicemix-mail/src/main/java/org/apache/servicemix/mail/security/DummyTrustManager.java?rev=634253&view=auto
==============================================================================
--- servicemix/smx3/trunk/deployables/bindingcomponents/servicemix-mail/src/main/java/org/apache/servicemix/mail/security/DummyTrustManager.java (added)
+++ servicemix/smx3/trunk/deployables/bindingcomponents/servicemix-mail/src/main/java/org/apache/servicemix/mail/security/DummyTrustManager.java Thu Mar  6 04:58:09 2008
@@ -0,0 +1,50 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.apache.servicemix.mail.security;
+
+import java.security.cert.X509Certificate;
+
+import javax.net.ssl.X509TrustManager;
+
+/**
+ * DummyTrustManager - NOT SECURE
+ */
+public class DummyTrustManager implements X509TrustManager {
+    /*
+     * (non-Javadoc)
+     * @see javax.net.ssl.X509TrustManager#checkClientTrusted(java.security.cert.X509Certificate[], java.lang.String)
+     */
+    public void checkClientTrusted(X509Certificate[] cert, String authType) {
+        // everything is trusted
+    }
+
+    /*
+     * (non-Javadoc)
+     * @see javax.net.ssl.X509TrustManager#checkServerTrusted(java.security.cert.X509Certificate[], java.lang.String)
+     */
+    public void checkServerTrusted(X509Certificate[] cert, String authType) {
+        // everything is trusted
+    }
+
+    /*
+     * (non-Javadoc)
+     * @see javax.net.ssl.X509TrustManager#getAcceptedIssuers()
+     */
+    public X509Certificate[] getAcceptedIssuers() {
+        return new X509Certificate[0];
+    }
+}

Added: servicemix/smx3/trunk/deployables/bindingcomponents/servicemix-mail/src/main/java/org/apache/servicemix/mail/utils/MailConnectionConfiguration.java
URL: http://svn.apache.org/viewvc/servicemix/smx3/trunk/deployables/bindingcomponents/servicemix-mail/src/main/java/org/apache/servicemix/mail/utils/MailConnectionConfiguration.java?rev=634253&view=auto
==============================================================================
--- servicemix/smx3/trunk/deployables/bindingcomponents/servicemix-mail/src/main/java/org/apache/servicemix/mail/utils/MailConnectionConfiguration.java (added)
+++ servicemix/smx3/trunk/deployables/bindingcomponents/servicemix-mail/src/main/java/org/apache/servicemix/mail/utils/MailConnectionConfiguration.java Thu Mar  6 04:58:09 2008
@@ -0,0 +1,149 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.apache.servicemix.mail.utils;
+
+import javax.mail.Authenticator;
+import javax.mail.PasswordAuthentication;
+
+/**
+ * a data holder class for the connection information
+ * 
+ * @author lhein
+ */
+public class MailConnectionConfiguration {
+    private String host;
+    private String password;
+    private String protocol;
+    private String username;
+    private String folderName = "INBOX";
+
+    private int port = -1;
+
+    /**
+     * @return the host
+     */
+    public String getHost() {
+        return this.host;
+    }
+
+    /**
+     * @param host the host to set
+     */
+    public void setHost(String host) {
+        this.host = host;
+    }
+
+    /**
+     * @return the password
+     */
+    public String getPassword() {
+        return this.password;
+    }
+
+    /**
+     * @param password the password to set
+     */
+    public void setPassword(String password) {
+        this.password = password;
+    }
+
+    /**
+     * @return the protocol
+     */
+    public String getProtocol() {
+        return this.protocol.toLowerCase();
+    }
+
+    /**
+     * @param protocol the protocol to set
+     */
+    public void setProtocol(String protocol) {
+        this.protocol = protocol;
+    }
+
+    /**
+     * @return the username
+     */
+    public String getUsername() {
+        return this.username;
+    }
+
+    /**
+     * @param username the username to set
+     */
+    public void setUsername(String username) {
+        this.username = username;
+    }
+
+    /**
+     * @return the folderName
+     */
+    public String getFolderName() {
+        return this.folderName;
+    }
+
+    /**
+     * @param folderName the folderName to set
+     */
+    public void setFolderName(String folderName) {
+        this.folderName = folderName;
+    }
+
+    /**
+     * @return the port
+     */
+    public int getPort() {
+        return this.port;
+    }
+
+    /**
+     * @param port the port to set
+     */
+    public void setPort(int port) {
+        this.port = port;
+    }
+
+    /**
+     * flags the used protocol to be secure or not
+     * 
+     * @return  true if secure otherwise false
+     */
+    public boolean isSecureProtocol() {
+        return this.protocol.equalsIgnoreCase("smtps") || this.protocol.equalsIgnoreCase("pop3s")
+               || this.protocol.equalsIgnoreCase("imaps");
+    }
+
+    /**
+     * returns an authenticator object for use in sessions
+     * 
+     * @return  the authenticator object
+     */
+    public Authenticator getAuthenticator() {
+        return new Authenticator() {
+            /*
+             * (non-Javadoc)
+             * 
+             * @see javax.mail.Authenticator#getPasswordAuthentication()
+             */
+            @Override
+            protected PasswordAuthentication getPasswordAuthentication() {
+                PasswordAuthentication pa = new PasswordAuthentication(getUsername(), getPassword());
+                return pa;
+            }
+        };
+    }
+}

Added: servicemix/smx3/trunk/deployables/bindingcomponents/servicemix-mail/src/main/java/org/apache/servicemix/mail/utils/MailUtils.java
URL: http://svn.apache.org/viewvc/servicemix/smx3/trunk/deployables/bindingcomponents/servicemix-mail/src/main/java/org/apache/servicemix/mail/utils/MailUtils.java?rev=634253&view=auto
==============================================================================
--- servicemix/smx3/trunk/deployables/bindingcomponents/servicemix-mail/src/main/java/org/apache/servicemix/mail/utils/MailUtils.java (added)
+++ servicemix/smx3/trunk/deployables/bindingcomponents/servicemix-mail/src/main/java/org/apache/servicemix/mail/utils/MailUtils.java Thu Mar  6 04:58:09 2008
@@ -0,0 +1,210 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.apache.servicemix.mail.utils;
+
+import java.net.URI;
+import java.util.Properties;
+
+import javax.mail.internet.ParseException;
+
+import org.apache.servicemix.mail.security.CustomSSLSocketFactory;
+
+/**
+ * utility class
+ * 
+ * @author lhein
+ */
+public final class MailUtils {
+    public static final String SSL_FACTORY = "org.apache.servicemix.mail.security.CustomSSLSocketFactory"; // javax.net.ssl.SSLSocketFactory
+
+    public static final int DEFAULT_PORT_SMTP = 25;
+    public static final int DEFAULT_PORT_SMTPS = 465;
+    public static final int DEFAULT_PORT_POP3 = 110;
+    public static final int DEFAULT_PORT_POP3S = 995;
+    public static final int DEFAULT_PORT_NNTP = 119;
+    public static final int DEFAULT_PORT_IMAP = 143;
+    public static final int DEFAULT_PORT_IMAPS = 993;
+
+    public static final String PROTOCOL_SMTP = "smtp";
+    public static final String PROTOCOL_SMTPS = "smtps";
+    public static final String PROTOCOL_POP = "pop";
+    public static final String PROTOCOL_POP3 = "pop3";
+    public static final String PROTOCOL_POP3S = "pop3s";
+    public static final String PROTOCOL_NNTP = "nntp";
+    public static final String PROTOCOL_IMAP = "imap";
+    public static final String PROTOCOL_IMAPS = "imaps";
+
+    public static final String CONNECTION_TIMEOUT = "10000";
+
+    /**
+     * default constructor
+     */
+    private MailUtils() {
+    }
+    
+    /**
+     * returns the default port for a given protocol
+     * 
+     * @param protocol the protocol
+     * @return the default port
+     */
+    public static int getDefaultPortForProtocol(final String protocol) {
+        int port = DEFAULT_PORT_SMTP;
+        
+        if (protocol != null) {
+            if (protocol.equalsIgnoreCase(PROTOCOL_IMAP)) {
+                port = DEFAULT_PORT_IMAP;
+            } else if (protocol.equalsIgnoreCase(PROTOCOL_IMAPS)) {
+                port = DEFAULT_PORT_IMAPS;
+            } else if (protocol.equalsIgnoreCase(PROTOCOL_NNTP)) {
+                port = DEFAULT_PORT_NNTP;
+            } else if (protocol.equalsIgnoreCase(PROTOCOL_POP) || protocol.equalsIgnoreCase(PROTOCOL_POP3)) {
+                port = DEFAULT_PORT_POP3;
+            } else if (protocol.equalsIgnoreCase(PROTOCOL_POP3S)) {
+                port = DEFAULT_PORT_POP3S;
+            } else if (protocol.equalsIgnoreCase(PROTOCOL_SMTP)) {
+                port = DEFAULT_PORT_SMTP;
+            } else if (protocol.equalsIgnoreCase(PROTOCOL_SMTPS)) {
+                port = DEFAULT_PORT_SMTPS;
+            } else {
+                port = DEFAULT_PORT_SMTP;
+            }
+        }
+        
+        return port;
+    }
+
+    /**
+     * parse the connection details via given uri
+     * 
+     * @param uriString the uri used for connection
+     * @return a mail connection configuration object
+     * @throws ParseException if the uri couldn't be parsed
+     */
+    public static MailConnectionConfiguration configure(String uriString) throws ParseException {
+        MailConnectionConfiguration config = new MailConnectionConfiguration();
+
+        if (uriString == null || uriString.length() <= 0) {
+            throw new ParseException("The given connection uri (" + uriString + ") is invalid.");
+        }
+
+        URI uri = URI.create(uriString);
+
+        String value = uri.getHost();
+        if (value != null) {
+            config.setHost(value);
+        }
+
+        String scheme = uri.getScheme();
+        if (scheme != null) {
+            config.setProtocol(scheme);
+        } else {
+            // set smtp as default
+            config.setProtocol("smtp");
+        }
+
+        String userInfo = uri.getUserInfo();
+        if (userInfo != null) {
+            config.setUsername(userInfo);
+        }
+
+        int port = uri.getPort();
+        if (port >= 0) {
+            config.setPort(port);
+        } else {
+            config.setPort(getDefaultPortForProtocol(config.getProtocol()));
+        }
+
+        if (uri.getPath() != null && uri.getPath().length() > 0) {
+            if (uri.getPath().startsWith("/")) {
+                config.setFolderName(uri.getPath().substring(1));
+            } else {
+                config.setFolderName(uri.getPath());
+            }
+        } else {
+            config.setFolderName("INBOX");
+        }
+
+        if (uri.getQuery().indexOf("password=") != -1) {
+            // extract the password from query
+            int beginIndex = uri.getQuery().indexOf("password=") + "password=".length();
+            int endIndex = uri.getQuery().indexOf(';', beginIndex + 1) != -1 ? uri.getQuery()
+                .indexOf(';', beginIndex + 1) : uri.getQuery().length();
+            config.setPassword(uri.getQuery().substring(beginIndex, endIndex));
+        } else {
+            // maybe no password required
+            config.setPassword("");
+        }
+
+        if (userInfo == null) {
+            // alternative way of specifying the user name
+            if (uri.getQuery().indexOf("user=") != -1) {
+                // extract the password from query
+                int beginIndex = uri.getQuery().indexOf("user=") + "user=".length();
+                int endIndex = uri.getQuery().indexOf(';', beginIndex + 1) != -1 ? uri.getQuery()
+                    .indexOf(';', beginIndex + 1) : uri.getQuery().length();
+                config.setUsername(uri.getQuery().substring(beginIndex, endIndex));
+            } else {
+                // maybe no password required
+                config.setUsername("");
+            }
+        }
+
+        return config;
+    }
+
+    /**
+     * returns the connection properties for use in endpoints
+     *
+     * @param config the connection configuration
+     * @param customTrustManagers the custom trust manager(s)
+     * @return the connection properties
+     */
+    public static Properties getPropertiesForProtocol(final MailConnectionConfiguration config,
+                                                      final String customTrustManagers) {
+        // Get system properties clone
+        Properties mailConnectionProperties = (Properties)System.getProperties().clone();
+
+        mailConnectionProperties.put("mail." + config.getProtocol() + ".connectiontimeout",
+                                     CONNECTION_TIMEOUT);
+        mailConnectionProperties.put("mail." + config.getProtocol() + ".timeout", CONNECTION_TIMEOUT);
+        mailConnectionProperties.put("mail." + config.getProtocol() + ".host", config.getHost());
+        mailConnectionProperties.put("mail." + config.getProtocol() + ".port", "" + config.getPort());
+        mailConnectionProperties.put("mail." + config.getProtocol() + ".user", config.getUsername());
+        mailConnectionProperties.put("mail." + config.getProtocol() + ".rsetbeforequit", "true");
+        mailConnectionProperties.put("mail." + config.getProtocol() + ".auth", "true");
+        mailConnectionProperties.put("mail.transport.protocol", config.getProtocol());
+        mailConnectionProperties.put("mail.store.protocol", config.getProtocol());
+        mailConnectionProperties.put("mail.host", config.getHost());
+        mailConnectionProperties.put("mail.user", config.getUsername());
+
+        if (customTrustManagers != null && customTrustManagers.trim().length() > 0
+            && config.isSecureProtocol()) {
+            // set java mail properties
+            mailConnectionProperties
+                .put("mail." + config.getProtocol() + ".socketFactory.class", SSL_FACTORY);
+            mailConnectionProperties.put("mail." + config.getProtocol() + ".socketFactory.fallback", "false");
+            mailConnectionProperties.put("mail." + config.getProtocol() + ".socketFactory.port",
+                                         "" + config.getPort());
+
+            // set the properties for the custom ssl socket factory
+            System.getProperties().put(CustomSSLSocketFactory.PROPERTY_TRUSTMANAGERS, customTrustManagers);
+        }
+
+        return mailConnectionProperties;
+    }
+}

Added: servicemix/smx3/trunk/deployables/bindingcomponents/servicemix-mail/src/main/jbi/jboss-service.xml
URL: http://svn.apache.org/viewvc/servicemix/smx3/trunk/deployables/bindingcomponents/servicemix-mail/src/main/jbi/jboss-service.xml?rev=634253&view=auto
==============================================================================
--- servicemix/smx3/trunk/deployables/bindingcomponents/servicemix-mail/src/main/jbi/jboss-service.xml (added)
+++ servicemix/smx3/trunk/deployables/bindingcomponents/servicemix-mail/src/main/jbi/jboss-service.xml Thu Mar  6 04:58:09 2008
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!-- The J2EE application client deployer service
+  -->
+<server>
+    <depends>org.servicemix:service=Deployer</depends>
+</server>
+