<?xml version="1.0"?>
<!--
  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.                                           
 -->

<!--
   This template file can be used as example for James Server configuration
   DO NOT USE IT AS SUCH AND ADAPT IT TO YOUR NEEDS
-->
 
<!-- See http://james.apache.org/server/3/config.html for usage -->

<!-- This block is responsible for processing messages on the spool. -->

<mailetcontainer enableJmx="true">
 
    <!-- MailAddress used for PostMaster -->
    <context>
        <postmaster>postmaster@localhost</postmaster>
    </context>

    <!-- Number of spool threads -->
    <spooler>
      <threads>20</threads>
    </spooler>
      
  <processors>
  
    <!-- The root processor is a required processor - James routes all mail on the spool -->
    <!-- through this processor first. -->
    <!-- -->
    <!-- This configuration is a sample configuration for the root processor. -->
    <processor state="root" enableJmx="true">

       <!-- This mailet redirects mail for the user 'postmaster' at any local domain to -->
       <!-- the postmaster address specified for the server. The postmaster address -->
       <!-- is required by rfc822. Do not remove this mailet unless you are meeting -->
       <!-- this requirement through other means (e.g. a XML/JDBCRecipientRewriteTable defined in recipientrewritetable-store.xml) -->
       <mailet match="All" class="PostmasterAlias"/>

       <!-- Important check to avoid looping -->
       <mailet match="RelayLimit=30" class="Null"/>

       <mailet match="RecipientIsRegex=([0-9]+)@mymachine.vm" class="Redirect">
           <to>test@mymachine.vm</to>
           <inline>all</inline>
           <passThrough>FALSE</passThrough>
           <prefix>[SMSGATEWAY]</prefix>
       </mailet>

       <!-- Anti-spam processing -->
       <!-- The following two entries avoid double anti-spam analysis -->
       <!-- for forwarded messages. -->
       <!-- Has spam checking already been done? -->
       <mailet match="HasMailAttribute=spamChecked" class="ToProcessor">
          <processor>transport</processor>
       </mailet>
       <!-- Spam checking will not be done twice -->
       <mailet match="All" class="SetMailAttribute">
          <spamChecked>true</spamChecked>
       </mailet>

       <!-- White List:
              If you use block lists, you will probably want to check
              for known permitted senders.  This is particularly true
              if you use more aggressive block lists, such as SPEWS,
              that are prone to block entire subnets without regard
              for non-spamming senders.
         -->

       <!-- Messages from authenticated senders never are spam -->
       <mailet match="SMTPAuthSuccessful" class="ToProcessor">
          <processor>transport</processor>
       </mailet>

       <!-- Messages signed by trusted users never are spam -->
       <!-- Uncommenting the following entry, messages with valid signatures will never be considered spam. -->
       <!-- This can be a valid policy *if* SMIMECheckSignature was invoked -->
       <!-- with<onlyTrusted>true</onlyTrusted>set -->
       <!--
       <mailet match="HasMailAttribute=org.apache.james.SMIMECheckSignature" class="ToProcessor">
          <processor>transport</processor>
       </mailet>
         -->

       <!-- End of White List -->

       <!-- Send remaining mails to the transport processor for either local or remote delivery -->
       <mailet match="All" class="ToProcessor">
          <processor>transport</processor>
       </mailet>

    </processor>

    <!-- The error processor is required.  James may internally set emails to the -->
    <!-- error state.  The error processor is generally invoked when there is an -->
    <!-- unexpected error either in the mailet chain or internal to James. -->
    <!-- -->
    <!-- By default configuration all email that generates an error in placed in -->
    <!-- an error repository. -->
    <processor state="error" enableJmx="true">
       <!-- Logs any messages to the repository specified -->
       <mailet match="All" class="ToRepository">
          <repositoryPath>file://var/mail/error/</repositoryPath>
       </mailet>
    </processor>

    <!-- Processor CONFIGURATION SAMPLE: transport is a sample custom processor for local or -->
    <!-- remote delivery -->
    <processor state="transport" enableJmx="true">

      <!-- This is an example configuration including configuration for a list server. -->
      <!-- CHECKME: before uncommenting this, edit the configuration file's contents   -->
      <!--
          &listserverConfig;
        -->

       <mailet match="SMTPAuthSuccessful" class="SetMimeHeader">
          <name>X-UserIsAuth</name>
          <value>true</value>
          <onMailetException>ignore</onMailetException>
       </mailet>
    
       <mailet match="HasMailAttribute=org.apache.james.SMIMECheckSignature" class="SetMimeHeader">
          <name>X-WasSigned</name>
          <value>true</value>
          <onMailetException>ignore</onMailetException>
       </mailet>

       <!--  The RecipientRewriteTable will use the definitions found in recipientrewritetablexml -->
         <mailet match="All" class="RecipientRewriteTable" />

         <!-- Place a copy in the user Sent folder -->
         <mailet match="SenderIsLocal" class="ToSenderFolder">
           <folder>Sent</folder>
           <consume>false</consume>
         </mailet>

       <!-- Is the recipient is for a local account, deliver it locally -->
       <mailet match="RecipientIsLocal" class="Sieve"/>
       <mailet match="RecipientIsLocal" class="AddDeliveredToHeader"/>
       <mailet match="RecipientIsLocal" class="LocalDelivery"/>

       <!-- If the host is handled by this server and it did not get -->
       <!-- locally delivered, this is an invalid recipient -->
       <mailet match="HostIsLocal" class="ToProcessor">
          <processor>local-address-error</processor>
          <notice>550 - Requested action not taken: no such user here</notice>
       </mailet>

