blob: ba8b13d1dd753c8d2d4a3bb3dba4aa70f979e105 [file] [log] [blame]
<?xml version="1.0" encoding="UTF-8"?>
<!--
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.
-->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<!-- Generated by Apache Maven Doxia at 2017-06-15 -->
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Apache James Mime4J &#x2013; Usage</title>
<style type="text/css" media="all">
@import url("./css/james.css");
@import url("./css/maven-base.css");
@import url("./css/maven-theme.css");
@import url("./css/site.css");
@import url("./js/jquery/css/custom-theme/jquery-ui-1.8.5.custom.css");
@import url("./js/jquery/css/print.css");
@import url("./js/fancybox/jquery.fancybox-1.3.4.css");
</style>
<script type="text/javascript" src="./js/jquery/js/jquery-1.4.2.min.js"></script>
<script type="text/javascript" src="./js/jquery/js/jquery-ui-1.8.5.custom.min.js"></script>
<script type="text/javascript" src="./js/fancybox/jquery.fancybox-1.3.4.js"></script>
<link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
<meta name="Date-Revision-yyyymmdd" content="20170615" />
<meta http-equiv="Content-Language" content="en" />
<!-- Google Analytics -->
<script type="text/javascript">
var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-1384591-1']);
_gaq.push(['_trackPageview']);
(function() {
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
var s = document.getElementsByTagName('script').item(0); s.parentNode.insertBefore(ga, s);
})();
</script>
</head>
<body class="composite">
<div id="banner">
<a href="../" id="bannerLeft" title="james-logo.png">
<img src="images/logos/james-logo.png" alt="JAMES Mime4J" />
</a>
<a href="http://www.apache.org/index.html" id="bannerRight">
<img src="images/logos/asf_logo_small.png" alt="The Apache Software Foundation" />
</a>
<div class="clear">
<hr/>
</div>
</div>
<div id="breadcrumbs">
<div class="xleft">
<span id="publishDate">Last Published: 2017-06-15</span>
&nbsp;| <span id="projectVersion">Version: 0.8.2-SNAPSHOT</span>
</div>
<div class="xright"> <a href="../index.html" title="Home">Home</a>
|
<a href="../documentation.html" title="Server">Server</a>
|
<a href="../jsieve/index.html" title="jSieve">jSieve</a>
|
<a href="../jspf/index.html" title="jSPF">jSPF</a>
|
<a href="../jdkim/index.html" title="jDKIM">jDKIM</a>
|
<a href="../hupa/index.html" title="Hupa">Hupa</a>
</div>
<div class="clear">
<hr/>
</div>
</div>
<div id="leftColumn">
<div id="navcolumn">
<h5>MIME4J</h5>
<ul>
<li class="none">
<a href="index.html" title="Overview">Overview</a>
</li>
<li class="none">
<a href="status.html" title="Status">Status</a>
</li>
<li class="none">
<a href="samples.html" title="Example">Example</a>
</li>
<li class="none">
<strong>Usage</strong>
</li>
<li class="none">
<a href="../mail.html#Mime4j" title="Mailing List">Mailing List</a>
</li>
<li class="none">
<a href="apidocs/index.html" title="Javadoc">Javadoc</a>
</li>
<li class="none">
<a href="http://issues.apache.org/jira/browse/MIME4J/" title="Issue Tracker">Issue Tracker</a>
</li>
<li class="collapsed">
<a href="start/download.html" title="Developper corner">Developper corner</a>
</li>
<li class="none">
<a href="../download.cgi#Apache_Mime4J" title="Download Releases">Download Releases</a>
</li>
</ul>
<h5>Apache Software Foundation</h5>
<ul>
<li>
<strong>
<a title="ASF" href="http://www.apache.org/">ASF</a>
</strong>
</li>
<li>
<a title="Get Involved" href="http://www.apache.org/foundation/getinvolved.html">Get Involved</a>
</li>
<li>
<a title="FAQ" href="http://www.apache.org/foundation/faq.html">FAQ</a>
</li>
<li>
<a title="License" href="http://www.apache.org/licenses/" >License</a>
</li>
<li>
<a title="Sponsorship" href="http://www.apache.org/foundation/sponsorship.html">Sponsorship</a>
</li>
<li>
<a title="Thanks" href="http://www.apache.org/foundation/thanks.html">Thanks</a>
</li>
<li>
<a title="Security" href="http://www.apache.org/security/">Security</a>
</li>
</ul>
<a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy">
<img class="poweredBy" alt="Built by Maven" src="./images/logos/maven-feather.png" />
</a>
</div>
</div>
<div id="bodyColumn">
<div id="contentBox">
<div class="section">
<h2><a name="Usage">Usage</a></h2>
<p>Mime4j provides two different API's: An event based API by using the <a href="./apidocs/org/apache/james/mime4j/parser/MimeStreamParser.html"> MimeStreamParser</a>. Alternatively, you may use the iterative API, which is available through the <a href="./apidocs/org/apache/james/mime4j/parser/MimeTokenStream.html"> MimeTokenStream</a>. In terms of speed, you should not note any differences.</p>
<ul>
<li><a href="#Token_Streams">Token Streams</a></li>
<li><a href="#Sample_Token_Stream">Sample Token Stream</a></li>
<li><a href="#Event_Handlers">Event Handlers</a></li>
<li><a href="#Sample_Event_Stream">Sample Event Stream</a></li></ul></div>
<div class="section">
<h2><a name="Token_Streams">Token Streams</a></h2>
<p>The iterative approach is using the class <a href="./apidocs/org/apache/james/mime4j/parser/MimeTokenStream.html"> MimeTokenStream</a>. Here's an example, how you could use the token stream:</p>
<div>
<pre> MimeTokenStream stream = new MimeTokenStream();
stream.parse(new FileInputStream(&quot;mime.msg&quot;));
for (EntityState state = stream.getState();
state != EntityState.T_END_OF_STREAM;
state = stream.next()) {
switch (state) {
case T_BODY:
System.out.println(&quot;Body detected, contents = &quot;
+ stream.getInputStream() + &quot;, header data = &quot;
+ stream.getBodyDescriptor());
break;
case T_FIELD:
System.out.println(&quot;Header field detected: &quot;
+ stream.getField());
break;
case T_START_MULTIPART:
System.out.println(&quot;Multipart message detexted,&quot;
+ &quot; header data = &quot;
+ stream.getBodyDescriptor());
...
}
}</pre></div>
<p>The token stream provides a set of tokens. Tokens are identified by a state. Most states are simply event indicators, with no additional data available. However, there are some states, which provide additional data. For example, the state <tt>T_BODY</tt>, which indicates that an actual body is available, If you note this state, then you may ask for the bodies contents, which are provided through the <tt>getInputStream()</tt> method, or you might ask for the header data by invoking <tt>getBodyDescriptor()</tt>.</p></div>
<div class="section">
<h2><a name="Sample_Token_Stream">Sample Token Stream</a></h2>
<p>The following sample should give you a rough idea of the order, in which you'll receive tokens:</p>
<div>
<pre> T_START_MESSAGE
T_START_HEADER
T_FIELD
T_FIELD
...
T_END_HEADER
T_START_MULTIPART
T_PREAMBLE
T_START_BODYPART
T_START_HEADER
T_FIELD
T_FIELD
...
T_END_HEADER
T_BODY
T_END_BODYPART
T_START_BODYPART
T_START_HEADER
T_FIELD
T_FIELD
...
T_END_HEADER
T_BODY
T_END_BODYPART
T_EPILOGUE
T_END_MULTIPART
T_END_MESSAGE</pre></div>
<p>The example shows a multipart message with two parts.</p></div>
<div class="section">
<h2><a name="Event_Handlers">Event Handlers</a></h2>
<p>The event based API requires, that you provide an event handler, which receives events. The event handler is an object, which implements the <a href="./apidocs/org/apache/james/mime4j/parser/ContentHandler.html"> ContentHandler</a> interface. Here's an example, how you could implement an event handler:</p>
<div>
<pre> public class MyContentHandler extends AbstractContentHandler {
public void body(BodyDescriptor bd, InputStream is)
throws MimeException, IOException {
System.out.println(&quot;Body detected, contents = &quot;
+ is + &quot;, header data = &quot; + bd);
}
public void field(String fieldData) throws MimeException {
System.out.println(&quot;Header field detected: &quot;
+ fieldData);
}
public void startMultipart(BodyDescriptor bd) throws MimeException {
System.out.println(&quot;Multipart message detexted, header data = &quot;
+ bd);
}
...
}</pre></div>
<p>A little bit of additional code allows us to create an example, which is functionally equivalent to the example from the section on <a href="#Token_Streams">Token Streams</a>:</p>
<div>
<pre> ContentHandler handler = new MyContentHandler();
MimeStreamParser parser = new MimeStreamParser();
parser.setContentHandler(handler);
parser.parse(new FileInputStream(&quot;mime.msg&quot;));</pre></div></div>
<div class="section">
<h2><a name="Sample_Event_Stream">Sample Event Stream</a></h2>
<p>Like above for tokens, we provide an additional example, which demonstrates the typical order of events that you have to expect:</p>
<div>
<pre> startMessage()
startHeader()
field(...)
field(...)
...
endHeader()
startMultipart()
preamble(...)
startBodyPart()
startHeader()
field(...)
field(...)
...
endHeader()
body()
endBodyPart()
startBodyPart()
startHeader()
field(...)
field(...)
...
endHeader()
body()
endBodyPart()
epilogue(...)
endMultipart()
endMessage()</pre></div></div>
</div>
</div>
<div class="clear">
<hr/>
</div>
<div id="footer">
<div class="xright">Copyright &#169; 2004-2017
<a href="https://www.apache.org/">The Apache Software Foundation</a>.
All Rights Reserved.
</div>
<div class="clear">
<hr/>
</div>
</div>
</body>
</html>