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) <ika...@google.com> 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 <sambrod...@gmail.com> 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
>> google-appengine-j...@googlegroups.com.
>> To unsubscribe from this group, send email to
>> google-appengine-java+unsubscr...@googlegroups.com<google-appengine-java%2bunsubscr...@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
>



-- 
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.


Reply via email to