<?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 2024-06-17 -->
<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 Project &#x2013; Overview</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="author" content="Mailet API Project" />
    <meta name="Date-Revision-yyyymmdd" content="20240617" />
    <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="../../index.html" id="bannerLeft" title="james-logo.png">
              
                                                                            
        <img src="../../images/logos/james-logo.png" alt="James Project" />
                </a>
                              <a href="https://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: 2024-06-17</span>
                      </div>
            <div class="xright">                    <a href="../../index.html" title="Home">Home</a>
            |
                        <a href="../../documentation.html" title="James">James</a>
            |
                        <a href="../../mime4j/index.html" title="Mime4J">Mime4J</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>
              
                
      </div>
      <div class="clear">
        <hr/>
      </div>
    </div>
    <div id="leftColumn">
      <div id="navcolumn">
             
                
                                <h5>James components</h5>
                  <ul>
                                                                                                                                                                                                                    <li class="collapsed">
                          <a href="../../documentation.html" title="About James">About James</a>
                  </li>
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      <li class="collapsed">
                          <a href="../../server/index.html" title="Server">Server</a>
                  </li>
                                                                                                                                                                                                                                                                  <li class="expanded">
                          <a href="../../mailet/index.html" title="Mailets">Mailets</a>
                    <ul>
                      <li class="none">
                          <a href="../../mailet/quickstart.html" title="Quick Start">Quick Start</a>
            </li>
                      <li class="none">
            <strong>Mailet API</strong>
          </li>
                      <li class="none">
                          <a href="../../mailet/base/index.html" title="Basic Mailet Toolkit">Basic Mailet Toolkit</a>
            </li>
                      <li class="none">
                          <a href="../../mailet/standard/index.html" title="Standard Mailets">Standard Mailets</a>
            </li>
                      <li class="none">
                          <a href="../../mailet/crypto/index.html" title="Crypto Mailets">Crypto Mailets</a>
            </li>
                      <li class="none">
                          <a href="../../mailet/ai/index.html" title="Mailet AI">Mailet AI</a>
            </li>
                      <li class="none">
                          <a href="../../mailet/mailetdocs-maven-plugin/index.html" title="MailetDocs">MailetDocs</a>
            </li>
                      <li class="none">
                          <a href="../../mailet/release-notes.html" title="Release Notes">Release Notes</a>
            </li>
                      <li class="none">
                          <a href="../../mailet/apidocs" title="Java Docs">Java Docs</a>
            </li>
                      <li class="none">
                          <a href="https://issues.apache.org/jira/browse/MAILET" title="Issue Tracker">Issue Tracker</a>
            </li>
                      <li class="none">
                          <a href="httsp://james.apache.org/download.cgi#Apache_Mailet" title="Download releases">Download releases</a>
            </li>
              </ul>
        </li>
                                                                                                                                                                                                                                                                                      <li class="collapsed">
                          <a href="../../mailbox/index.html" title="Mailbox">Mailbox</a>
                  </li>
                                                                                                                                                                                <li class="collapsed">
                          <a href="../../protocols/index.html" title="Protocols">Protocols</a>
                  </li>
                                                                                                                                                                                      <li class="collapsed">
                          <a href="../../mpt/index.html" title="MPT">MPT</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">
        

    
        <section>
<h2><a name="What_is_the_Apache_Mailet_API.3F"></a>What is the Apache Mailet API?</h2>
            
<p>
                The Apache Mailet API is a Java API which allows the rapid development and flexible deployment of email
                processing functionality.
            </p>
            
<p>
                The Mailet API is a subproject of <a class="externalLink" href="http://james.apache.org">Apache James</a>.
                All who are interested in developing the Mailet API and James will be warmly
                welcomed on the <a href="/mail-lists.html">mailing lists</a>.
            </p>
        </section>
        <section>
<h2><a name="Quick_Start"></a>Quick Start</h2>
            <section>
<h3><a name="What_Is_A_Mailet.3F"></a>What Is A Mailet?</h3>
                
