/*******************************************************************************
* ***** BEGIN LICENSE BLOCK Version: MPL 1.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with the
* License. You may obtain a copy of the License at http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for
* the specific language governing rights and limitations under the License.
*
* The Original Code is the OpenCustomer CRM.
*
* The Initial Developer of the Original Code is Thomas Bader (Bader & Jene
* Software-Ingenieurb�ro). Portions created by the Initial Developer are
* Copyright (C) 2005 the Initial Developer. All Rights Reserved.
*
* Contributor(s): Thomas Bader <thomas.bader@bader-jene.de>
* Felix Breske <felix.breske@bader-jene.de>
*
* ***** END LICENSE BLOCK *****
*/
package org.opencustomer.mail.james;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.mail.Address;
import javax.mail.MessagingException;
import javax.mail.Part;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.mail.internet.MimePart;
import org.apache.log4j.Logger;
import org.apache.mailet.GenericMailet;
import org.apache.mailet.Mail;
import org.apache.mailet.MailetContext;
import org.opencustomer.db.dao.crm.ContactDAO;
import org.opencustomer.db.dao.crm.PersonContactDAO;
import org.opencustomer.db.dao.crm.PersonDAO;
import org.opencustomer.db.vo.crm.ContactVO;
import org.opencustomer.db.vo.crm.PersonContactVO;
import org.opencustomer.db.vo.crm.PersonVO;
/**
*
* @author fbreske
*
*/
public class ImportMailet extends GenericMailet
{
private final static Logger log = Logger.getLogger(ImportMailet.class);
private ContactVO contact;
private boolean contentTypetext = false;
public void init()
{
if(log.isInfoEnabled())
log.info("Initializing Mailet");
}
public void service(Mail mail)
{
try
{
if(log.isInfoEnabled())
log.info("import mail from " + mail.getSender());
String recipient;
PersonContactVO pc;
List<PersonContactVO> pcs = new ArrayList<PersonContactVO>();
MimeMessage message = mail.getMessage();
MailetContext mailetContext = getMailetContext();
contact = new ContactVO();
contact.setBoundType(ContactVO.BoundType.IN);
contact.setContactType(ContactVO.ContactType.EMAIL);
contact.setContactTimestamp(new Date());
contact.setImportType(ContactVO.ImportType.NEW);
// Subject setzen
if (message.getSubject() != null)
contact.setSubject(message.getSubject());
else
contact.setSubject("Kein Betreff angegeben");
// Content Setzen
insertContent(message);
if (contentTypetext)
contact.setContentType(ContactVO.ContentType.PLAINTEXT);
else
contact.setContentType(ContactVO.ContentType.HTML);
// Absender
List<PersonVO> senders = new PersonDAO().getByMail(mail.getSender().toString());
if (!senders.isEmpty())
for (PersonVO person : senders)
{
pc = new PersonContactVO(person, contact);
pc.setRelationType(PersonContactVO.Type.SENDER);
pcs.add(pc);
if ((mailetContext.isLocalUser(mail.getSender().getUser())) && mailetContext.isLocalServer(mail.getSender().getHost()))
{
contact.setBoundType(ContactVO.BoundType.OUT);
}
}
else
contact.setContactName("From: " + mail.getSender().toString());
// Emfaenger TO
Address[] addresses = message.getRecipients(MimeMessage.RecipientType.TO);
for (Address address : addresses)
{
recipient = address.toString();
List<PersonVO> recipients = new PersonDAO().getByMail(recipient);
if (!recipients.isEmpty())
for (PersonVO person : recipients)
{
pc = new PersonContactVO(person, contact);
pc.setRelationType(PersonContactVO.Type.TO);
pcs.add(pc);
}
else if (contact.getContactName() == null)
contact.setContactName("To: " + recipient);
else
contact.setContactName(contact.getContactName() + ", To: " + recipient);
}
// Emfaenger CC
addresses = message.getRecipients(MimeMessage.RecipientType.CC);
if (addresses != null)
for (Address address : addresses)
{
recipient = address.toString();
List<PersonVO> recipients = new PersonDAO().getByMail(recipient);
if (!recipients.isEmpty())
for (PersonVO person : recipients)
{
pc = new PersonContactVO(person, contact);
pc.setRelationType(PersonContactVO.Type.CC);
pcs.add(pc);
}
else if (contact.getContactName() == null)
contact.setContactName("CC: " + recipient);
else
contact.setContactName(contact.getContactName() + ", CC: " + recipient);
}
// Emfaenger BCC
addresses = message.getRecipients(MimeMessage.RecipientType.BCC);
if (addresses != null)
for (Address address : addresses)
{
recipient = address.toString();
List<PersonVO> recipients = new PersonDAO().getByMail(recipient);
if (!recipients.isEmpty())
for (PersonVO person : recipients)
{
pc = new PersonContactVO(person, contact);
pc.setRelationType(PersonContactVO.Type.BCC);
pcs.add(pc);
}
else if (contact.getContactName() == null)
contact.setContactName("BCC: " + recipient);
else
contact.setContactName(contact.getContactName() + ", BCC: " + recipient);
}
// Datenbank Eintrag
if (!pcs.isEmpty())
{
new ContactDAO().insert(contact);
for (PersonContactVO pce : pcs)
{
pce.setContact(contact);
new PersonContactDAO().insert(pce);
}
mail.getMessage().addHeader("Filter: ", "james2oc"); // header
// setzten
mail.setAttribute("james2oc", true); // mailattribut setzen
}
}
catch (Throwable e)
{
e.printStackTrace();
}
}
public String getMailetInfo()
{
return "James to Opencustomer Mailet";
}
public void destroy()
{
}
private void insertContent(MimePart part) throws MessagingException, IOException
{
boolean rc = false;
String disposition = part.getDisposition();
if (disposition == null)
{
if (part.isMimeType("text/plain"))
{
contact.setContent(part.getContent().toString());
contentTypetext = true;
}
else if (part.isMimeType("text/html"))
{
if (!contentTypetext)
contact.setContent(part.getContent().toString());
}
else if (part.isMimeType("multipart/*"))
{
MimeMultipart multipart = (MimeMultipart) part.getContent();
for (int i = 0; i < multipart.getCount(); i++)
{
MimeBodyPart mimeBodyPart = (MimeBodyPart) multipart.getBodyPart(i);
insertContent(mimeBodyPart);
}
}
else
{
System.out.println("Unbekannter ContentType");
}
}
else
{
if (disposition.equals(Part.ATTACHMENT) || disposition.equals(Part.INLINE))
System.out.println("Anhang gefunden: " + part.getFileName());
else
System.out.println("Unbekannter ContentType");
}
}
}