/*
* 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 {
}
Комментариев нет:
Отправить комментарий