I couldn't reproduce your exact error, but I was able to put together a
working example of an inbound email handler to relay messages. I'm going to
expand the documentation about processing inbound emails. Here's some
working code: http://pastie.org/701517

Does this example help any? Code is also pasted below, but it'll be easier
for you to look at the Pastie.

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.ServletException;
import javax.mail.*;
import javax.mail.util.ByteArrayDataSource;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.InternetAddress;
import javax.activation.DataHandler;
import java.io.IOException;
import java.io.InputStream;
import java.util.logging.Logger;
import java.util.Properties;

public class MailHandlerServlet extends HttpServlet {
    private static final Logger log =
Logger.getLogger(MailHandlerServlet.class.getName());
    private static final String RECIPIENT = "recipi...@gmail.com";
    private static final String SENDER = "sen...@google.com";


    protected void doPost(HttpServletRequest request, HttpServletResponse
response) throws ServletException, IOException {
        Properties props = new Properties();
        Session session = Session.getDefaultInstance(props, null);
        try {
            MimeMessage message = new MimeMessage(session,
request.getInputStream());

            Object content = message.getContent(); // You could also
probably just use message.getInputStream() here
                                                   // and avoid the
conditional type check

            if (content instanceof String) {
                log.info("Received a string");
            } else if (content instanceof InputStream) {
                // My somewhat limited testing indicates that this is always
getting returned as an
                // InputStream

                InputStream inputStream = (InputStream) content;
                ByteArrayDataSource inboundDataSource = new
ByteArrayDataSource(inputStream, message.getContentType());
                Multipart inboundMultipart = new
MimeMultipart(inboundDataSource);

                // Set the body with whatever text you want
                Multipart outboundMultipart = new MimeMultipart();
                MimeBodyPart messageBodyPart = new MimeBodyPart();
                messageBodyPart.setText("Set your body here");
                outboundMultipart.addBodyPart(messageBodyPart);

                // Loop over the multipart message coming in and
                // append them to the outbound Multipart object
                for (int i = 0; i < inboundMultipart.getCount(); i++) {
                    BodyPart part = inboundMultipart.getBodyPart(i);
                    /*
                        The content-disposition header is optional:
                        http://www.ietf.org/rfc/rfc1806.txt

                        This header specifies the filename and type of
                        a MIME part.
                    */
                    if(part.getDisposition() == null) {
                        // This is just a plain text email
                    } else {
                        // We have something interesting. Let's parse it.

                        // Create a new ByteArrayDataSource with this part
                        MimeBodyPart inboundMimeBodyPart = (MimeBodyPart)
part;
                        InputStream is = part.getInputStream();
                        ByteArrayDataSource mimePartDataSource = new
ByteArrayDataSource(is, inboundMimeBodyPart.getContentType());

                        // Create a new outbound MimeBodyPart and set this
as the handler
                        MimeBodyPart outboundMimeBodyPart = new
MimeBodyPart();
                        outboundMimeBodyPart.setDataHandler(new
DataHandler(mimePartDataSource));


outboundMimeBodyPart.setFileName(inboundMimeBodyPart.getFileName());
                        outboundMultipart.addBodyPart(outboundMimeBodyPart);

                    }

                }
                message.setContent(outboundMultipart);

            }
            message.setFrom(new InternetAddress(SENDER, "Relay account"));
            message.setRecipient(Message.RecipientType.TO, new
InternetAddress(RECIPIENT, "Recipient"));

            Transport.send(message);

        } catch (MessagingException e) {
            throw new ServletException(e);
        }
    }
}


On Sat, Nov 14, 2009 at 1:11 AM, mably <fm2...@mably.com> wrote:

