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 = "[email protected]";
private static final String SENDER = "[email protected]";
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 <[email protected]> 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 <[email protected]> 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("
> [email protected]"));
> > 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)" <[email protected]> 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
> [email protected].
> To unsubscribe from this group, send email to
> [email protected]<google-appengine-java%[email protected]>
> .
> 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 [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/google-appengine-java?hl=.