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=.