<!-- CHECKME! -->
       <!-- This is an anti-relay matcher/mailet combination -->
       <!-- -->
       <!-- Emails sent from servers not in the network list are  -->
       <!-- rejected as spam.  This is one method of preventing your -->
       <!-- server from being used as an open relay.  Make sure you understand -->
       <!-- how to prevent your server from becoming an open relay before -->
       <!-- changing this configuration. See also<authorizedAddresses>in SMTP Server -->
       <!-- -->
       <!-- This matcher/mailet combination must come after local delivery has -->
       <!-- been performed.  Otherwise local users will not be able to receive -->
       <!-- email from senders not in this remote address list. -->
       <!-- -->
       <!-- If you are using this matcher/mailet you will probably want to -->
       <!-- update the configuration to include your own network/addresses.  The -->
       <!-- matcher can be configured with a comma separated list of IP addresses  -->
       <!-- wildcarded IP subnets, and wildcarded hostname subnets. -->
       <!-- e.g. "RemoteAddrNotInNetwork=127.0.0.1, abc.de.*, 192.168.0.*" -->
       <!-- -->
       <!-- If you are using SMTP authentication then you can (and generally -->
       <!-- should) disable this matcher/mailet pair. -->
       <mailet match="RemoteAddrNotInNetwork=127.0.0.1" class="ToProcessor">
          <processor>relay-denied</processor>
          <notice>550 - Requested action not taken: relaying denied</notice>
       </mailet>

       <!-- Attempt remote delivery using the specified repository for the spool, -->
       <!-- using delay time to retry delivery and the maximum number of retries -->
       <mailet match="All" class="RemoteDelivery">
          <outgoing>outgoing</outgoing>

          <delayTime>5000, 100000, 500000</delayTime>
          <maxRetries>25</maxRetries>
            
          <!-- The max reties which will used if no A or MX record for the domain was found. -->
          <!-- If 0 it will fail on first time -->
          <maxDnsProblemRetries>0</maxDnsProblemRetries>

          <!-- The number of threads that should be trying to deliver outgoing messages -->
          <deliveryThreads>10</deliveryThreads>

          <!-- If false the message will not be sent to given server if any recipients fail -->
          <sendpartial>true</sendpartial>
            
          <!-- By default we send bounces to the "bounce" processor -->
          <!-- By removing this configuration James will fallback to hardcoded bounce -->
          <!-- notifications -->
          <bounceProcessor>bounces</bounceProcessor>

       </mailet>

    </processor>

    <processor state="over-quota" enableJmx="true">
      <mailet match="All" class="MetricsMailet">
        <metricName>mailet-over-quota-error</metricName>
      </mailet>
      <mailet match="All" class="Bounce">
        <message>The following recipients do not have enough space for storing the email you sent them.</message>
        <attachment>none</attachment>
      </mailet>
      <mailet match="All" class="ToRepository">
        <repositoryPath>file://var/mail/over-quota-error/</repositoryPath>
      </mailet>
    </processor>

      <!-- Processor CONFIGURATION SAMPLE: spam is a sample custom processor for handling -->
    <!-- spam. -->
    <!-- You can either log these, bounce these, or just ignore them. -->
    <processor state="spam" enableJmx="true">
     
       <!-- To log the message to a repository, this matcher/mailet configuration should be uncommented. -->
       <!-- This is the default configuration. -->
       <mailet match="All" class="ToRepository">
          <repositoryPath>file://var/mail/spam/</repositoryPath>
       </mailet>
    </processor>

    <!-- messages containing viruses. -->
    <processor state="virus" enableJmx="true">
      
       <!-- To avoid a loop while bouncing -->
       <mailet match="All" class="SetMailAttribute">
          <org.apache.james.infected>true, bouncing</org.apache.james.infected>
       </mailet>

       <!-- If the sender is authenticated, notify the infection -->
       <mailet match="SMTPAuthSuccessful" class="Bounce">
          <inline>heads</inline>
          <attachment>none</attachment>
          <notice>Warning: We were unable to deliver the message below because it was found infected by virus(es).</notice>
       </mailet>

       <!-- In any other situation ghost it, -->
       <!-- as viruses almost always spoof the sender's address -->
       <mailet match="All" class="Null" />
    </processor>

    <!-- This processor handles messages that are for local domains, where the user is unknown -->
    <processor state="local-address-error" enableJmx="true">
       <mailet match="All" class="ToRepository">
          <repositoryPath>file://var/mail/address-error/</repositoryPath>
       </mailet>
    </processor>

    <!-- This processor handles messages that are for foreign domains, where relaying is denied -->
    <!-- As of James v2.2, this processor can be deprecated by using the<authorizedAddresses>tag
           in the SMTP Server, and rejecting the message in the protocol transaction.  -->
    <processor state="relay-denied" enableJmx="true">

       <mailet match="All" class="ToRepository">
          <repositoryPath>file://var/mail/relay-denied/</repositoryPath>
       </mailet>
    </processor>

    <!-- This processor handle the bounces from RemoteDelivery: As of James v2.3, this is the new -->
    <!-- Default. -->
    <!-- -->
    <!-- DSNBounce properly create a DSN compliant bounce -->
    <processor state="bounces" enableJmx="true">
       <mailet match="All" class="DSNBounce">
          <passThrough>false</passThrough>

          <!-- optional subject prefix prepended to the original message -->
          <!--
          <prefix>[bounce]</prefix>
            -->
            
          <!-- message, heads or none, default=message -->
          <!--
          <attachment>heads</attachment>
            -->
            
          <!-- the message sent in the bounce, the first occurrence of the pattern [machine] is -->
          <!-- replaced with the name of the executing machine -->
          <!-- Default: Hi. This is the James mail server at [machine] ... -->
          <!--
          <messageString>Here is [machine]. I'm not able to deliver this message.</messageString>
            -->
        </mailet>
    </processor>

  </processors>

</mailetcontainer>
