| <?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 – 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> |
| | <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("mime.msg")); |
| for (EntityState state = stream.getState(); |
| state != EntityState.T_END_OF_STREAM; |
| state = stream.next()) { |
| switch (state) { |
| case T_BODY: |
| System.out.println("Body detected, contents = " |
| + stream.getInputStream() + ", header data = " |
| + stream.getBodyDescriptor()); |
| break; |
| case T_FIELD: |
| System.out.println("Header field detected: " |
| + stream.getField()); |
| break; |
| case T_START_MULTIPART: |
| System.out.println("Multipart message detexted," |
| + " header data = " |
| + 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("Body detected, contents = " |
| + is + ", header data = " + bd); |
| } |
| public void field(String fieldData) throws MimeException { |
| System.out.println("Header field detected: " |
| + fieldData); |
| } |
| public void startMultipart(BodyDescriptor bd) throws MimeException { |
| System.out.println("Multipart message detexted, header data = " |
| + 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("mime.msg"));</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 © 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> |