Package org.jasen.core.parsers

Source Code of org.jasen.core.parsers.StandardMimeMessageParser

/*
* @(#)StandardMimeMessageParser.java  31/10/2004
*
* Copyright (c) 2004, 2005  jASEN.org
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
*   1. Redistributions of source code must retain the above copyright notice,
*      this list of conditions and the following disclaimer.
*
*   2. Redistributions in binary form must reproduce the above copyright
*      notice, this list of conditions and the following disclaimer in
*      the documentation and/or other materials provided with the distribution.
*
*   3. The names of the authors may not be used to endorse or promote products
*      derived from this software without specific prior written permission.
*
*   4. Any modification or additions to the software must be contributed back
*      to the project.
*
*   5. Any investigation or reverse engineering of source code or binary to
*      enable emails to bypass the filters, and hence inflict spam and or viruses
*      onto users who use or do not use jASEN could subject the perpetrator to
*      criminal and or civil liability.
*
* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JASEN.ORG,
* OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*/
package org.jasen.core.parsers;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

import javax.mail.Address;
import javax.mail.MessagingException;
import javax.mail.Part;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.ParseException;

import org.jasen.core.StandardJasenMessage;
import org.jasen.error.ErrorHandlerBroker;
import org.jasen.error.JasenParseException;
import org.jasen.error.ParseErrorType;
import org.jasen.interfaces.JasenMessage;
import org.jasen.interfaces.MimeMessageParser;
import org.jasen.util.MimeType;
import org.jasen.util.MimeUtils;


/**
* <P>
*   A simple implementation of a mime message parser.
* </P>
* <p>
*   This is the default parser used by JASEN, however implementors may consider creating their own
* </p>
* @author Jason Polites
*/
public class StandardMimeMessageParser implements MimeMessageParser
{

    /**
     *
     */
    public StandardMimeMessageParser() {
        super ();
    }

    /* (non-Javadoc)
     * @see org.jasen.interfaces.MimeParser#parse(javax.mail.internet.MimeMessage)
     */
    public JasenMessage parse(MimeMessage mm) throws JasenParseException {

        try
        {
            List parts = new LinkedList ();
            StandardJasenMessage message = null;

            InternetAddress from = null;

            try
            {
                MimeUtils.getParts (parts, mm);

                message = new StandardJasenMessage ();

                message.setTextPart ((String) MimeUtils.getPartContent (MimeUtils.getFirstPartFromList (parts, MimeType.TEXT_PLAIN, null)));
                message.setHtmlPart ((String) MimeUtils.getPartContent (MimeUtils.getFirstPartFromList (parts, MimeType.TEXT_HTML, null)));

                from = getFromSafe(mm);

                if(from == null) {
                    throw new JasenParseException("Empty from", ParseErrorType.MALFORMED_MIME);
                }

                message.setFrom(from);

                if(mm.getHeader("x-envelope-sender") != null) {
                    message.setEnvelopeSender(mm.getHeader("x-envelope-sender")[0]);
                }
                else
                {
                    message.setEnvelopeSender(message.getFrom().getAddress());
                }

                // Get attachments
                List attachments = MimeUtils.getAllAttachmentParts (parts);

                if (attachments != null && attachments.size () > 0)
                {

                    String[] attachmentNames = new String[attachments.size ()];

                    Iterator i = attachments.iterator ();

                    int count = 0;

                    Part p = null;

                    while (i.hasNext ())
                    {
                        p = (Part) i.next ();
                        try
                        {
                            attachmentNames[count] = p.getFileName ();
                            count++;
                        }
                        catch (MessagingException e)
                        {
                            // Ignore this
                            ErrorHandlerBroker.getInstance().getErrorHandler().handleException(e);
                        }

                    }

                    message.setAttachmentNames (attachmentNames);
                }

            }
            catch (ParseException e)
            {
                throw new JasenParseException (e, ParseErrorType.MALFORMED_MIME);
            }
            catch (UnsupportedEncodingException e)
            {
                throw new JasenParseException (e, ParseErrorType.UNSUPPORTED_ENCODING);
            }
            catch (MessagingException e)
            {
                throw new JasenParseException (e, ParseErrorType.PARSE_ERROR);
            }

            return message;
        }
        catch (IOException e)
        {
            throw new JasenParseException (e, ParseErrorType.PARSE_ERROR);
        }

    }


    /**
     * "Safely" gets the from header.  If the from header is unavailable, returns the Reply-To.
     * <br/>
     * If Reply-To is unavailable, gets Return-Path
     * @param mm
     * @return The contents of the From, Reply-To or Return-Path header
     * @throws MessagingException
     */
    public InternetAddress getFromSafe(MimeMessage mm) throws MessagingException {
        InternetAddress from = null;

        Address[] froms = mm.getFrom();


        if(froms != null && froms.length > 0) {
            from = MimeUtils.toInternetAddress(froms[0], false);
        }
        else {
            // try the reply to
            String[] headers = mm.getHeader("Reply-To");

            if(headers != null && headers.length > 0) {
                from = InternetAddress.parse(headers[0], false)[0];
            }
            else
            {
                // try return path
                headers = mm.getHeader("Return-Path");

                if(headers != null && headers.length > 0) {
                    from = InternetAddress.parse(headers[0], false)[0];
                }
            }
        }

        return from;
    }
}
TOP

Related Classes of org.jasen.core.parsers.StandardMimeMessageParser

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.