/*
* Created on 21/08/2006 22:14:04
*/
package net.jforum.api.integration.mail.pop;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Date;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import javax.mail.Header;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.Part;
import javax.mail.internet.InternetAddress;
import net.jforum.exceptions.MailException;
/**
* Represents a pop message.
* @author Rafael Steil
* @version $Id: POPMessage.java,v 1.6 2006/10/09 00:54:08 rafaelsteil Exp $
*/
public class POPMessage
{
private static final String IN_REPLY_TO = "In-Reply-To";
private static final String REFERENCES = "References";
private String subject;
private Object message;
private String messageContents;
private String sender;
private String replyTo;
private String references;
private String inReplyTo;
private String contentType;
private String listEmail;
private Date sendDate;
private Map headers;
/**
* Creates a new instance based on a {@link Message}
* @param message the message to convert from.
*/
public POPMessage(Message message)
{
this.extract(message);
}
/**
* Given a {@link Message}, converts it to our internal format
* @param message the message to convert
*/
private void extract(Message message)
{
try {
this.subject = message.getSubject();
this.message = message.getContent();
this.contentType = message.getContentType();
this.sender = ((InternetAddress)message.getFrom()[0]).getAddress();
this.listEmail = ((InternetAddress)message.getAllRecipients()[0]).getAddress();
this.sendDate = message.getSentDate();
if (message.getReplyTo().length > 0) {
this.replyTo = ((InternetAddress)message.getReplyTo()[0]).getAddress();
}
else {
this.replyTo = this.sender;
}
this.headers = new HashMap();
for (Enumeration e = message.getAllHeaders(); e.hasMoreElements(); ) {
Header header = (Header)e.nextElement();
this.headers.put(header.getName(), header.getValue());
}
if (this.headers.containsKey(IN_REPLY_TO)) {
this.inReplyTo = this.headers.get(IN_REPLY_TO).toString();
}
if (this.headers.containsKey(REFERENCES)) {
this.references = this.headers.get(REFERENCES).toString();
}
this.extractMessageContents(message);
}
catch (Exception e) {
}
}
private void extractMessageContents(Message m) throws MessagingException
{
Part messagePart = m;
if (this.message instanceof Multipart) {
messagePart = ((Multipart)this.message).getBodyPart(0);
}
if (contentType.startsWith("text/html")
|| contentType.startsWith("text/plain")) {
InputStream is = null;
BufferedReader reader = null;
try {
is = messagePart.getInputStream();
is.reset();
reader = new BufferedReader(
new InputStreamReader(is));
StringBuffer sb = new StringBuffer(512);
int c = 0;
char[] ch = new char[2048];
while ((c = reader.read(ch)) != -1) {
sb.append(ch, 0, c);
}
this.messageContents = sb.toString();
}
catch (IOException e) {
throw new MailException(e);
}
finally {
if (reader != null) { try { reader.close(); } catch (Exception e) {} }
if (is != null) { try { is.close(); } catch (Exception e) {} }
}
}
}
public String getListEmail()
{
return this.listEmail;
}
/**
* @return the contentType
*/
public String getContentType()
{
return this.contentType;
}
/**
* @return the headers
*/
public Map getHeaders()
{
return this.headers;
}
/**
* @return the inReplyTo
*/
public String getInReplyTo()
{
return this.inReplyTo;
}
/**
* @return the message
*/
public String getMessage()
{
return this.messageContents;
}
/**
* @return the references
*/
public String getReferences()
{
return this.references;
}
/**
* @return the replyTo
*/
public String getReplyTo()
{
return this.replyTo;
}
/**
* @return the sendDate
*/
public Date getSendDate()
{
return this.sendDate;
}
/**
* @return the sender
*/
public String getSender()
{
return this.sender;
}
/**
* @return the subject
*/
public String getSubject()
{
return this.subject;
}
/**
* @param contentType the contentType to set
*/
public void setContentType(String contentType)
{
this.contentType = contentType;
}
/**
* @param headers the headers to set
*/
public void setHeaders(Map headers)
{
this.headers = headers;
}
/**
* @param inReplyTo the inReplyTo to set
*/
public void setInReplyTo(String inReplyTo)
{
this.inReplyTo = inReplyTo;
}
/**
* @param message the message to set
*/
public void setMessage(Object message)
{
this.message = message;
}
/**
* @param references the references to set
*/
public void setReferences(String references)
{
this.references = references;
}
/**
* @param replyTo the replyTo to set
*/
public void setReplyTo(String replyTo)
{
this.replyTo = replyTo;
}
/**
* @param sendDate the sendDate to set
*/
public void setSendDate(Date sendDate)
{
this.sendDate = sendDate;
}
/**
* @param sender the sender to set
*/
public void setSender(String sender)
{
this.sender = sender;
}
/**
* @param subject the subject to set
*/
public void setSubject(String subject)
{
this.subject = subject;
}
/**
* @see java.lang.Object#toString()
*/
public String toString()
{
return new StringBuffer()
.append('[')
.append(", subject=").append(this.subject)
.append(", sender=").append(this.sender)
.append(", replyTo=").append(this.replyTo)
.append(", references=").append(this.references)
.append(", inReplyTo=").append(this.inReplyTo)
.append(", contentType=").append(this.contentType)
.append(", date=").append(this.sendDate)
.append(", content=").append(this.messageContents)
.append(", headers=").append(this.headers)
.append(']')
.toString();
}
}