| <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| <html> |
| <head> |
| <title>James Server - |
| James 2.3 - Writing a Custom Mailet</title> |
| <style type="text/css" media="all"> |
| @import url("./css/maven-base.css"); |
| @import url("./css/maven-theme.css"); |
| @import url("./css/site.css"); |
| </style> |
| <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" /> |
| <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" /> |
| </head> |
| <body class="composite"> |
| <div id="banner"> |
| <a href="http://james.apache.org/index.html" id="bannerLeft"> |
| |
| <img src="images/james-server-logo.gif" alt="" /> |
| |
| </a> |
| <a href="http://www.apache.org/index.html" id="bannerRight"> |
| |
| <img src="images/asf-logo-reduced.gif" alt="" /> |
| |
| </a> |
| <div class="clear"> |
| <hr/> |
| </div> |
| </div> |
| <div id="breadcrumbs"> |
| |
| |
| |
| |
| |
| |
| |
| <div class="xleft"> |
| Last Published: 05/28/2009 |
| </div> |
| <div class="xright"> <a href="../../index.html">JAMES Project</a> |
| | |
| <a href="../../server/index.html">Server</a> |
| | |
| <a href="../../mailet/index.html">Mailets</a> |
| | |
| <a href="../../jspf/index.html">jSPF</a> |
| | |
| <a href="../../mime4j/index.html">Mime4J</a> |
| | |
| <a href="../../jsieve/index.html">JSieve</a> |
| | |
| <a href="../../postage/index.html">Postage</a> |
| |
| |
| |
| |
| |
| |
| |
| </div> |
| <div class="clear"> |
| <hr/> |
| </div> |
| </div> |
| <div id="leftColumn"> |
| <div id="navcolumn"> |
| |
| |
| |
| |
| |
| |
| |
| <h5>James Server</h5> |
| <ul> |
| |
| <li class="none"> |
| <a href="../index.html">Overview</a> |
| </li> |
| |
| <li class="none"> |
| <a href="../design_objectives.html">Objectives</a> |
| </li> |
| |
| |
| |
| |
| |
| <li class="expanded"> |
| <a href="../FAQ.html">James FAQ</a> |
| <ul> |
| |
| <li class="none"> |
| <a href="../james_and_sendmail.html">James and Sendmail</a> |
| </li> |
| </ul> |
| </li> |
| |
| <li class="none"> |
| <a href="http://wiki.apache.org/james">Wiki</a> |
| </li> |
| |
| <li class="none"> |
| <a href="../rfclist.html">Useful RFCs</a> |
| </li> |
| </ul> |
| <h5>Overview</h5> |
| <ul> |
| |
| <li class="none"> |
| <a href="index.html">Introduction</a> |
| </li> |
| |
| <li class="none"> |
| <a href="release-notes.html">Release Notes</a> |
| </li> |
| |
| <li class="none"> |
| <a href="jira-report.html">Changes</a> |
| </li> |
| </ul> |
| <h5>Concepts</h5> |
| <ul> |
| |
| <li class="none"> |
| <a href="summary.html">Summary</a> |
| </li> |
| |
| <li class="none"> |
| <a href="spoolmanager.html">SpoolManager</a> |
| </li> |
| |
| <li class="none"> |
| <a href="repositories.html">Repositories</a> |
| </li> |
| |
| <li class="none"> |
| <a href="mailet_api.html">The Mailet API</a> |
| </li> |
| </ul> |
| <h5>How to...</h5> |
| <ul> |
| |
| <li class="none"> |
| <a href="build_instructions.html">Build James</a> |
| </li> |
| |
| <li class="none"> |
| <a href="installation_instructions.html">Install James</a> |
| </li> |
| </ul> |
| <h5>Mailets</h5> |
| <ul> |
| |
| <li class="none"> |
| <a href="http://james.apache.org/mailet/index.html">Overview</a> |
| </li> |
| |
| <li class="none"> |
| <a href="http://james.apache.org/mailet/api/index.html">API</a> |
| </li> |
| |
| <li class="none"> |
| <a href="http://james.apache.org/mailet/base/index.html">Basic Toolkit</a> |
| </li> |
| |
| <li class="none"> |
| <a href="http://james.apache.org/mailet/crypto/index.html">Crypto</a> |
| </li> |
| |
| <li class="none"> |
| <a href="http://james.apache.org/mailet/standard/index.html">Sieve</a> |
| </li> |
| |
| <li class="none"> |
| <a href="http://james.apache.org/mailet/maven-mailetdocs-plugin/index.html">MailetDocs</a> |
| </li> |
| |
| <li class="none"> |
| <a href="james-server-mailets-function/mailet-report.html">Server</a> |
| </li> |
| |
| <li class="none"> |
| <a href="http://james.apache.org/mailet/standard/index.html">Standard</a> |
| </li> |
| </ul> |
| <h5>Configuration</h5> |
| <ul> |
| |
| <li class="none"> |
| <a href="dns_configuration.html">DNS Server</a> |
| </li> |
| |
| <li class="none"> |
| <a href="pop3_configuration.html">POP3 Server</a> |
| </li> |
| |
| <li class="none"> |
| <a href="smtp_configuration.html">SMTP Server</a> |
| </li> |
| |
| <li class="none"> |
| <a href="nntp_configuration.html">NNTP Server</a> |
| </li> |
| |
| <li class="none"> |
| <a href="fetchmail_configuration.html">FetchMail</a> |
| </li> |
| |
| <li class="none"> |
| <a href="remotemanager_configuration.html">RemoteManager</a> |
| </li> |
| |
| <li class="none"> |
| <a href="spoolmanager_configuration.html">SpoolManager</a> |
| </li> |
| |
| <li class="none"> |
| <a href="serverwide_configuration.html">Server-wide</a> |
| </li> |
| |
| <li class="none"> |
| <a href="adding_users.html">Adding Users</a> |
| </li> |
| |
| <li class="none"> |
| <a href="provided_matchers.html">Provided Matchers</a> |
| </li> |
| |
| <li class="none"> |
| <a href="provided_mailets.html">Provided Mailets</a> |
| </li> |
| </ul> |
| <h5>Common Configurations</h5> |
| <ul> |
| |
| <li class="none"> |
| <a href="smtp_auth.html">Using SMTP AUTH</a> |
| </li> |
| |
| <li class="none"> |
| <a href="using_database.html">Using a Database with James</a> |
| </li> |
| |
| <li class="none"> |
| <a href="usingTLS.html">Using TLS/SSL</a> |
| </li> |
| |
| <li class="none"> |
| <a href="mailing_lists.html">Creating Mailing Lists</a> |
| </li> |
| </ul> |
| <h5>Customization</h5> |
| <ul> |
| |
| <li class="none"> |
| <a href="custom_matcher.html">How to write a custom Matcher</a> |
| </li> |
| |
| <li class="none"> |
| <strong>How to write a custom Mailet</strong> |
| </li> |
| </ul> |
| <h5>Project Documentation</h5> |
| <ul> |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| <li class="collapsed"> |
| <a href="project-info.html">Project Information</a> |
| </li> |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| <li class="collapsed"> |
| <a href="project-reports.html">Project Reports</a> |
| </li> |
| </ul> |
| <h5>Project</h5> |
| <ul> |
| |
| <li class="none"> |
| <a href="http://issues.apache.org/jira/browse/JAMES">Bug Database</a> |
| </li> |
| |
| <li class="none"> |
| <a href="http://svn.apache.org/viewvc/james/server/">Source Code</a> |
| </li> |
| |
| <li class="none"> |
| <a href="../todo.html">TODO</a> |
| </li> |
| </ul> |
| <h5>Downloads</h5> |
| <ul> |
| |
| <li class="none"> |
| <a href="../../download.cgi">Stable releases</a> |
| </li> |
| |
| <li class="none"> |
| <a href="../../downloadunstable.cgi">Unstable releases</a> |
| </li> |
| |
| <li class="none"> |
| <a href="http://people.apache.org/builds/james/nightly/">Nightly builds</a> |
| </li> |
| </ul> |
| <a href="http://maven.apache.org/" title="Built by Maven" id="poweredBy"> |
| <img alt="Built by Maven" src="./images/logos/maven-feather.png"></img> |
| </a> |
| |
| |
| |
| |
| |
| |
| |
| </div> |
| </div> |
| <div id="bodyColumn"> |
| <div id="contentBox"> |
| |
| |
| |
| |
| |
| <a name="Writing a Custom Mailet"></a><div class="section"><h2>Writing a Custom Mailet</h2> |
| <p>Implementing a custom mailet is generally a simple task, most of whose complexity |
| lies in coding the actual work to be done by the mailet. This is largely due to the |
| simplicity of the Mailet interface and the fact that a GenericMailet class is provided |
| as part of the Mailet package.</p> |
| <p>In this discussion we will assume that any mailet being implemented is a subclass of |
| GenericMailet. The GenericMailet class serves to abstract away of the configuration and |
| logging details. While it provides a noop implementation of the init() and destroy() methods, |
| these can be easily overridden to provide useful functionality.</p> |
| <p>In general, the only four methods that you should need to implement are init(), destroy(), |
| getMailetInfo(), and service(Mail). And only the last is required in all cases.</p> |
| <a name="Configuration"></a><div class="section"><h3>Configuration</h3> |
| <p>As described in the <a href="spoolmanager_configuration.html">SpoolManager configuration |
| section</a>, mailets are configured with a set of String (name, value) pairs. These values are |
| passed into the Mailet upon initialization (although the details of this process are hidden by |
| the GenericMailet implementation). GenericMailet provides access to this configuration |
| information through use of the getInitParameter(String) method. Passing in the name of the |
| requested configuration value will yield the value if set, and null otherwise. Configuration |
| values are available inside the init(), destroy(), and service(Mail) methods.</p> |
| </div> |
| <a name="Logging"></a><div class="section"><h3>Logging</h3> |
| <p>There is a simple logging mechanism provided by the Mailet API. It does not support |
| logging levels, so any log filtering will have to be implemented in the Mailet code. |
| Logging is done by calling one of the two logging methods on GenericMailet - log(String) |
| or log(String,Throwable). Logging is available inside the init(), destroy(), and service(Mail) |
| methods.</p> |
| <p>The value of getMailetInfo() for the Mailet is prepended to the log entries for that |
| Mailet. So it may be desirable for you to override this method so you can distinguish mailet |
| log entries by Mailet.</p> |
| </div> |
| <a name="Initialization"></a><div class="section"><h3>Initialization</h3> |
| <p>As part of the Mailet lifecycle, a Mailet is guaranteed to be initialized immediately after |
| being instantiated. This happens once and only once for each Mailet instance. The |
| Initialization phase is where configuration parsing and per-Mailet resource creation generally |
| take place. Depending on your Mailet, it may or may not be necessary to do any initialization |
| of the mailet. Initialization logic is implemented by overriding the init() method of |
| GenericMailet.</p> |
| </div> |
| <a name="Servicing"></a><div class="section"><h3>Servicing</h3> |
| <p>The bulk of the Mailet logic is expected to be invoked from the service(Mail) method. This |
| method is invoked each time a mail message is to be processed by the mailet. The message is |
| passed in as an instance of the Mail interface, which is part of the Mailet API.</p> |
| <p>The Mail interface is essentially a light wrapper around JavaMail's MimeMessage class with a |
| few important differences. See the Javadoc for the interface for a description of the additional |
| methods available on this wrapper.</p> |
| </div> |
| <a name="Destruction"></a><div class="section"><h3>Destruction</h3> |
| <p>As part of the Mailet lifecycle, a Mailet is guaranteed to be destroyed when the container |
| cleans up the Mailet. This happens once and only once for each Mailet instance. The |
| Destruction phase is where per-Mailet resource release generally takes place. Depending |
| on your Mailet, it may or may not be necessary to do any destruction |
| of the mailet. Destruction logic is implemented by overriding the destroy() method of |
| GenericMailet.</p> |
| </div> |
| </div> |
| <a name="Deploying a Custom Mailet"></a><div class="section"><h2>Deploying a Custom Mailet</h2> |
| <p>Once a Mailet has been successfully implemented there are only a couple of |
| additional steps necessary to actually deploy the Mailet.</p> |
| <a name="Adding Your Mailet to the Classpath"></a><div class="section"><h3>Adding Your Mailet to the Classpath</h3> |
| <p> |
| The Mailet must be added to James' classpath so that the Mailet can be loaded by James. There |
| are three ways to add a custom Mailet to the classpath so that James will be able to load the |
| Mailet. These are: |
| </p> |
| <p> |
| 1a. Download the source distribution, add a jar file containing the custom files to the lib |
| directory of the unpacked source distribution, and build a new .sar file by following the |
| directions <a href="build_instructions.html">here</a>. This new .sar file will now |
| include your custom classes. |
| </p> |
| <p> |
| or |
| </p> |
| <p> |
| 1b. Place a jar file containing the custom class files in the lib subdirectory of the James |
| installation. It will also be necessary to unpack the JavaMail and James jar files from |
| the provided .sar file and add them to this directory. |
| </p> |
| <p> |
| or |
| </p> |
| <p> |
| 1c. Place a jar file containing the custom class files in the path/to/james/apps/james/SAR-INF/lib subdirectory. |
| Please note that you must start james once to get the apps/james/SAR-INF directory created. After that is done create |
| the lib directory and copy the jar to the directory. |
| </p> |
| <p> |
| 2. After this is done get sure you add the mailet package to the config.xml. For example: |
| <p> |
| <div class="source"><pre> |
| <!-- Set the Java packages from which to load mailets and matchers --> |
| <mailetpackages> |
| <mailetpackage>org.apache.james.transport.mailets</mailetpackage> |
| <mailetpackage>org.apache.james.transport.mailets.smime</mailetpackage> |
| <mailetpackage>your.costum.package.transport-mailets</mailetpackage> |
| </mailetpackages> |
| </pre></div> |
| </p> |
| After that restart james. |
| </p> |
| </div> |
| <a name="James Configuration"></a><div class="section"><h3>James Configuration</h3> |
| <p>Configuration of the processor chain is discussed |
| <a href="spoolmanager_configuration.html">elsewhere</a> in this documentation. The |
| details of configuring mailet deployment is discussed at length. Here we will only comment |
| that it is important to add the appropriate mailet package for your custom mailet to the |
| <mailetpackages> list and that the name of your mailet should not conflict with any of |
| the mailets described <a href="provided_mailets.html">here</a>. |
| </p> |
| </div> |
| </div> |
| |
| |
| </div> |
| </div> |
| <div class="clear"> |
| <hr/> |
| </div> |
| <div id="footer"> |
| <div class="xright">© |
| 2002-2009 |
| |
| The Apache Software Foundation |
| |
| |
| |
| |
| |
| |
| |
| </div> |
| <div class="clear"> |
| <hr/> |
| </div> |
| </div> |
| <script src="http://www.google-analytics.com/urchin.js" type="text/javascript"> |
| </script> |
| <script type="text/javascript"> |
| _uacct = "UA-1384591-1"; |
| urchinTracker(); |
| </script> |
| </body> |
| </html> |