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(); > > ByteArrayDataSource byteArrayDataSource = new > > ByteArrayDataSource > > (is, contentType); > > 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)); > > } > > } > > > Does not work reliably (java.io.IOException: Truncated quoted > > printable data and java.lang.OutOfMemoryError: Java heap space) but > > that is either other bug in GAE or my code. > > > On Dec 1, 4:38 am, tetest <tet...@gmail.com> wrote: > > > Hi, > > > > Follow this thread: > > >http://groups.google.com/group/google-appengine-java/browse_thread/th.... > > .. > > > > Though something only has to be able to be useful. > > > > thanks. > > > > On 11月30日, 午後11:34, Peter Ondruska <peter.ondru...@gmail.com> wrote: > > > > > I am following instructions onhttp:// > > code.google.com/appengine/docs/java/mail/receiving.html > > > > to process incoming mail but failing on retrieving content (headers > > > > are fine). > > > > > "The getContent() method returns an object that implements the > > > > Multipart interface. You can then call getCount() to determine the > > > > number of parts and getBodyPart(int index) to return a particular body > > > > part." > > > > > MimeMultipart mmp = (MimeMultipart) message.getContent(); > > > > > Error: > > > > java.lang.ClassCastException: java.io.ByteArrayInputStream cannot be > > > > cast to javax.mail.internet.MimeMultipart > > > > > And when I check at runtime what class is returned by getContent() it > > > > really is java.io.ByteArrayInputStream. > > > > > Am I doing something wrong? > > > -- > > > 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%2B > > unsubscr...@googlegroups.com> > > . > > For more options, visit this group at > >http://groups.google.com/group/google-appengine-java?hl=en. > > -- > 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=en.