<?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 Dec 28, 2012 -->
<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>mailets - 
        Configuration</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="James Project Team" />
    <meta name="Date-Revision-yyyymmdd" content="20121228" />
    <meta http-equiv="Content-Language" content="en" />
                                                    
<link title="DOAP" rel="meta" type="application/rdf+xml" href="http://james.apache.org//doap_james-project.rdf"/>
                      
          <!-- 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-mailets-logo.gif">
              
                                                                            
        <img src="../images/logos/james-mailets-logo.gif" alt="Apache James Project" />
                </a>
                              <a href="http://www.apache.org/index.html" id="bannerRight">
              
                                        
        <img src="images/logos/asf-logo-reduced.gif" alt="The Apache Software Foundation" />
                </a>
            <div class="clear">
        <hr/>
      </div>
    </div>
    <div id="breadcrumbs">
            
                
                <div class="xleft">
        <span id="publishDate">Last Published: 2012-12-28</span>
                      </div>
            <div class="xright">                    <a href="../../index.html" title="Home">Home</a>
            |
                        <a href="../../server/index.html" title="Server">Server</a>
            |
                        <a href="../../hupa/index.html" title="Hupa">Hupa</a>
            |
                        <a href="../../protocols/index.html" title="Protocols">Protocols</a>
            |
                        <a href="../../imap/index.html" title="IMAP">IMAP</a>
            |
                        <a href="../index.html" title="Mailets">Mailets</a>
            |
                        <a href="../../mailbox/index.html" title="Mailbox">Mailbox</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>
            |
                        <a href="../../mpt/index.html" title="MPT">MPT</a>
            |
                        <a href="../../postage/index.html" title="Postage">Postage</a>
              
                
      </div>
      <div class="clear">
        <hr/>
      </div>
    </div>
    <div id="leftColumn">
      <div id="navcolumn">
             
                
                                <h5>Mailet</h5>
                  <ul>
                  <li class="none">
                          <a href="../api" title="Mailet API">Mailet API</a>
            </li>
                  <li class="none">
                          <a href="../ai" title="Mailet AI">Mailet AI</a>
            </li>
                  <li class="none">
                          <a href="../base" title="Basic Mailet Toolkit">Basic Mailet Toolkit</a>
            </li>
                  <li class="none">
                          <a href="../crypto" title="Crypto Mailets">Crypto Mailets</a>
            </li>
                  <li class="none">
                          <a href="../mailetdocs-maven-plugin" title="MailetDocs">MailetDocs</a>
            </li>
                  <li class="none">
                          <a href="../../jsieve/mailet/" title="Sieve Mailet">Sieve Mailet</a>
            </li>
                  <li class="none">
                          <a href="../standard" title="Standard Mailets">Standard Mailets</a>
            </li>
          </ul>
                       <h5>Useful Information</h5>
                  <ul>
                  <li class="none">
                          <a href="../apidocs" title="Java Docs">Java Docs</a>
            </li>
                  <li class="none">
                          <a href="../quickstart.html" title="Quick Start">Quick Start</a>
            </li>
                  <li class="none">
                          <a href="../release-notes.html" title="Release Notes">Release Notes</a>
            </li>
          </ul>
                       <h5>Project Documentation</h5>
                  <ul>
                                                                                      <li class="collapsed">
                          <a href="../project-info.html" title="Project Information">Project Information</a>
                  </li>
                                                                    <li class="collapsed">
                          <a href="../project-reports.html" title="Project Reports">Project Reports</a>
                  </li>
          </ul>
                       <h5>About James</h5>
                  <ul>
                  <li class="none">
                          <a href="../../index.html" title="Overview">Overview</a>
            </li>
                  <li class="none">
                          <a href="../../newsarchive.html" title="News">News</a>
            </li>
                  <li class="none">
                          <a href="../../mail.html" title="Mailing Lists">Mailing Lists</a>
            </li>
                  <li class="none">
                          <a href="../../contribute.html" title="Contributing">Contributing</a>
            </li>
                  <li class="none">
                          <a href="../../guidelines.html" title="Guidelines">Guidelines</a>
            </li>
                  <li class="none">
                          <a href="http://wiki.apache.org/james" title="Wiki">Wiki</a>
            </li>
                  <li class="none">
                          <a href="../../team-list.html" title="Who We Are">Who We Are</a>
            </li>
                  <li class="none">
                          <a href="../../license.html" title="License">License</a>
            </li>
          </ul>
                       <h5>Download</h5>
                  <ul>
                  <li class="none">
                          <a href="../../download.cgi" title="Releases">Releases</a>
            </li>
                  <li class="none">
                          <a href="https://repository.apache.org/content/repositories/snapshots/org/apache/james/" title=""></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">
        <!-- 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. -->
    
        <div class="section"><h2>James Configuration<a name="James_Configuration"></a></h2>
            <p>
                To use cryptography mailets, the required
                <a class="externalLink" href="http://www.bouncycastle.org">Bouncy Castle</a>
                libraries must be installed in
                <tt>james/lib</tt>
                . It is recommended that the correct versions for the JVM are
                used.
            </p>
            <p>
                To use the mailets, the package
                <tt>org.apache.james.mailet.crypto.mailet</tt>
                must be available.
                To use the matchers,
                <tt>org.apache.james.mailet.crypto.matcher</tt>
                must be.
                For example:
            </p>
            <div class="source"><pre>
                <div><pre>
                    &lt;mailetpackages&gt;
                    ...
                    &lt;mailetpackage&gt;org.apache.james.mailet.crypto.mailet&lt;/mailetpackage&gt;
                    &lt;/mailetpackages&gt;
                    &lt;matcherpackages&gt;
                    ...
                    &lt;matcherpackage&gt;org.apache.james.mailet.crypto.matcher&lt;/matcherpackage&gt;
                    &lt;/matcherpackages&gt;
                </pre></div>
            </pre></div>
            <p>Example SMIME mailet configurations:</p>
            <div class="source"><pre>
                <div><pre>
                    &lt;mailet match=&quot;IsSMIMEEncrypted&quot; class=&quot;SMIMEDecrypt&quot;&gt;
                    &lt;keyStoreType&gt;pkcs12&lt;/keyStoreType&gt;
                    &lt;keyStoreFileName&gt;c:/path.pfx&lt;/keyStoreFileName&gt;
                    &lt;keyStorePassword&gt;myKeyStorePass&lt;/keyStorePassword&gt;
                    &lt;keyAlias&gt;myKeyAlias&lt;/keyAlias&gt;
                    &lt;keyAliasPassword&gt;myKeyPass&lt;/keyAliasPassword&gt;
                    &lt;/mailet&gt;

                    &lt;mailet match=&quot;IsSMIMESigned&quot; class=&quot;SMIMECheckSignature&quot;&gt;
                    &lt;keyStoreType&gt;pkcs12&lt;/keyStoreType&gt;
                    &lt;keyStoreFileName&gt;c:/path.pfx&lt;/keyStoreFileName&gt;
                    &lt;keyStorePassword&gt; myKeyStorePass
                    &lt;/keyStorePassword&gt; &lt;strip&gt;false&lt;/strip&gt;
                    &lt;onlyTrusted&gt;true&lt;/onlyTrusted&gt;
                    &lt;/mailet&gt;
                </pre></div>
            </pre></div>
            <br />
            Matcher example: messages signed by trusted users never are spam
            Messages with valid signatures will never be considered spam. This
            can be a valid policy *if* SMIMECheckSignature was invoked with
            true
            set
            <div class="source"><pre>
                <div><pre>
                    &lt;mailet
                    match=&quot;HasMailAttribute=org.apache.james.SMIMECheckSignature&quot;
                    class=&quot;ToProcessor&quot;&gt;
                    &lt;processor&gt;transport&lt;/processor&gt;
                    &lt;/mailet&gt;
                </pre></div>
            </pre></div>
            <p>Signing example: Add a server-side signature to all mail.</p>
            <div class="source"><pre>
                <div><pre>
                    &lt;mailet
                    match=&quot;HasMailAttribute=org.apache.james.SMIMECheckSignature&quot;
                    class=&quot;SetMimeHeader&quot;&gt;
                    &lt;name&gt;X-WasSigned&lt;/name&gt;
                    &lt;value&gt;true&lt;/value&gt;
                    &lt;/mailet&gt;

                    &lt;mailet match=&quot;All&quot; class=&quot;SMIMESign&quot; onMailetException=&quot;ignore&quot;&gt;
                    &lt;keyStoreType&gt;jks&lt;/keyStoreType&gt;
                    &lt;keyStoreFileName&gt;path.keystore&lt;/keyStoreFileName&gt;
                    &lt;keyStorePassword&gt;myKeyStorePass&lt;/keyStorePassword&gt;
                    &lt;keyAlias&gt;myKeyAlias&lt;/keyAlias&gt;
                    &lt;keyAliasPassword&gt;myKeyPass&lt;/keyAliasPassword&gt;
                    &lt;signerName&gt;XXX Trusted Server&lt;/signerName&gt;
                    &lt;rebuildFrom&gt;true&lt;/rebuildFrom&gt;
                    &lt;postmasterSigns&gt;true&lt;/postmasterSigns&gt;
                    &lt;debug&gt;true&lt;/debug&gt;
                    &lt;/mailet&gt;
                </pre></div>
            </pre></div>
        </div>
    

      </div>
    </div>
    <div class="clear">
      <hr/>
    </div>
    <div id="footer">
      <div class="xright">Copyright &#169;                    2008-2012
                        <a href="http://www.apache.org/">The Apache Software Foundation</a>.
            All Rights Reserved.      
                
      </div>
      <div class="clear">
        <hr/>
      </div>
    </div>
  </body>
</html>
