Peter, I'm hoping this solved your issue with CIDs and inline image attachments. If you can, it'd be awesome if you could post some sample code for the group.
On Wed, Dec 9, 2009 at 2:02 PM, Peter Ondruska <[email protected]>wrote: > Thank you Jeremy, Ikai, and tetest. I was able to finish incoming mail > handler in Java and it works fine now. I has been confusing due to > changes in 1.2.7 and 1.2.8 releases. Peter > > On Dec 9, 10:52 pm, "Ikai L (Google)" <[email protected]> wrote: > > I've just tested this code out with Yahoo, Gmail and Hotmail for > processing > > an attachment. It's working well. Thanks to Jeremy Blythe for looking > into > > this and posting about it! I'll add this to the cookbook when I get a > > chance. > > > > // IncomingMailHandlerServlet.java > > > > 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.internet.MimeMessage; > > import javax.mail.internet.MimeBodyPart; > > import javax.mail.internet.MimeMultipart; > > import javax.mail.Session; > > import javax.mail.MessagingException; > > import javax.mail.Multipart; > > import javax.mail.BodyPart; > > import javax.jdo.PersistenceManager; > > import java.io.IOException; > > import java.io.ByteArrayOutputStream; > > import java.io.InputStream; > > import java.util.Properties; > > import java.util.logging.Logger; > > > > import javatest.PMF; > > import javatest.models.Image; > > > > public class IncomingMailHandlerServlet extends HttpServlet { > > > > private static final Logger log = > > Logger.getLogger(IncomingMailHandlerServlet.class.getName()); > > > > 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(); > > > > if (content instanceof String) { > > // do something > > } else if (content instanceof Multipart) { > > MimeMultipart inboundMultipart = (MimeMultipart) content; > > 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" > > // Gmail and Yahoo add the filename, Hotmail > > does not > > // 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(); > > } > > > > } > > > > } > > > > } else { > > // We got something weird, shouldn't ever get here. Let's > > add some logging > > } > > > > } catch (MessagingException e) { > > // do something > > } > > } > > > > } > > > > // Image.java > > 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; > > } > > > > } > > > > On Mon, Dec 7, 2009 at 5:47 PM, Ikai L (Google) <[email protected]> > wrote: > > > > > > > > > > > > > Sam, > > > > > I understand your confusion. I'm looking into it. The code I posted was > to > > > convert an InputStream to the proper format. My understanding is that > 1.2.8 > > > actually fixed the issue, so our code should actually end up being > simpler > > > and closer adhere to standard Java incoming mail processing. > > > > > Any help the community provides would be much appreciated! The faster > we > > > can all get to the bottom of this, the faster I can get the docs > updated. > > > > > On Sun, Dec 6, 2009 at 2:40 AM, Sam <[email protected]> wrote: > > > > >> Appengine team, can someone please post (on the incoming mail docs > > >> page) a full example of processing an incoming email in appengine > > >> 1.2.8 including getting the message body and attachment? Please test > > >> from different mail clients. Everyone is totally confused here, > > >> especially with the mysterious API "fix" in 1.2.8 that broke all > > >> incoming mail code. Thanks. > > > > >> -- > > > > >> 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]><google-appengine-java%2B > [email protected]> > > >> . > > >> 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 > > > > -- > > 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=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 [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=en.