> Hi Ikai, have you been able to reproduce my "Converting attachment
> data failed" exception ?
>
> I'm still stuck on this strange bug.
>
> Thanx for your help.
>
> On 11 nov, 00:00, mably <fm2...@mably.com> wrote:
> > Of course, here is below my email relay servlet class.  What I'm
> > willing to do is to hide my customers email addresses by relaying
> > email to them via my google app email adress.
> >
> > I would like to be able to relay html emails with images which is
> > quite common nowadays.  I am sending my test emails from a gmail
> > account.
> >
> > Thanx for your help.
> >
> > /*
> >  * Copyright (C) 2009 Francois Masurel
> >  *
> >  * This program is free software: you can redistribute it and/or
> > modify
> >  * it under the terms of the GNU General Public License as published
> > by
> >  * the Free Software Foundation, either version 3 of the License, or
> >  * any later version.
> >  *
> >  * This program is distributed in the hope that it will be useful,
> >  * but WITHOUT ANY WARRANTY; without even the implied warranty of
> >  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> >  * GNU General Public License for more details.
> >  *
> >  * You should have received a copy of the GNU General Public License
> >  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
> >
> >  */
> >
> > package com.mably.cms.web;
> >
> > import java.io.IOException;
> > import java.io.InputStream;
> > import java.util.Arrays;
> > import java.util.Properties;
> >
> > import javax.activation.DataHandler;
> > import javax.activation.DataSource;
> > import javax.mail.BodyPart;
> > import javax.mail.Message;
> > import javax.mail.MessagingException;
> > import javax.mail.Multipart;
> > 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.internet.MimeMessage.RecipientType;
> > import javax.mail.util.ByteArrayDataSource;
> > import javax.servlet.ServletException;
> > import javax.servlet.http.HttpServlet;
> > import javax.servlet.http.HttpServletRequest;
> > import javax.servlet.http.HttpServletResponse;
> >
> > import org.slf4j.Logger;
> > import org.slf4j.LoggerFactory;
> >
> > import com.google.inject.Inject;
> > import com.google.inject.Singleton;
> > import com.mably.cms.model.ContentManager;
> > import com.mably.cms.utils.TraitementStream;
> >
> > /**
> >  * @author f.masurel
> >  *
> >  */
> > @Singleton
> > public class ContactMailServlet extends HttpServlet {
> >
> >     /** serialVersionUID. */
> >     private static final long serialVersionUID = 7131942698661805870L;
> >
> >     /** Logger. */
> >     private static final Logger LOG =
> >         LoggerFactory.getLogger(ContactMailServlet.class);
> >
> >     @Inject private ContentManager contentManager;
> >
> >     /**
> >      * {...@inheritdoc}
> >      */
> >     public void doPost(HttpServletRequest req, HttpServletResponse
> > res)
> >             throws ServletException, IOException {
> >
> >         Properties props = new Properties();
> >         Session session = Session.getDefaultInstance(props, null);
> >
> >         try {
> >
> >                 MimeMessage msg = new MimeMessage(session,
> req.getInputStream
> > ());
> >
> >                         String contentType = msg.getContentType();
> >
> >                         LOG.info("Mail content type : " + contentType);
> >                         LOG.info("Mail sent to " + Arrays.toString(
> >
> msg.getRecipients(RecipientType.TO)));
> >                         LOG.info("Mail received from " +
> msg.getSender());
> >
> >                         MimeMessage resmsg = new MimeMessage(session);
> >
> >                         resmsg.setSubject(msg.getSubject());
> >                         resmsg.setRecipient(Message.RecipientType.TO,
> msg.getSender());
> >
> >                         Multipart rescontent = new MimeMultipart();
> >
> >                         Object content = msg.getContent();
> >                         if (content instanceof String) {
> >                                 LOG.info("Content : string");
> >                         } else if (content instanceof Multipart) {
> >                                 LOG.info("Content : multipart");
> >                                 Multipart mpcontent = (Multipart)
> msg.getContent();
> >                                 for (int i = 0; i < mpcontent.getCount();
> i++) {
> >                                         BodyPart part =
> mpcontent.getBodyPart(i);
> >                                         MimeBodyPart respart = new
> MimeBodyPart();
> >                                         respart.setContent(
> >
> part.getContent(), part.getContentType());
> >                                         rescontent.addBodyPart(respart);
> >                                 }
> >                         } else if (content instanceof InputStream) {
> >                                 LOG.info("Content : inputstream");
> >                                 InputStream inputStream = (InputStream)
> content;
> >                                 ByteArrayDataSource ds =
> >                                         new
> ByteArrayDataSource(inputStream, contentType);
> >                                 Multipart mpcontent = new
> MimeMultipart(ds);
> >                                 for (int i = 0; i < mpcontent.getCount();
> i++) {
> >                                         BodyPart part =
> mpcontent.getBodyPart(i);
> >                                         MimeBodyPart respart = new
> MimeBodyPart();
> >                                         String level = String.valueOf(i);
> >                                         this.processInputStreamPart(part,
> respart, level);
> >                                         rescontent.addBodyPart(respart);
> >                                 }
> >                         }
> >
> >                         resmsg.setContent(rescontent);
> >
> >                         resmsg.setSender(new InternetAddress("
> f.masu...@gmail.com"));
> >                         resmsg.setFrom(msg.getSender());
> >                         //resmsg.setReplyTo(new Address[] {
> msg.getSender() });
> >                         resmsg.setSubject(msg.getSubject());
> >                         resmsg.setRecipient(Message.RecipientType.TO,
> msg.getSender());
> >
> >                         resmsg.saveChanges();
> >
> >             Transport.send(resmsg);
> >
> >                 } catch (MessagingException e) {
> >
> >                         LOG.error(e.toString(), e);
> >
> >                 }
> >
> >     }
> >
> >     private void processInputStreamPart(
> >                 BodyPart srcPart, MimeBodyPart tgtPart, String level)
> >     throws MessagingException, IOException {
> >                 String partType = srcPart.getContentType();
> >                 LOG.info("Part " + level + " content type : " +
> partType);
> >                 Object partContent = srcPart.getContent();
> >                 LOG.info("Part " + level + " content : " + partContent);
> >                 if (partType.startsWith("multipart/")) {
> >                         String subType =
> partType.substring(partType.indexOf('/') + 1);
> >                         Multipart tgtPartMP = new MimeMultipart(subType);
> >                         ByteArrayDataSource srcPartDS = new
> ByteArrayDataSource(
> >                                         (InputStream) partContent,
> partType);
> >                         Multipart srcPartMP = new
> MimeMultipart(srcPartDS);
> >                         for (int j = 0; j < srcPartMP.getCount(); j++) {
> >                                 BodyPart srcChildPart =
> srcPartMP.getBodyPart(j);
> >                                 MimeBodyPart tgtChildPart = new
> MimeBodyPart();
> >                                 String childLevel = level + "." + j;
> >                                 this.processInputStreamPart(
> >                                                 srcChildPart,
> tgtChildPart, childLevel);
> >                                 tgtPartMP.addBodyPart(tgtChildPart);
> >                         }
> >                         tgtPart.setContent(tgtPartMP);
> >                 } else if (partType.startsWith("text/")) {
> >                         String data = TraitementStream.toString(
> >                                         (InputStream) partContent);
> >                         tgtPart.setContent(data, partType);
> >                 } else {
> >                         String dataType = partType.substring(0,
> partType.indexOf(';'));
> >                         byte[] srcData  =
> TraitementStream.getBytesFromInputStream(
> >                                         srcPart.getInputStream());
> >                         LOG.info("Data type = " + dataType);
> >                         LOG.info("Data size = " + srcData.length);
> >                         LOG.info("File name = " + srcPart.getFileName());
> >                         tgtPart.setFileName(srcPart.getFileName());
> >                         tgtPart.setDisposition(srcPart.getDisposition());
> >                         DataSource tgtPartDS = new
> ByteArrayDataSource(srcData, dataType);
> >                         tgtPart.setDataHandler(new
> DataHandler(tgtPartDS));
> >                         //tgtPart.setContent(srcData, dataType);
> >                 }
> >     }
> >
> >     /**
> >      * {...@inheritdoc}
> >      */
> >     public void doHead(HttpServletRequest req, HttpServletResponse
> > res)
> >             throws ServletException, IOException {
> >     }
> >
> >     /**
> >      * {...@inheritdoc}
> >      */
> >     public void doGet(HttpServletRequest req, HttpServletResponse res)
> >             throws ServletException, IOException {
> >     }
> >
> > }
> >
> > On 10 nov, 23:46, "Ikai L (Google)" <ika...@google.com> wrote:
> >
> >
> >
> > > François,
> >
> > > Do you have a code snippet, log entries or a stack trace?
> >
> > > --
> > > Ikai Lan
> > > Developer Programs Engineer, Google App Engine
>
> --
>
> You received this message because you are subscribed to the Google Groups
> "Google App Engine for Java" group.
> To post to this group, send email to
> google-appengine-j...@googlegroups.com.
> To unsubscribe from this group, send email to
> google-appengine-java+unsubscr...@googlegroups.com<google-appengine-java%2bunsubscr...@googlegroups.com>
> .
> For more options, visit this group at
> http://groups.google.com/group/google-appengine-java?hl=.
>
>
>


-- 
Ikai Lan
Developer Programs Engineer, Google App Engine

--

You received this message because you are subscribed to the Google Groups 
"Google App Engine for Java" group.
To post to this group, send email to google-appengine-j...@googlegroups.com.
To unsubscribe from this group, send email to 
google-appengine-java+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/google-appengine-java?hl=.


Reply via email to