пятница, 13 ноября 2009 г.

Can't send mail with attachment using JavaMail API

http://groups.google.com/group/google-appengine-java/browse_thread/thread/b752cfa8116ba58d/45ca179b84e7ada6?show_docid=45ca179b84e7ada6

/*
 * 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("f.masu...@gmail.com"));
                        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 {
    }

}

Комментариев нет:

Отправить комментарий