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]. For more options, visit this group at http://groups.google.com/group/google-appengine-java?hl=.
