EmailMessageReader

This class is used to read email content. The email is set by the setMessage method. The class is basically a simple wrapper for the Message class and Part class of JavaMail. It is used to facilitate the reading of the message over the phone.

Source Code

package vx.apps.email;

import javax.mail.*;
import java.io.*;
import java.util.ArrayList;
import java.text.SimpleDateFormat;


public class EmailMessageReader
{
  public EmailMessageReader()
  {
    msg_ = null;
  }

  public EmailMessageReader(Message msg)
    throws IOException, MessagingException
  {
    msg_ = msg;
    setMessage(msg);
  }

  public void setMessage(Message msg)
    throws IOException, MessagingException
  {
    msg_ = msg;

    // parse message exception included files
    String content = getContent();
    if (content == null) {
        newContent_ = null;
        oldContent_ = null;
    }
    else {
        int idx = content.indexOf("----- Original Message -----");
        newContent_ = content;
        oldContent_ = null;
        if (idx != -1) {
            newContent_ = content.substring(0, idx);
            oldContent_ = content.substring(idx);
        }
    }

    ArrayList list = collectFiles();
    if (list.size() == 0)
        includes_ = null;
    else {
        includes_ = new Part[list.size()];
        list.toArray(includes_);
    }
  }

  public String getFrom()
    throws MessagingException
  {
    return getFrom(msg_);
  }

  public static String getFrom(Message msg)
    throws MessagingException
  {
    javax.mail.Address[] addrs = msg.getFrom();
    if (addrs == null || addrs.length == 0)
        return null;

    String str = "";
    for (int i = 0; i < addrs.length; i++) {
        if (i != 0)
            str += ", ";
        String text = addrs[i].toString();
        str += removeChars(text);
    }

    return str;
  }

  public String getRecipients()
    throws MessagingException
  {
    return getRecipients(msg_);
  }

  public static String getRecipients(Message msg)
    throws MessagingException
  {
    javax.mail.Address[] addrs = msg.getRecipients(Message.RecipientType.TO);
    if (addrs == null || addrs.length == 0)
        return null;

    String str = "";
    for (int i = 0; i < addrs.length; i++) {
        if (i != 0)
            str += ", ";
        String text = addrs[i].toString();
        str += removeChars(text);
    }

    return str;
  }

  public String getDate()
    throws MessagingException
  {
    return getDate(msg_);
  }

  public static String getDate(Message msg)
    throws MessagingException
  {
    java.util.Date d = msg.getSentDate();
    if (d != null) {
        SimpleDateFormat formatter = new SimpleDateFormat("MMMM d hh:mm aa");
        return formatter.format(d);
    }
    return null;
  }

  public static boolean isMultipart(Part p)
    throws MessagingException
  {
    return p.isMimeType("multipart/*");
  }

  public static boolean isWave(Part p)
    throws MessagingException
  {
    return p.isMimeType("audio/x-wav") || p.isMimeType("audio/wav");
  }

  public static boolean isText(Part p)
    throws MessagingException
  {
    return p.isMimeType("text/plain");
  }

  // return original filename
  public static String readWaveFile(Part p, File savefile)
    throws IOException, MessagingException
  {
    InputStream is = p.getInputStream();
    FileOutputStream fs = new FileOutputStream(savefile);
    byte[] wavbuf = new byte[256];
    int len;
    while ((len = is.read(wavbuf)) > 0)
        fs.write(wavbuf, 0, len);
    fs.close();

    return p.getFileName();
  }

  public ArrayList collectFiles()
    throws IOException, MessagingException
  {
    return collectFiles(msg_);
  }

  public ArrayList collectFiles(Part p)
    throws IOException, MessagingException
  {
    ArrayList list = new ArrayList();

    if (p.getFileName() != null) {
        list.add(p);
        return list;
    }

    if (isMultipart(p)) {
        Multipart mp = (Multipart) p.getContent();
        for (int i = 0; i < mp.getCount(); i++)
            list.addAll(collectFiles(mp.getBodyPart(i)));
    }

    return list;
  }

