
~~   Licensed to the Apache Software Foundation (ASF) under one
~~   or more contributor license agreements.  See the NOTICE file
~~   distributed with this work for additional information
~~   regarding copyright ownership.  The ASF licenses this file
~~   to you under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0
~~
~~   Unless required by applicable law or agreed to in writing,
~~   software distributed under the License is distributed on an
~~   "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
~~   KIND, either express or implied.  See the License for the
~~   specific language governing permissions and limitations
~~   under the License.

 -------------
 Status
 -------------

{Status}

    The 0.4 release brought a number of significant improvements in terms of 
    supported capabilities, flexibility and performance.

    The 0.5 release addressed a number of important issues discovered since
    the 0.4 release. In particular it improved Mime4j ability to deal with
    malformed data streams including those intentionally crafted to cause 
    excessive CPU and memory utilization that can lead to DoS conditions.

    The 0.6 release brought another round of API enhancements and performance 
    optimizations. As of this release Mime4j requires a Java 1.5 compatible 
    runtime.    
    
    The next release will be version 0.7. The main focus of the development 
    efforts will be on optimization of MIME header parsing and further 
    enhancement of DOM capabilities.