<p>
                    A mailet is a mail processing component. Though there are some differences, a servlet as a HTTP
                    processing component is a useful analogy.
                </p>
                
<p>
                    Mailets implement <a href="/mailet/apidocs/org/apache/mailet/Mailet.html">Mailet</a>.
                    Mailets execute within a mailet container.
                    <a class="externalLink" href="http://james.apache.org/server">James server</a>
                    is a well known mailet container. Assembly and configuration of mailets and mail processors is the
                    responsibility of the particular container.
                </p>
                </section><section>
<h3><a name="Mailet_Basic_Lifecycle"></a>Mailet Basic Lifecycle</h3>
                    
<p>
                        Mailets have a simple lifecycle managed by the mailet container:
                    </p>
                    
<ol style="list-style-type: decimal">
                        
<li>
                            <b>
                                <code>init(
                                    <a href="apidocs/org/apache/mailet/MailetConfig.html">MailetConfig</a>
                                    config)
                                </code>
                            </b>
                            passes environmental information. Any setup necessary should be performed now.
                        </li>
                        
<li>During processing,
                            <b>
                                <code>service(
                                    <a href="apidocs/org/apache/mailet/Mail.html">Mail</a>
                                    mail)
                                </code>
                            </b>
                            is called repeatedly. Note that this method may be called concurrently.
                        </li>
                        
<li>
                            <b>
                                <code>destroy()</code>
                            </b>
                            is called when the mailet is taken out of service.
                        </li>
                    </ol>
                </section>
                <section>
<h3><a name="Configuration"></a>Configuration</h3>
                    
<p>
                        <a href="apidocs/org/apache/mailet/MailetConfig.html">MailetConfig</a>
                        gives access to simple parametrization.
                        <code>getInitParameter</code>
                        allows configuration parameters to be passed from the mailet container.
                        How these parameters are set by the user of the mailet is the responsibility of the container.
                        More sophisticated configuration and assembly (for example, allowing access to services) is also
                        the responsibility of the container.
                    </p>
                </section>
                <section>
<h3><a name="Communication_With_The_Container"></a>Communication With The Container</h3>
                    
<p>
                        <a href="apidocs/org/apache/mailet/MailetConfig.html">MailetConfig</a>
                        allows communication with the container
                        by calling getMailetContext(). See
                        <a href="apidocs/org/apache/mailet/MailetContext.html">MailetContext</a>
                        for more details.
                    </p>
                </section>
                <section>
<h3><a name="Basic_Toolkit"></a>Basic Toolkit</h3>
                    
<p>
                        The
                        <a class="externalLink" href="http://james.apache.org/mailet/base">Basic Mailet Toolkit</a>
                        collects lightweight frameworks and utilities likely to be useful for general mailet developers.
                    </p>
                </section>
            
            <section>
<h3><a name="Examples"></a>Examples</h3>
                
<p>
                    See <a class="externalLink" href="http://james.apache.org/mailet/standard">Standard mailets</a>.
                </p>
            </section>
            <section>
<h3><a name="Building_the_Mailet_API"></a>Building the Mailet API</h3>
                
<p>
                    The build uses <a class="externalLink" href="http://ant.apache.org">Ant</a>.
                    <code>ant -projecthelp</code>
                    describes appropriate targets.
                    <code>ant</code>
                    runs the default target.
                </p>
            </section>
        </section>

        <section>
<h2><a name="Comments.2C_Questions_and_Issues"></a>Comments, Questions and Issues</h2>
            
<p>Please direct your feedback to the <a href="mail-lists.html">mailet-api mailing list</a>.
            </p>
        </section>
    

      </div>
    </div>
    <div class="clear">
      <hr/>
    </div>
    <div id="footer">
      <div class="xright">Copyright &#169;                    2006-2024
                        <a href="https://www.apache.org/">The Apache Software Foundation</a>.
            All Rights Reserved.      
                
      </div>
      <div class="clear">
        <hr/>
      </div>
    </div>
  </body>
</html>