  public String includeContent()
    throws IOException, MessagingException
  {
    return includeContent(msg_);
  }

  public static String includeContent(Part p)
    throws IOException, MessagingException
  {
    StringBuffer buf = new StringBuffer();

    if (isMultipart(p)) {
        Multipart mp = (Multipart) p.getContent();
        for (int i = 0; i < mp.getCount(); i++) {
            buf.append(includeContent(mp.getBodyPart(i)));
            buf.append("\n");
        }
    }
    else if (isText(p) && p.getFileName()==null) {
        BufferedReader br = new BufferedReader(
        new StringReader((String)p.getContent()));
        String line;
        while ((line = br.readLine()) != null) {
            buf.append(">");
            buf.append(line);
            buf.append("\n");
        }
    }

    return buf.toString();
  }

  public String getContent()
    throws IOException, MessagingException
  {
    return getContent(msg_);
  }

  public static String getContent(Part p)
    throws IOException, MessagingException
  {
    StringBuffer buf = new StringBuffer();

    if (isText(p)) {
        buf.append((String)p.getContent());
    }
    else if (isMultipart(p)) {
        Multipart mp = (Multipart)p.getContent();
        int count = mp.getCount();
        for (int i = 0; i < count; i++) {
            Part pp = mp.getBodyPart(i);
            if (pp.getFileName() != null)
                continue;
            String ppcontent = getContent(pp);
            if (ppcontent != null) {
                buf.append(ppcontent);
                buf.append("\n");
            }
        }
    }
    else if (p.isMimeType("message/rfc822")) {
        String pcontent = getContent((Part)p.getContent());
        if (pcontent != null)
            buf.append(pcontent);
    }

    String m = removeChars(buf.toString());
    if (m.trim().length() == 0)
        return null;

    return m;
  }

  public static String[] breakup(String content)
  {
    if (content == null)
        return null;

    ArrayList list = new ArrayList();

    while (content.length() > 0) {
        if (content.length() < 400) {
            list.add(content);
            break;
        }

        int i = 320;
        for (; i < content.length(); i++) {
            char c = content.charAt(i);
            if (c == '\n' ||
                i == content.length() - 1 || 
                (c == '.' && content.charAt(i+1) == ' ')) 
            {
                list.add(content.substring(0, i+1));
                content = content.substring(i+1);
                break;
            }
        }
    }

    String[] cts = new String[list.size()];
    list.toArray(cts);
    return cts;
  }

  public String getNewContent()
  {
    return newContent_;
  }

  public String getOldContent()
  {
    return oldContent_;
  }

  public Part getIncludeFile(int index)
  {
    if (includes_ == null)
        return null;

    if (index >= includes_.length || index < 0)
        return null;

    return includes_[index];
  }

  public int numIncludeFiles()
  {
    if (includes_ == null)
        return 0;
    return includes_.length;
  }

  public static String filterChars(String text)
  {
    if (text == null)
        return null;

    StringBuffer buf = new StringBuffer();
    for (int i = 0; i < text.length(); i++) {
        char c = text.charAt(i);
        if (c == '<')
            buf.append(" less than ");
        else if (c == '>')
            buf.append(" greater than ");
        else if (c == '\'' || c == '\"')
            buf.append(" quote ");
        else if (c == '&')
            buf.append(" and ");
        else
            buf.append(c);
    }

    return buf.toString();
  }

  public static String removeChars(String text)
  {
    if (text == null)
        return null;

    StringBuffer buf = new StringBuffer();
    for (int i = 0; i < text.length(); i++) {
        char c = text.charAt(i);
        if (c == '<' || c == '>' || c == '\'' || c == '\"' || c == '&')
            buf.append(' ');
        else
            buf.append(c);
    }

    return buf.toString();
  }


  protected Message msg_ = null;
  protected String newContent_ = null;
  protected String oldContent_ = null;
  protected Part[] includes_ = null;
}