blob: fecc183f7e24d8f9dd158a0e70a1d79b01e422ae [file] [log] [blame]
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>Distributed James Server &mdash; Anti-Spam configuration :: Apache James</title>
<meta name="generator" content="Antora 3.1.2">
<link rel="stylesheet" href="../../../_/css/site.css">
</head>
<body class="article">
<header class="header">
<nav class="navbar">
<div class="navbar-brand">
<a class="navbar-item" href="https://james.apache.org"><img src="/_/img/james.svg" alt="james logo"> Apache James</a>
<button class="navbar-burger" data-target="topbar-nav">
<span></span>
<span></span>
<span></span>
</button>
</div>
<div id="topbar-nav" class="navbar-menu">
<div class="navbar-end">
<a class="navbar-item" href="#">Home</a>
<div class="navbar-item has-dropdown is-hoverable">
<a class="navbar-link" href="#">Products</a>
<div class="navbar-dropdown">
<div class="navbar-item"><strong>James server</strong></div>
<a class="navbar-item" href="https://github.com/apache/james-project">Repository</a>
<a class="navbar-item" href="https://issues.apache.org/jira/projects/JAMES/issues">Issue Tracker</a>
<hr class="navbar-divider">
<a class="navbar-item" href="https://james.apache.org/mime4j/index.html">Mime4J</a>
<a class="navbar-item" href="https://james.apache.org/jsieve/index.html">jSieve</a>
<a class="navbar-item" href="https://james.apache.org/jspf/index.html">jSPF</a>
<a class="navbar-item" href="https://james.apache.org/jdkim/index.html">jDKIM</a>
<a class="navbar-item" href="https://james.apache.org/hupa/index.html">HUPA</a>
</div>
</div>
<div class="navbar-item has-dropdown is-hoverable">
<a class="navbar-link" href="#">Community</a>
<div class="navbar-dropdown">
<!-- Not ideal but dropping the version in the href requires tweaking james-projet docs module first -->
<a class="navbar-item" href="/james-project/3.6.0/community/mailing-lists.html">Mailing lists</a>
<a class="navbar-item" href="https://gitter.im/apache/james-project"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 32 32" class="logo-gitter-sign" data-v-44ebcb1a=""><rect x="15" y="5" width="2" height="10"></rect> <rect x="10" y="5" width="2" height="20"></rect> <rect x="5" y="5" width="2" height="20"></rect> <rect width="2" height="15"></rect></svg> Gitter</a>
<a class="navbar-item" href="https://twitter.com/ApacheJames">
<span class="icon">
<svg aria-hidden="true" data-icon="twitter" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
<path fill="#57aaee" d="M459.37 151.716c.325 4.548.325 9.097.325 13.645 0 138.72-105.583 298.558-298.558 298.558-59.452 0-114.68-17.219-161.137-47.106 8.447.974 16.568 1.299 25.34 1.299 49.055 0 94.213-16.568 130.274-44.832-46.132-.975-84.792-31.188-98.112-72.772 6.498.974 12.995 1.624 19.818 1.624 9.421 0 18.843-1.3 27.614-3.573-48.081-9.747-84.143-51.98-84.143-102.985v-1.299c13.969 7.797 30.214 12.67 47.431 13.319-28.264-18.843-46.781-51.005-46.781-87.391 0-19.492 5.197-37.36 14.294-52.954 51.655 63.675 129.3 105.258 216.365 109.807-1.624-7.797-2.599-15.918-2.599-24.04 0-57.828 46.782-104.934 104.934-104.934 30.213 0 57.502 12.67 76.67 33.137 23.715-4.548 46.456-13.32 66.599-25.34-7.798 24.366-24.366 44.833-46.132 57.827 21.117-2.273 41.584-8.122 60.426-16.243-14.292 20.791-32.161 39.308-52.628 54.253z"></path>
</svg>
</span> Twitter
</a>
<a class="navbar-item" href="#"> <svg class="octicon octicon-mark-github v-align-middle" viewBox="0 0 16 16" version="1.1" aria-hidden="true"><path fill-rule="evenodd" d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.013 8.013 0 0016 8c0-4.42-3.58-8-8-8z"></path></svg> Github</a>
</div>
</div>
<!-- <div class="navbar-item">
<span class="control">
<a class="button is-primary" href="#">Download</a>
</span>
</div> -->
</div>
</div>
</nav>
</header>
<div class="body">
<div class="nav-container" data-component="james-distributed-app" data-version="3.8.0">
<aside class="nav">
<div class="panels">
<div class="nav-panel-menu is-active" data-panel="menu">
<nav class="nav-menu">
<button class="nav-menu-toggle" aria-label="Toggle expand/collapse all" style="display: none"></button>
<h3 class="title"><a href="../index.html">Apache James Distributed Server</a></h3>
<ul class="nav-list">
<li class="nav-item" data-depth="0">
<ul class="nav-list">
<li class="nav-item" data-depth="1">
<button class="nav-item-toggle"></button>
<a class="nav-link" href="../index.html">Distributed James Application</a>
<ul class="nav-list">
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../objectives.html">Objectives and motivation</a>
</li>
<li class="nav-item" data-depth="2">
<button class="nav-item-toggle"></button>
<a class="nav-link" href="../architecture/index.html">Architecture</a>
<ul class="nav-list">
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../architecture/implemented-standards.html">Implemented standards</a>
</li>
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../architecture/consistency-model.html">Consistency Model</a>
</li>
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../architecture/specialized-instances.html">Specialized instances</a>
</li>
</ul>
</li>
<li class="nav-item" data-depth="2">
<button class="nav-item-toggle"></button>
<a class="nav-link" href="../run/index.html">Run</a>
<ul class="nav-list">
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../run/run-java.html">Run with Java</a>
</li>
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../run/run-docker.html">Run with Docker</a>
</li>
<li class="nav-item" data-depth="3">
<button class="nav-item-toggle"></button>
<a class="nav-link" href="../run/run-kubernetes.html">Run with Kubernetes</a>
<ul class="nav-list">
<li class="nav-item" data-depth="4">
<a class="nav-link" href="../run/k8s-checklist.html">Deployment Checklist</a>
</li>
<li class="nav-item" data-depth="4">
<a class="nav-link" href="../run/k8s-logsMetrics.html">Logs &amp; Metrics</a>
</li>
<li class="nav-item" data-depth="4">
<a class="nav-link" href="../run/k8s-values.html">values.yaml</a>
</li>
<li class="nav-item" data-depth="4">
<a class="nav-link" href="../run/k8s-secrets.html">secrets.yaml</a>
</li>
</ul>
</li>
</ul>
</li>
<li class="nav-item" data-depth="2">
<button class="nav-item-toggle"></button>
<a class="nav-link" href="index.html">Configuration</a>
<ul class="nav-list">
<li class="nav-item" data-depth="3">
<button class="nav-item-toggle"></button>
<span class="nav-text">Protocols</span>
<ul class="nav-list">
<li class="nav-item" data-depth="4">
<a class="nav-link" href="imap.html">imapserver.xml</a>
</li>
<li class="nav-item" data-depth="4">
<a class="nav-link" href="jmap.html">jmap.properties</a>
</li>
<li class="nav-item" data-depth="4">
<a class="nav-link" href="jmx.html">jmx.properties</a>
</li>
<li class="nav-item" data-depth="4">
<a class="nav-link" href="smtp.html">smtpserver.xml &amp; lmtpserver.xml</a>
</li>
<li class="nav-item" data-depth="4">
<a class="nav-link" href="smtp-hooks.html">Packaged SMTP hooks</a>
</li>
<li class="nav-item" data-depth="4">
<a class="nav-link" href="pop3.html">pop3server.xml</a>
</li>
<li class="nav-item" data-depth="4">
<a class="nav-link" href="webadmin.html">webadmin.properties</a>
</li>
<li class="nav-item" data-depth="4">
<a class="nav-link" href="ssl.html">SSL &amp; TLS</a>
</li>
<li class="nav-item" data-depth="4">
<a class="nav-link" href="sieve.html">Sieve &amp; ManageSieve</a>
</li>
</ul>
</li>
<li class="nav-item" data-depth="3">
<button class="nav-item-toggle"></button>
<span class="nav-text">Storage dependencies</span>
<ul class="nav-list">
<li class="nav-item" data-depth="4">
<a class="nav-link" href="blobstore.html">blobstore.properties</a>
</li>
<li class="nav-item" data-depth="4">
<a class="nav-link" href="cassandra.html">cassandra.properties</a>
</li>
<li class="nav-item" data-depth="4">
<a class="nav-link" href="opensearch.html">opensearch.properties</a>
</li>
<li class="nav-item" data-depth="4">
<a class="nav-link" href="rabbitmq.html">rabbitmq.properties</a>
</li>
<li class="nav-item" data-depth="4">
<a class="nav-link" href="redis.html">redis.properties</a>
</li>
<li class="nav-item" data-depth="4">
<a class="nav-link" href="tika.html">tika.properties</a>
</li>
</ul>
</li>
<li class="nav-item" data-depth="3">
<button class="nav-item-toggle"></button>
<span class="nav-text">Core components</span>
<ul class="nav-list">
<li class="nav-item" data-depth="4">
<a class="nav-link" href="batchsizes.html">batchsizes.properties</a>
</li>
<li class="nav-item" data-depth="4">
<a class="nav-link" href="dns.html">dnsservice.xml</a>
</li>
<li class="nav-item" data-depth="4">
<a class="nav-link" href="domainlist.html">domainlist.xml</a>
</li>
<li class="nav-item" data-depth="4">
<a class="nav-link" href="healthcheck.html">healthcheck.properties</a>
</li>
<li class="nav-item" data-depth="4">
<a class="nav-link" href="mailetcontainer.html">mailetcontainer.xml</a>
</li>
<li class="nav-item" data-depth="4">
<a class="nav-link" href="mailets.html">Packaged Mailets</a>
</li>
<li class="nav-item" data-depth="4">
<a class="nav-link" href="matchers.html">Packaged Matchers</a>
</li>
<li class="nav-item" data-depth="4">
<a class="nav-link" href="mailrepositorystore.html">mailrepositorystore.xml</a>
</li>
<li class="nav-item" data-depth="4">
<a class="nav-link" href="recipientrewritetable.html">recipientrewritetable.xml</a>
</li>
<li class="nav-item" data-depth="4">
<a class="nav-link" href="search.html">search.properties</a>
</li>
<li class="nav-item" data-depth="4">
<a class="nav-link" href="usersrepository.html">usersrepository.xml</a>
</li>
</ul>
</li>
<li class="nav-item" data-depth="3">
<button class="nav-item-toggle"></button>
<span class="nav-text">Extensions</span>
<ul class="nav-list">
<li class="nav-item" data-depth="4">
<a class="nav-link" href="vault.html">deletedMessageVault.properties</a>
</li>
<li class="nav-item" data-depth="4">
<a class="nav-link" href="extensions.html">extensions.properties</a>
</li>
<li class="nav-item" data-depth="4">
<a class="nav-link" href="listeners.html">listeners.xml</a>
</li>
<li class="nav-item is-current-page" data-depth="4">
<a class="nav-link" href="spam.html">Anti-Spam setup</a>
</li>
<li class="nav-item" data-depth="4">
<a class="nav-link" href="remote-delivery-error-handling.html">About RemoteDelivery error handling</a>
</li>
<li class="nav-item" data-depth="4">
<a class="nav-link" href="collecting-contacts.html">Contact collection</a>
</li>
<li class="nav-item" data-depth="4">
<a class="nav-link" href="collecting-events.html">Event collection</a>
</li>
<li class="nav-item" data-depth="4">
<a class="nav-link" href="dsn.html">ESMTP DSN support</a>
</li>
</ul>
</li>
</ul>
</li>
<li class="nav-item" data-depth="2">
<button class="nav-item-toggle"></button>
<a class="nav-link" href="../operate/index.html">Operate</a>
<ul class="nav-list">
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../operate/guide.html">Operator guide</a>
</li>
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../operate/performanceChecklist.html">Performance checklist</a>
</li>
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../operate/logging.html">Logging</a>
</li>
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../operate/webadmin.html">WebAdmin REST administration API</a>
</li>
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../operate/metrics.html">Metrics</a>
</li>
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../operate/migrating.html">Migrating existing data</a>
</li>
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../operate/cli.html">Command Line Interface</a>
</li>
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../operate/cassandra-migration.html">Cassandra migration</a>
</li>
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../operate/security.html">Security checklist</a>
</li>
</ul>
</li>
<li class="nav-item" data-depth="2">
<button class="nav-item-toggle"></button>
<a class="nav-link" href="../extending/index.html">Extending server behavior</a>
<ul class="nav-list">
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../extending/mail-processing.html">Custom mail processing components</a>
</li>
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../extending/mailbox-listeners.html">Custom Mailbox Listeners</a>
</li>
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../extending/smtp-hooks.html">Custom SMTP hooks</a>
</li>
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../extending/webadmin-routes.html">Custom WebAdmin routes</a>
</li>
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../extending/imap.html">Custom IMAP processing</a>
</li>
</ul>
</li>
<li class="nav-item" data-depth="2">
<button class="nav-item-toggle"></button>
<a class="nav-link" href="../benchmark/index.html">Performance benchmark</a>
<ul class="nav-list">
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../benchmark/db-benchmark.html">Database benchmarks</a>
</li>
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../benchmark/james-benchmark.html">James benchmarks</a>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</nav>
</div>
<div class="nav-panel-explore" data-panel="explore">
<div class="context">
<span class="title">Apache James Distributed Server</span>
<span class="version">3.8.0 SNAPSHOT</span>
</div>
<ul class="components">
<li class="component is-current">
<div class="title"><a href="../index.html">Apache James Distributed Server</a></div>
<ul class="versions">
<li class="version is-current is-latest">
<a href="../index.html">3.8.0 SNAPSHOT</a>
</li>
</ul>
</li>
<li class="component">
<div class="title"><a href="../../../james-project/3.8.0/index.html">Apache James Server</a></div>
<ul class="versions">
<li class="version is-latest">
<a href="../../../james-project/3.8.0/index.html">3.8.0 SNAPSHOT</a>
</li>
<li class="version">
<a href="../../../james-project/3.6.0/index.html">3.6.0 Snapshot</a>
</li>
</ul>
</li>
<li class="component">
<div class="title"><a href="../../../james-site/latest/index.html">Apache James Site</a></div>
<ul class="versions">
<li class="version is-latest">
<a href="../../../james-site/latest/index.html">latest</a>
</li>
</ul>
</li>
</ul>
</div>
</div>
</aside>
</div>
<main class="article">
<div class="toolbar" role="navigation">
<button class="nav-toggle"></button>
<a href="../../../james-site/latest/homepage.html" class="home-link"></a>
<nav class="breadcrumbs" aria-label="breadcrumbs">
<ul>
<li><a href="../index.html">Apache James Distributed Server</a></li>
<li><a href="../index.html">Distributed James Application</a></li>
<li><a href="index.html">Configuration</a></li>
<li>Extensions</li>
<li><a href="spam.html">Anti-Spam setup</a></li>
</ul>
</nav>
<div class="edit-this-page"><a href="https://github.com/apache/james-project/blob/master/server/apps/distributed-app/docs/modules/ROOT/pages/configure/spam.adoc">Edit this Page</a></div>
</div>
<div class="content">
<aside class="toc sidebar" data-title="Contents" data-levels="2">
<div class="toc-menu"></div>
</aside>
<article class="doc">
<h1 class="page">Distributed James Server &mdash; Anti-Spam configuration</h1>
<div id="preamble">
<div class="sectionbody">
<div class="paragraph">
<p>Anti-Spam system can be configured via two main different mechanisms:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>SMTP Hooks;</p>
</li>
<li>
<p>Mailets;</p>
</li>
</ul>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_antispam_smtp_hooks"><a class="anchor" href="#_antispam_smtp_hooks"></a>AntiSpam SMTP Hooks</h2>
<div class="sectionbody">
<div class="paragraph">
<p>"FastFail" SMTP Hooks acts to reject before spooling
on the SMTP level. The Spam detector hook can be used as a fastfail hook, therefore
Spam filtering system must run as a server on the same machine as the Apache James Server.</p>
</div>
<div class="paragraph">
<p>SMTP Hooks for non-existent users, DSN filter, domains with invalid MX record,
can also be configured.</p>
</div>
<div class="paragraph">
<p><strong>SpamAssassinHandler</strong> (experimental) also enables to classify the messages as spam or not
with a configurable score threshold (<code>0.0</code>, non-configurable). Only a global database is supported. Per user spam
detection is not supported by this hook.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_antispam_mailets"><a class="anchor" href="#_antispam_mailets"></a>AntiSpam Mailets</h2>
<div class="sectionbody">
<div class="paragraph">
<p>James' repository provide two AntiSpam mailets: SpamAssassin and RspamdScanner.
We can select one in them for filtering spam mail.</p>
</div>
<div class="ulist">
<ul>
<li>
<p><strong>SpamAssassin and RspamdScanner</strong> Mailet is designed to classify the messages as spam or not
with a configurable score threshold. Usually a message will only be
considered as spam if it matches multiple criteria; matching just a single test
will not usually be enough to reach the threshold. Note that this mailet is executed on a per-user basis.</p>
</li>
</ul>
</div>
<div class="sect2">
<h3 id="_rspamd"><a class="anchor" href="#_rspamd"></a>Rspamd</h3>
<div class="paragraph">
<p>The Rspamd extension (optional) requires an extra configuration file <code>rspamd.properties</code> to configure RSpamd connection</p>
</div>
<table class="tableblock frame-all grid-all stretch">
<caption class="title">Table 1. rspamd.properties content</caption>
<colgroup>
<col style="width: 50%;">
<col style="width: 50%;">
</colgroup>
<thead>
<tr>
<th class="tableblock halign-left valign-top">Property name</th>
<th class="tableblock halign-left valign-top">explanation</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">rSpamdUrl</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">URL defining the Rspamd&#8217;s server. Eg: <a href="http://rspamd:11334" class="bare">http://rspamd:11334</a></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">rSpamdPassword</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Password for pass authentication when request to Rspamd&#8217;s server. Eg: admin</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">rspamdTimeout</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Integer. Timeout for http requests to Rspamd. Default to 15 seconds.</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">perUserBayes</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Boolean. Whether to scan/learn mails using per-user Bayes. Default to false.</p></td>
</tr>
</tbody>
</table>
<div class="paragraph">
<p><code>RspamdScanner</code> supports the following options:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>You can specify the <code>virusProcessor</code> if you want to enable virus scanning for mail. Upon configurable <code>virusProcessor</code>
you can specify how James process mail virus. We provide a sample Rspamd mailet and <code>virusProcessor</code> configuration:</p>
</li>
<li>
<p>You can specify the <code>rejectSpamProcessor</code>. Emails marked as <code>rejected</code> by Rspamd will be redirected to this
processor. This corresponds to emails with the highest spam score, thus delivering them to users as marked as spam
might not even be desirable.</p>
</li>
<li>
<p>The <code>rewriteSubject</code> option allows to rewritte subjects when asked by Rspamd.</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>This mailet can scan mails against per-user Bayes by configure <code>perUserBayes</code> in <code>rspamd.properties</code>. This is achieved
through the use of Rspamd <code>Deliver-To</code> HTTP header. If true, Rspamd will be called for each recipient of the mail, which comes at a performance cost. If true, subjects are not rewritten.
If true <code>virusProcessor</code> and <code>rejectSpamProcessor</code> are honnered per user, at the cost of email copies. Default to false.</p>
</div>
<div class="paragraph">
<p>Here is an example of mailet pipeline conducting out RspamdScanner execution:</p>
</div>
<div class="literalblock">
<div class="content">
<pre>&lt;processor state="local-delivery" enableJmx="true"&gt;
&lt;mailet match="All" class="org.apache.james.rspamd.RspamdScanner"&gt;
&lt;rewriteSubject&gt;true&lt;/rewriteSubject&gt;
&lt;virusProcessor&gt;virus&lt;/virusProcessor&gt;
&lt;rejectSpamProcessor&gt;spam&lt;/rejectSpamProcessor&gt;
&lt;/mailet&gt;
&lt;mailet match="IsMarkedAsSpam=org.apache.james.rspamd.status" class="WithStorageDirective"&gt;
&lt;targetFolderName&gt;Spam&lt;/targetFolderName&gt;
&lt;/mailet&gt;
&lt;mailet match="All" class="LocalDelivery"/&gt;
&lt;/processor&gt;
&lt;!--Choose one between these two following virus processor, or configure a custom one if you want--&gt;
&lt;!--Hard reject virus mail--&gt;
&lt;processor state="virus" enableJmx="false"&gt;
&lt;mailet match="All" class="ToRepository"&gt;
&lt;repositoryPath&gt;file://var/mail/virus/&lt;/repositoryPath&gt;
&lt;/mailet&gt;
&lt;/processor&gt;
&lt;!--Soft reject virus mail--&gt;
&lt;processor state="virus" enableJmx="false"&gt;
&lt;mailet match="All" class="StripAttachment"&gt;
&lt;remove&gt;all&lt;/remove&gt;
&lt;pattern&gt;.*&lt;/pattern&gt;
&lt;/mailet&gt;
&lt;mailet match="All" class="AddSubjectPrefix"&gt;
&lt;subjectPrefix&gt;[VIRUS]&lt;/subjectPrefix&gt;
&lt;/mailet&gt;
&lt;mailet match="All" class="LocalDelivery"/&gt;
&lt;/processor&gt;
&lt;!--Store rejected spam emails (with a very high score) --&gt;
&lt;processor state="virus" enableJmx="false"&gt;
&lt;mailet match="All" class="ToRepository"&gt;
&lt;repositoryPath&gt;cassandra://var/mail/spam&lt;/repositoryPath&gt;
&lt;/mailet&gt;
&lt;/processor&gt;</pre>
</div>
</div>
<div class="sect3">
<h4 id="_feedback_for_rspamd"><a class="anchor" href="#_feedback_for_rspamd"></a>Feedback for Rspamd</h4>
<div class="paragraph">
<p>If enabled, the <code>RspamdListener</code> will base on the Mailbox event to detect the message is a spam or not, then James will send report <code>spam</code> or <code>ham</code> to Rspamd.
This listener can report mails to per-user Bayes by configure <code>perUserBayes</code> in <code>rspamd.properties</code>.
The Rspamd listener needs to explicitly be registered with <a href="listeners.html" class="xref page">listeners.xml</a>.</p>
</div>
<div class="paragraph">
<p>Example:</p>
</div>
<div class="literalblock">
<div class="content">
<pre>&lt;listeners&gt;
&lt;listener&gt;
&lt;class&gt;org.apache.james.rspamd.RspamdListener&lt;/class&gt;
&lt;/listener&gt;
&lt;/listeners&gt;</pre>
</div>
</div>
<div class="paragraph">
<p>For more detail about how to use Rspamd&#8217;s extension: <code>third-party/rspamd/index.md</code></p>
</div>
<div class="paragraph">
<p>Alternatively, batch reports can be triggered on user mailbox content via webAdmin. <a href="https://github.com/apache/james-project/tree/master/third-party/rspamd#additional-webadmin-endpoints">Read more</a>.</p>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_spamassassin"><a class="anchor" href="#_spamassassin"></a>SpamAssassin</h3>
<div class="paragraph">
<p>Here is an example of mailet pipeline conducting out SpamAssassin execution:</p>
</div>
<div class="literalblock">
<div class="content">
<pre>&lt;mailet match="All" class="SpamAssassin"&gt;
&lt;onMailetException&gt;ignore&lt;/onMailetException&gt;
&lt;spamdHost&gt;spamassassin&lt;/spamdHost&gt;
&lt;spamdPort&gt;783&lt;/spamdPort&gt;
&lt;/mailet&gt;
&lt;mailet match="All" class="MailAttributesToMimeHeaders"&gt;
&lt;!-- This mailet is not required, but useful to have SpamAssassin score in headers--&gt;
&lt;simplemapping&gt;org.apache.james.spamassassin.status; X-JAMES-SPAMASSASSIN-STATUS&lt;/simplemapping&gt;
&lt;simplemapping&gt;org.apache.james.spamassassin.flag; X-JAMES-SPAMASSASSIN-FLAG&lt;/simplemapping&gt;
&lt;/mailet&gt;
&lt;mailet match="IsMarkedAsSpam" class="WithStorageDirective"&gt;
&lt;targetFolderName&gt;Spam&lt;/targetFolderName&gt;
&lt;/mailet&gt;</pre>
</div>
</div>
<div class="ulist">
<ul>
<li>
<p><strong>BayesianAnalysis</strong> (unsupported) in the Mailet uses Bayesian probability to classify mail as
spam or not spam. It relies on the training data coming from the users’ judgment.
Users need to manually judge as spam and send to <a href="mailto:spam@thisdomain.com">spam@thisdomain.com</a>, oppositely,
if not spam they then send to <a href="mailto:not.spam@thisdomain.com">not.spam@thisdomain.com</a>. BayesianAnalysisfeeder learns
from this training dataset, and build predictive models based on Bayesian probability.
There will be a certain table for maintaining the frequency of Corpus for keywords
in the database. Every 10 mins a thread in the BayesianAnalysis will check and update
the table. Also, the correct approach is to send the original spam or non-spam
as an attachment to another message sent to the feeder in order to avoid bias from the
current sender&#8217;s email header.</p>
</li>
</ul>
</div>
<div class="sect3">
<h4 id="_feedback_for_spamassassin"><a class="anchor" href="#_feedback_for_spamassassin"></a>Feedback for SpamAssassin</h4>
<div class="paragraph">
<p>If enabled, the <code>SpamAssassinListener</code> will asynchronously report users mails moved to the <code>Spam</code> mailbox as Spam,
and other mails as <code>Ham</code>, effectively populating the user database for per user spam detection. This enables a per-user
Spam categorization to be conducted out by the SpamAssassin mailet, the SpamAssassin hook being unaffected.</p>
</div>
<div class="paragraph">
<p>The SpamAssassin listener requires an extra configuration file <code>spamassassin.properties</code> to configure SpamAssassin connection (optional):</p>
</div>
<table class="tableblock frame-all grid-all stretch">
<caption class="title">Table 2. spamassassin.properties content</caption>
<colgroup>
<col style="width: 50%;">
<col style="width: 50%;">
</colgroup>
<thead>
<tr>
<th class="tableblock halign-left valign-top">Property name</th>
<th class="tableblock halign-left valign-top">explanation</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">spamassassin.host</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Hostname of the SpamAssassin server. Defaults to 127.0.0.1.</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">spamassassin.port</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Port of the SpamAssassin server. Defaults to 783.</p></td>
</tr>
</tbody>
</table>
<div class="paragraph">
<p>Note that this configuration file only affects the listener, and not the hook or mailet.</p>
</div>
<div class="paragraph">
<p>The SpamAssassin listener needs to explicitly be registered with <a href="listeners.html" class="xref page">listeners.xml</a>.</p>
</div>
<div class="paragraph">
<p>Example:</p>
</div>
<div class="literalblock">
<div class="content">
<pre>&lt;listeners&gt;
&lt;listener&gt;
&lt;class&gt;org.apache.james.mailbox.spamassassin.SpamAssassinListener&lt;/class&gt;
&lt;async&gt;true&lt;/async&gt;
&lt;/listener&gt;
&lt;/listeners&gt;</pre>
</div>
</div>
</div>
</div>
</div>
</div>
</article>
</div>
</main>
</div>
<footer class="footer">
<p>This page was built using the Antora default UI.</p>
<p>The source code for this UI is licensed under the terms of the MPL-2.0 license.</p>
</footer>
<script id="site-script" src="../../../_/js/site.js" data-ui-root-path="../../../_"></script>
<script async src="../../../_/js/vendor/highlight.js"></script>
</body>
</html>