OK. now I am really puzzled. message.getContent() is very much dependent on how message is sent, e.g. email from Gmail: message.getContent().getClass().getName() is javax.mail.internet.MimeMultipart
email from Hotmail and Yahoo mail: message.getContent().getClass().getName() throws: Uncaught exception from servlet java.io.IOException: Truncated quoted printable data at org.apache.geronimo.mail.util.QuotedPrintableEncoder.decodeNonspaceChar (QuotedPrintableEncoder.java:597) at org.apache.geronimo.mail.util.QuotedPrintableEncoder.decode (QuotedPrintableEncoder.java:584) at org.apache.geronimo.mail.util.QuotedPrintableDecoderStream.read (QuotedPrintableDecoderStream.java:80) at org.apache.geronimo.mail.handlers.TextHandler.getContent (TextHandler.java:107) at javax.activation.DataSourceDataContentHandler.getContent(Unknown Source) at javax.activation.DataHandler.getContent(Unknown Source) at javax.mail.internet.MimeMessage.getContent(MimeMessage.java:927) On Dec 4, 6:38 pm, Peter Ondruska <peter.ondru...@gmail.com> wrote: > Ikai, my code looks same as yours to me: > > package eu.kaibo.server; > > import java.io.ByteArrayInputStream; > import java.io.IOException; > import java.io.InputStream; > import java.util.Properties; > import java.util.logging.Level; > import java.util.logging.Logger; > > import javax.mail.Address; > import javax.mail.MessagingException; > import javax.mail.Multipart; > import javax.mail.Part; > import javax.mail.Session; > import javax.mail.internet.MimeMessage; > import javax.mail.internet.MimeMultipart; > 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 com.google.appengine.api.labs.taskqueue.QueueFactory; > import com.google.appengine.api.labs.taskqueue.TaskOptions; > > public class MailHandler extends HttpServlet { > > private static final long serialVersionUID = 895612806305910032L; > > private final Logger logger = Logger.getLogger(getClass().getName()); > > @Override > protected void doPost(HttpServletRequest request, HttpServletResponse > response) throws ServletException, IOException { > > Session session = Session.getDefaultInstance(new Properties(), > null); > > try { > > MimeMessage message = new MimeMessage(session, > request.getInputStream()); > > StringBuffer sb = new StringBuffer(); > > sb.append("From: "); > Address[] senders = message.getFrom(); > for (int i = 0; i < senders.length; i++) > sb.append(senders[i].toString()).append("; "); > sb.append("\n"); > > sb.append("To: "); > Address[] receivers = message.getAllRecipients(); > for (int i = 0; i < receivers.length; i++) > sb.append(receivers[i].toString()).append("; > "); > sb.append("\n"); > > line 55: InputStream is = (InputStream) > message.getContent(); > ByteArrayDataSource byteArrayDataSource = new > ByteArrayDataSource > (is, message.getContentType()); > Multipart mmp = new > MimeMultipart(byteArrayDataSource); > > for (int i = 0; i < mmp.getCount(); i++) { > Part p = mmp.getBodyPart(i); > if ("text/plain".equals(p.getContentType())) { > if (i > 0) sb.append("*******"); > ByteArrayInputStream bais = > (ByteArrayInputStream) p.getContent > (); > byte[] buffer = new byte[1024]; > int length = 0; > while ((length = bais.read(buffer)) > != -1) > sb.append(new String(buffer, > 0, length)); > } > } > > TaskOptions taskOptions = > TaskOptions.Builder.url("/worker/mail"); > taskOptions.param("sender", "x"); > taskOptions.param("receiver", "x"); > taskOptions.param("subject", "FW: " + > message.getSubject()); > taskOptions.param("body", sb.toString()); > QueueFactory.getDefaultQueue().add(taskOptions); > > } catch (MessagingException e) { > logger.log(Level.SEVERE, null, e); > } > > } > > } > > I am still getting exception: > > Uncaught exception from servlet > java.io.IOException: Truncated quoted printable data > at > org.apache.geronimo.mail.util.QuotedPrintableEncoder.decodeNonspaceChar > (QuotedPrintableEncoder.java:597) > at org.apache.geronimo.mail.util.QuotedPrintableEncoder.decode > (QuotedPrintableEncoder.java:584) > at org.apache.geronimo.mail.util.QuotedPrintableDecoderStream.read > (QuotedPrintableDecoderStream.java:80) > at org.apache.geronimo.mail.handlers.TextHandler.getContent > (TextHandler.java:107) > at javax.activation.DataSourceDataContentHandler.getContent(Unknown > Source) > at javax.activation.DataHandler.getContent(Unknown Source) > at javax.mail.internet.MimeMessage.getContent(MimeMessage.java:927) > at eu.kaibo.server.MailHandler.doPost(MailHandler.java:55) > at javax.servlet.http.HttpServlet.service(HttpServlet.java:713) > > On Dec 2, 7:08 pm, "Ikai L (Google)" <ika...@google.com> wrote: > > > > > Peter, > > > I'm working on a cookbook entry for processing incoming mail in Java. Here's > > some code I had working. Can you take a look at this and see if there's > > anything you can adapt? > > > import com.google.appengine.api.datastore.Blob; > > import com.google.appengine.api.datastore.Key; > > > import javax.jdo.annotations.*; > > > @PersistenceCapable(identityType = IdentityType.APPLICATION) > > public class Image { > > > @PrimaryKey > > @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) > > private Key key; > > > @Persistent > > private Blob data; > > > @Persistent > > private String contentType; > > > public Image(Blob data, String contentType) { > > this.data = data; > > this.contentType = contentType; > > } > > > public Key getKey() { > > return key; > > } > > > public Blob getData() { > > return data; > > } > > > public void setData(Blob data) { > > this.data = data; > > } > > > public String getContentType() { > > return contentType; > > } > > > public void setContentType(String contentType) { > > this.contentType = contentType; > > } > > > } > > > import Image; > > import com.google.appengine.api.datastore.Blob; > > > 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.MimeBodyPart; > > import javax.mail.internet.MimeMessage; > > import javax.mail.internet.MimeMultipart; > > import javax.jdo.PersistenceManager; > > import java.io.IOException; > > import java.io.InputStream; > > import java.io.ByteArrayOutputStream; > > import java.util.Properties; > > > public class IncomingMailHandlerServlet extends HttpServlet { > > > 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()); > > > InputStream inputStream = message.getInputStream(); > > > ByteArrayDataSource inboundDataSource = new > > ByteArrayDataSource(inputStream, message.getContentType()); > > Multipart inboundMultipart = new > > MimeMultipart(inboundDataSource); > > > for (int i = 0; i < inboundMultipart.getCount(); i++) { > > BodyPart part = inboundMultipart.getBodyPart(i); > > > if (part.getDisposition() == null) { > > // This is just a plain text part > > } else if (part.getDisposition().equals("attachment")) { > > // Create a new ByteArrayDataSource with this part > > MimeBodyPart inboundMimeBodyPart = (MimeBodyPart) part; > > > // The call to getContentType here may return a filename > > along with content type. Ex: > > // image/jpeg; name="filename.jpg" > > // It doesn't seem to affect display in a browser but > > you may wish to sanitize it > > String contentType = > > inboundMimeBodyPart.getContentType(); > > > InputStream is = part.getInputStream(); > > > byte[] rawData, buffer = new byte[8192]; > > int len; > > ByteArrayOutputStream output = new > > ByteArrayOutputStream(); > > > try { > > while ((len = is.read(buffer, 0, buffer.length)) != > > -1) output.write(buffer, 0, len); > > rawData = output.toByteArray(); > > } finally { > > output.close(); > > } > > > PersistenceManager pm = > > PMF.get().getPersistenceManager(); > > > Image image = new Image(new Blob(rawData), contentType); > > try { > > pm.makePersistent(image); > > } finally { > > pm.close(); > > } > > > } > > > } > > > } catch (MessagingException e) { > > throw new ServletException(e); > > } > > } > > > } > > > On Wed, Dec 2, 2009 at 6:00 AM, Peter Ondruska > > <peter.ondru...@gmail.com>wrote: > > > > tetest, thank you, the complete working example would be then: > > > > MimeMessage message = new MimeMessage(session, > > > request.getInputStream()); > > > > StringBuffer sb = new StringBuffer(); > > > > sb.append("From: "); > > > Address[] senders = message.getFrom(); > > > for (int i = 0; i < senders.length; i++) > > > sb.append(senders[i].toString()).append("; > > > "); > > > sb.append("\n"); > > > > sb.append("To: "); > > > Address[] receivers = message.getAllRecipients(); > > > for (int i = 0; i < receivers.length; i++) > > > > > > sb.append(receivers[i].toString()).append("; > > > "); > > > sb.append("\n"); > > > > InputStream is = (InputStream) > > > message.getContent(); > > > String contentType = message.getContentType();... > > read more » -- 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=en.