You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by bt...@apache.org on 2018/07/31 02:32:25 UTC

[08/24] james-project git commit: JAMES-2501 Create a SpamAssassin backend project

JAMES-2501 Create a SpamAssassin backend project


Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/1fd63a7f
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/1fd63a7f
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/1fd63a7f

Branch: refs/heads/master
Commit: 1fd63a7fb42283549ff987ad5fd9deb6136400fe
Parents: a80003a
Author: benwa <bt...@linagora.com>
Authored: Thu Jul 26 11:31:53 2018 +0700
Committer: benwa <bt...@linagora.com>
Committed: Tue Jul 31 09:24:17 2018 +0700

----------------------------------------------------------------------
 mailbox/plugin/spamassassin/pom.xml             |  10 +
 .../mailbox/spamassassin/SpamAssassin.java      |   2 +-
 mailbox/store/pom.xml                           |   4 +
 pom.xml                                         |  12 +
 server/container/util/pom.xml                   |  23 -
 .../james/util/scanner/SpamAssassinInvoker.java | 251 -----------
 .../james/util/scanner/SpamAssassinResult.java  | 109 -----
 .../util/scanner/SpamAssassinExtension.java     | 148 -------
 .../util/scanner/SpamAssassinInvokerTest.java   | 147 -------
 .../util/scanner/SpamAssassinResultTest.java    |  96 -----
 .../util/scanner/SpamAssassinWaitStrategy.java  |  67 ---
 .../resources/docker/spamassassin/Dockerfile    |  43 --
 .../resources/docker/spamassassin/bayes_pg.sql  | 119 ------
 .../test/resources/docker/spamassassin/local.cf |  97 -----
 .../docker/spamassassin/rule-update.sh          |   7 -
 .../test/resources/docker/spamassassin/run.sh   |   9 -
 .../test/resources/docker/spamassassin/spamd.sh |  15 -
 .../util/src/test/resources/eml/spam.eml        | 152 -------
 .../src/test/resources/spamassassin_db/ham/ham1 | 113 -----
 .../src/test/resources/spamassassin_db/ham/ham2 |  73 ----
 .../src/test/resources/spamassassin_db/ham/ham3 |  82 ----
 .../src/test/resources/spamassassin_db/ham/ham4 |  78 ----
 .../src/test/resources/spamassassin_db/ham/ham5 |  77 ----
 .../src/test/resources/spamassassin_db/ham/ham6 |  74 ----
 .../src/test/resources/spamassassin_db/ham/ham7 |  88 ----
 .../src/test/resources/spamassassin_db/ham/ham8 |  85 ----
 .../src/test/resources/spamassassin_db/ham/ham9 | 176 --------
 .../test/resources/spamassassin_db/spam/spam1   | 108 -----
 .../test/resources/spamassassin_db/spam/spam2   | 186 --------
 .../test/resources/spamassassin_db/spam/spam3   | 211 ---------
 .../test/resources/spamassassin_db/spam/spam4   | 213 ----------
 .../test/resources/spamassassin_db/spam/spam5   | 161 -------
 .../test/resources/spamassassin_db/spam/spam6   | 423 -------------------
 .../test/resources/spamassassin_db/spam/spam7   |  71 ----
 .../test/resources/spamassassin_db/spam/spam8   | 321 --------------
 .../test/resources/spamassassin_db/spam/spam9   | 142 -------
 .../transport/mailets/SpamAssassinTest.java     |   2 +-
 server/mailet/mailets/pom.xml                   |  10 +
 .../james/transport/mailets/SpamAssassin.java   |   4 +-
 .../transport/matchers/IsMarkedAsSpam.java      |   2 +-
 .../transport/mailets/SpamAssassinTest.java     |   6 +-
 .../cassandra-jmap-integration-testing/pom.xml  |   6 +
 .../jmap/cassandra/CassandraJmapExtension.java  |   2 +-
 .../jmap-integration-testing-common/pom.xml     |   6 +
 .../integration/JamesWithSpamAssassin.java      |   2 +-
 .../methods/integration/SpamAssassinModule.java |   4 +-
 .../memory-jmap-integration-testing/pom.xml     |   6 +
 .../james/jmap/memory/MemoryJmapExtension.java  |   2 +-
 server/protocols/protocols-smtp/pom.xml         |  10 +
 .../fastfail/SpamAssassinHandler.java           |   4 +-
 .../smtpserver/SpamAssassinHandlerTest.java     |   6 +-
 .../java/org/apache/james/utils/MockSpamd.java  | 101 -----
 .../apache/james/utils/MockSpamdTestRule.java   |  46 --
 third-party/pom.xml                             |  40 ++
 third-party/spamassassin/pom.xml                |  93 ++++
 .../james/spamassassin/SpamAssassinInvoker.java | 251 +++++++++++
 .../james/spamassassin/SpamAssassinResult.java  | 109 +++++
 .../spamassassin/SpamAssassinExtension.java     | 148 +++++++
 .../spamassassin/SpamAssassinInvokerTest.java   | 147 +++++++
 .../spamassassin/SpamAssassinResultTest.java    |  96 +++++
 .../spamassassin/SpamAssassinWaitStrategy.java  |  67 +++
 .../james/spamassassin/mock/MockSpamd.java      | 101 +++++
 .../spamassassin/mock/MockSpamdTestRule.java    |  46 ++
 .../resources/docker/spamassassin/Dockerfile    |  43 ++
 .../resources/docker/spamassassin/bayes_pg.sql  | 119 ++++++
 .../test/resources/docker/spamassassin/local.cf |  97 +++++
 .../docker/spamassassin/rule-update.sh          |   7 +
 .../test/resources/docker/spamassassin/run.sh   |   9 +
 .../test/resources/docker/spamassassin/spamd.sh |  15 +
 .../src/test/resources/eml/spam.eml             | 152 +++++++
 .../src/test/resources/spamassassin_db/ham/ham1 | 113 +++++
 .../src/test/resources/spamassassin_db/ham/ham2 |  73 ++++
 .../src/test/resources/spamassassin_db/ham/ham3 |  82 ++++
 .../src/test/resources/spamassassin_db/ham/ham4 |  78 ++++
 .../src/test/resources/spamassassin_db/ham/ham5 |  77 ++++
 .../src/test/resources/spamassassin_db/ham/ham6 |  74 ++++
 .../src/test/resources/spamassassin_db/ham/ham7 |  88 ++++
 .../src/test/resources/spamassassin_db/ham/ham8 |  85 ++++
 .../src/test/resources/spamassassin_db/ham/ham9 | 176 ++++++++
 .../test/resources/spamassassin_db/spam/spam1   | 108 +++++
 .../test/resources/spamassassin_db/spam/spam2   | 186 ++++++++
 .../test/resources/spamassassin_db/spam/spam3   | 211 +++++++++
 .../test/resources/spamassassin_db/spam/spam4   | 213 ++++++++++
 .../test/resources/spamassassin_db/spam/spam5   | 161 +++++++
 .../test/resources/spamassassin_db/spam/spam6   | 423 +++++++++++++++++++
 .../test/resources/spamassassin_db/spam/spam7   |  71 ++++
 .../test/resources/spamassassin_db/spam/spam8   | 321 ++++++++++++++
 .../test/resources/spamassassin_db/spam/spam9   | 142 +++++++
 88 files changed, 4304 insertions(+), 4130 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/1fd63a7f/mailbox/plugin/spamassassin/pom.xml
----------------------------------------------------------------------
diff --git a/mailbox/plugin/spamassassin/pom.xml b/mailbox/plugin/spamassassin/pom.xml
index ec8f1c5..830e22d 100644
--- a/mailbox/plugin/spamassassin/pom.xml
+++ b/mailbox/plugin/spamassassin/pom.xml
@@ -52,6 +52,16 @@
             <scope>test</scope>
         </dependency>
         <dependency>
+            <groupId>${james.groupId}</groupId>
+            <artifactId>apache-james-spamassassin</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>${james.groupId}</groupId>
+            <artifactId>apache-james-spamassassin</artifactId>
+            <type>test-jar</type>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
             <groupId>junit</groupId>
             <artifactId>junit</artifactId>
             <scope>test</scope>

http://git-wip-us.apache.org/repos/asf/james-project/blob/1fd63a7f/mailbox/plugin/spamassassin/src/main/java/org/apache/james/mailbox/spamassassin/SpamAssassin.java
----------------------------------------------------------------------
diff --git a/mailbox/plugin/spamassassin/src/main/java/org/apache/james/mailbox/spamassassin/SpamAssassin.java b/mailbox/plugin/spamassassin/src/main/java/org/apache/james/mailbox/spamassassin/SpamAssassin.java
index a2c19f0..b86fe28 100644
--- a/mailbox/plugin/spamassassin/src/main/java/org/apache/james/mailbox/spamassassin/SpamAssassin.java
+++ b/mailbox/plugin/spamassassin/src/main/java/org/apache/james/mailbox/spamassassin/SpamAssassin.java
@@ -24,8 +24,8 @@ import java.util.List;
 import javax.inject.Inject;
 
 import org.apache.james.metrics.api.MetricFactory;
+import org.apache.james.spamassassin.SpamAssassinInvoker;
 import org.apache.james.util.Host;
-import org.apache.james.util.scanner.SpamAssassinInvoker;
 
 import com.github.fge.lambdas.Throwing;
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/1fd63a7f/mailbox/store/pom.xml
----------------------------------------------------------------------
diff --git a/mailbox/store/pom.xml b/mailbox/store/pom.xml
index 00b476e..d4f4e48 100644
--- a/mailbox/store/pom.xml
+++ b/mailbox/store/pom.xml
@@ -72,6 +72,10 @@
             <artifactId>james-server-util-java8</artifactId>
         </dependency>
         <dependency>
+            <groupId>${james.groupId}</groupId>
+            <artifactId>metrics-api</artifactId>
+        </dependency>
+        <dependency>
             <groupId>com.fasterxml.jackson.core</groupId>
             <artifactId>jackson-databind</artifactId>
         </dependency>

http://git-wip-us.apache.org/repos/asf/james-project/blob/1fd63a7f/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index 7d32655..29763a8 100644
--- a/pom.xml
+++ b/pom.xml
@@ -536,6 +536,7 @@
         <module>mpt</module>
         <module>protocols</module>
         <module>server</module>
+        <module>third-party</module>
     </modules>
 
     <scm>
@@ -704,6 +705,17 @@
             </dependency>
             <dependency>
                 <groupId>${james.groupId}</groupId>
+                <artifactId>apache-james-spamassassin</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>${james.groupId}</groupId>
+                <artifactId>apache-james-spamassassin</artifactId>
+                <version>${project.version}</version>
+                <type>test-jar</type>
+            </dependency>
+            <dependency>
+                <groupId>${james.groupId}</groupId>
                 <artifactId>apache-james-mailbox-api</artifactId>
                 <version>${project.version}</version>
             </dependency>

http://git-wip-us.apache.org/repos/asf/james-project/blob/1fd63a7f/server/container/util/pom.xml
----------------------------------------------------------------------
diff --git a/server/container/util/pom.xml b/server/container/util/pom.xml
index 8f2a94e..fadfca7 100644
--- a/server/container/util/pom.xml
+++ b/server/container/util/pom.xml
@@ -34,28 +34,10 @@
 
     <dependencies>
         <dependency>
-            <groupId>${james.groupId}</groupId>
-            <artifactId>javax-mail-extension</artifactId>
-            <type>test-jar</type>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>${james.groupId}</groupId>
-            <artifactId>metrics-api</artifactId>
-        </dependency>
-        <dependency>
             <groupId>com.google.guava</groupId>
             <artifactId>guava</artifactId>
         </dependency>
         <dependency>
-            <groupId>com.github.fge</groupId>
-            <artifactId>throwing-lambdas</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>com.sun.mail</groupId>
-            <artifactId>javax.mail</artifactId>
-        </dependency>
-        <dependency>
             <groupId>commons-io</groupId>
             <artifactId>commons-io</artifactId>
         </dependency>
@@ -87,11 +69,6 @@
             <groupId>org.slf4j</groupId>
             <artifactId>slf4j-api</artifactId>
         </dependency>
-        <dependency>
-            <groupId>org.testcontainers</groupId>
-            <artifactId>testcontainers</artifactId>
-            <scope>test</scope>
-        </dependency>
     </dependencies>
 
     <build>

http://git-wip-us.apache.org/repos/asf/james-project/blob/1fd63a7f/server/container/util/src/main/java/org/apache/james/util/scanner/SpamAssassinInvoker.java
----------------------------------------------------------------------
diff --git a/server/container/util/src/main/java/org/apache/james/util/scanner/SpamAssassinInvoker.java b/server/container/util/src/main/java/org/apache/james/util/scanner/SpamAssassinInvoker.java
deleted file mode 100644
index fe825aa..0000000
--- a/server/container/util/src/main/java/org/apache/james/util/scanner/SpamAssassinInvoker.java
+++ /dev/null
@@ -1,251 +0,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.                                           *
- ****************************************************************/
-
-package org.apache.james.util.scanner;
-
-import java.io.BufferedOutputStream;
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.OutputStream;
-import java.io.PrintWriter;
-import java.net.Socket;
-import java.net.UnknownHostException;
-import java.util.Arrays;
-import java.util.List;
-
-import javax.mail.MessagingException;
-import javax.mail.internet.MimeMessage;
-
-import org.apache.commons.io.IOUtils;
-import org.apache.james.metrics.api.MetricFactory;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.github.fge.lambdas.Throwing;
-import com.google.common.base.Splitter;
-import com.google.common.collect.Lists;
-
-/**
- * Sends the message through daemonized SpamAssassin (spamd), visit <a
- * href="SpamAssassin.org">SpamAssassin.org</a> for info on configuration.
- */
-public class SpamAssassinInvoker {
-    private static final Logger LOGGER = LoggerFactory.getLogger(SpamAssassinInvoker.class);
-
-    enum MessageClass {
-        HAM("ham"),
-        SPAM("spam");
-
-        private final String value;
-
-        MessageClass(String value) {
-            this.value = value;
-        }
-    }
-
-    private static final int SPAM_INDEX = 1;
-    private static final int HITS_INDEX = 3;
-    private static final int REQUIRED_HITS_INDEX = 5;
-    private static final String CRLF = "\r\n";
-
-    private final MetricFactory metricFactory;
-    private final String spamdHost;
-    private final int spamdPort;
-
-    /**
-     * Init the spamassassin invoker
-     *
-     * @param spamdHost
-     *            The host on which spamd runs
-     * @param spamdPort
-     */
-    public SpamAssassinInvoker(MetricFactory metricFactory, String spamdHost, int spamdPort) {
-        this.metricFactory = metricFactory;
-        this.spamdHost = spamdHost;
-        this.spamdPort = spamdPort;
-    }
-
-    /**
-     * Scan a MimeMessage for spam by passing it to spamd.
-     * 
-     * @param message
-     *            The MimeMessage to scan
-     * @return true if spam otherwise false
-     * @throws MessagingException
-     *             if an error on scanning is detected
-     */
-    public SpamAssassinResult scanMail(MimeMessage message, String user) throws MessagingException {
-        return metricFactory.withMetric(
-            "spamAssassin-check",
-            Throwing.supplier(
-                () -> scanMailWithAdditionalHeaders(message,
-                    "User: " + user))
-                .sneakyThrow());
-    }
-
-    public SpamAssassinResult scanMail(MimeMessage message) throws MessagingException {
-        return metricFactory.withMetric(
-            "spamAssassin-check",
-            Throwing.supplier(
-                () -> scanMailWithoutAdditionalHeaders(message))
-            .sneakyThrow());
-    }
-
-    public SpamAssassinResult scanMailWithAdditionalHeaders(MimeMessage message, String... additionalHeaders) throws MessagingException {
-        try (Socket socket = new Socket(spamdHost, spamdPort);
-             OutputStream out = socket.getOutputStream();
-             BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(out);
-             PrintWriter writer = new PrintWriter(bufferedOutputStream);
-             BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()))) {
-
-            writer.write("CHECK SPAMC/1.2");
-            writer.write(CRLF);
-
-            Arrays.stream(additionalHeaders)
-                .forEach(header -> {
-                    writer.write(header);
-                    writer.write(CRLF);
-                });
-
-            writer.write(CRLF);
-            writer.flush();
-
-            // pass the message to spamd
-            message.writeTo(out);
-            out.flush();
-            socket.shutdownOutput();
-
-            return in.lines()
-                .filter(this::isSpam)
-                .map(this::processSpam)
-                .findFirst()
-                .orElse(SpamAssassinResult.empty());
-        } catch (UnknownHostException e) {
-            throw new MessagingException("Error communicating with spamd. Unknown host: " + spamdHost);
-        } catch (IOException | MessagingException e) {
-            throw new MessagingException("Error communicating with spamd on " + spamdHost + ":" + spamdPort, e);
-        }
-    }
-
-    public SpamAssassinResult scanMailWithoutAdditionalHeaders(MimeMessage message) throws MessagingException {
-        return scanMailWithAdditionalHeaders(message);
-    }
-
-    private SpamAssassinResult processSpam(String line) {
-        List<String> elements = Lists.newArrayList(Splitter.on(' ').split(line));
-
-        return builderFrom(elements)
-            .hits(elements.get(HITS_INDEX))
-            .requiredHits(elements.get(REQUIRED_HITS_INDEX))
-            .build();
-    }
-
-    private SpamAssassinResult.Builder builderFrom(List<String> elements) {
-        if (spam(elements.get(SPAM_INDEX))) {
-            return SpamAssassinResult.asSpam();
-        } else {
-            return SpamAssassinResult.asHam();
-        }
-    }
-
-    private boolean spam(String string) {
-        try {
-            return Boolean.valueOf(string);
-        } catch (Exception e) {
-            LOGGER.warn("Fail parsing spamassassin answer: " + string);
-            return false;
-        }
-    }
-
-    private boolean isSpam(String line) {
-        return line.startsWith("Spam:");
-    }
-
-    /**
-     * Tell spamd that the given MimeMessage is a spam.
-     * 
-     * @param message
-     *            The MimeMessage to tell
-     * @throws MessagingException
-     *             if an error occured during learning.
-     */
-    public boolean learnAsSpam(InputStream message, String user) throws MessagingException {
-        return metricFactory.withMetric(
-            "spamAssassin-spam-report",
-            Throwing.supplier(
-                () -> reportMessageAs(message, user, MessageClass.SPAM))
-                .sneakyThrow());
-    }
-
-    /**
-     * Tell spamd that the given MimeMessage is a ham.
-     *
-     * @param message
-     *            The MimeMessage to tell
-     * @throws MessagingException
-     *             if an error occured during learning.
-     */
-    public boolean learnAsHam(InputStream message, String user) throws MessagingException {
-        return metricFactory.withMetric(
-            "spamAssassin-ham-report",
-            Throwing.supplier(
-                () -> reportMessageAs(message, user, MessageClass.HAM))
-                .sneakyThrow());
-    }
-
-    private boolean reportMessageAs(InputStream message, String user, MessageClass messageClass) throws MessagingException {
-        try (Socket socket = new Socket(spamdHost, spamdPort);
-             OutputStream out = socket.getOutputStream();
-             BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(out);
-             PrintWriter writer = new PrintWriter(bufferedOutputStream);
-             BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()))) {
-
-            byte[] byteArray = IOUtils.toByteArray(message);
-            writer.write("TELL SPAMC/1.2");
-            writer.write(CRLF);
-            writer.write("Content-length: " + byteArray.length);
-            writer.write(CRLF);
-            writer.write("Message-class: " + messageClass.value);
-            writer.write(CRLF);
-            writer.write("Set: local, remote");
-            writer.write(CRLF);
-            writer.write("User: " + user);
-            writer.write(CRLF);
-            writer.write(CRLF);
-            writer.flush();
-
-            out.write(byteArray);
-            out.flush();
-            socket.shutdownOutput();
-
-            return in.lines()
-                .anyMatch(this::hasBeenSet);
-        } catch (UnknownHostException e) {
-            throw new MessagingException("Error communicating with spamd. Unknown host: " + spamdHost);
-        } catch (IOException e) {
-            throw new MessagingException("Error communicating with spamd on " + spamdHost + ":" + spamdPort, e);
-        }
-    }
-
-    private boolean hasBeenSet(String line) {
-        return line.startsWith("DidSet: ");
-    }
-}

http://git-wip-us.apache.org/repos/asf/james-project/blob/1fd63a7f/server/container/util/src/main/java/org/apache/james/util/scanner/SpamAssassinResult.java
----------------------------------------------------------------------
diff --git a/server/container/util/src/main/java/org/apache/james/util/scanner/SpamAssassinResult.java b/server/container/util/src/main/java/org/apache/james/util/scanner/SpamAssassinResult.java
deleted file mode 100644
index a48967f..0000000
--- a/server/container/util/src/main/java/org/apache/james/util/scanner/SpamAssassinResult.java
+++ /dev/null
@@ -1,109 +0,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.                                           *
- ****************************************************************/
-package org.apache.james.util.scanner;
-
-import java.util.Map;
-
-import com.google.common.base.Preconditions;
-import com.google.common.collect.ImmutableMap;
-
-public class SpamAssassinResult {
-    /** The mail attribute under which the status get stored */
-    public static final String STATUS_MAIL_ATTRIBUTE_NAME = "org.apache.james.spamassassin.status";
-
-    /** The mail attribute under which the flag get stored */
-    public static final String FLAG_MAIL_ATTRIBUTE_NAME = "org.apache.james.spamassassin.flag";
-
-    public static final String NO_RESULT = "?";
-
-    public static SpamAssassinResult empty() {
-        return asHam()
-                .hits(NO_RESULT)
-                .requiredHits(NO_RESULT)
-                .build();
-    }
-
-    public static Builder asSpam() {
-        return new Builder(true);
-    }
-
-    public static Builder asHam() {
-        return new Builder(false);
-    }
-
-    public static class Builder {
-        
-        private String hits;
-        private String requiredHits;
-        private final boolean isSpam;
-
-        private Builder(boolean isSpam) {
-            this.isSpam = isSpam;
-        }
-
-        public Builder hits(String hits) {
-            this.hits = hits;
-            return this;
-        }
-
-        public Builder requiredHits(String requiredHits) {
-            this.requiredHits = requiredHits;
-            return this;
-        }
-
-        public SpamAssassinResult build() {
-            Preconditions.checkNotNull(hits);
-            Preconditions.checkNotNull(requiredHits);
-
-            ImmutableMap.Builder<String, String> headersAsAttribute = ImmutableMap.builder();
-            if (isSpam) {
-                headersAsAttribute.put(FLAG_MAIL_ATTRIBUTE_NAME, "YES");
-                headersAsAttribute.put(STATUS_MAIL_ATTRIBUTE_NAME, "Yes, hits=" + hits + " required=" + requiredHits);
-            } else {
-                headersAsAttribute.put(FLAG_MAIL_ATTRIBUTE_NAME, "NO");
-                headersAsAttribute.put(STATUS_MAIL_ATTRIBUTE_NAME, "No, hits=" + hits + " required=" + requiredHits);
-            }
-
-            return new SpamAssassinResult(hits, requiredHits, headersAsAttribute.build());
-        }
-    }
-
-    private final String hits;
-    private final String requiredHits;
-    private final Map<String, String> headersAsAttribute;
-
-    private SpamAssassinResult(String hits, String requiredHits, Map<String, String> headersAsAttribute) {
-        this.hits = hits;
-        this.requiredHits = requiredHits;
-        this.headersAsAttribute = headersAsAttribute;
-    }
-
-    public String getHits() {
-        return hits;
-    }
-
-    public String getRequiredHits() {
-        return requiredHits;
-    }
-
-    public Map<String, String> getHeadersAsAttribute() {
-        return headersAsAttribute;
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/james-project/blob/1fd63a7f/server/container/util/src/test/java/org/apache/james/util/scanner/SpamAssassinExtension.java
----------------------------------------------------------------------
diff --git a/server/container/util/src/test/java/org/apache/james/util/scanner/SpamAssassinExtension.java b/server/container/util/src/test/java/org/apache/james/util/scanner/SpamAssassinExtension.java
deleted file mode 100644
index 46100bc..0000000
--- a/server/container/util/src/test/java/org/apache/james/util/scanner/SpamAssassinExtension.java
+++ /dev/null
@@ -1,148 +0,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.                                           *
- ****************************************************************/
-
-package org.apache.james.util.scanner;
-
-import java.io.IOException;
-import java.net.URISyntaxException;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.util.Locale;
-import java.util.stream.Stream;
-
-import org.junit.jupiter.api.extension.AfterEachCallback;
-import org.junit.jupiter.api.extension.BeforeEachCallback;
-import org.junit.jupiter.api.extension.ExtensionContext;
-import org.junit.jupiter.api.extension.ParameterContext;
-import org.junit.jupiter.api.extension.ParameterResolutionException;
-import org.junit.jupiter.api.extension.ParameterResolver;
-import org.testcontainers.containers.GenericContainer;
-import org.testcontainers.images.builder.ImageFromDockerfile;
-
-import com.github.fge.lambdas.Throwing;
-
-public class SpamAssassinExtension implements BeforeEachCallback, AfterEachCallback, ParameterResolver {
-
-    private final GenericContainer<?> spamAssassinContainer;
-    private SpamAssassin spamAssassin;
-
-    public SpamAssassinExtension() {
-        spamAssassinContainer = new GenericContainer<>(
-            new ImageFromDockerfile()
-                .withFileFromClasspath("Dockerfile", "docker/spamassassin/Dockerfile")
-                .withFileFromClasspath("local.cf", "docker/spamassassin/local.cf")
-                .withFileFromClasspath("run.sh", "docker/spamassassin/run.sh")
-                .withFileFromClasspath("spamd.sh", "docker/spamassassin/spamd.sh")
-                .withFileFromClasspath("rule-update.sh", "docker/spamassassin/rule-update.sh")
-                .withFileFromClasspath("bayes_pg.sql", "docker/spamassassin/bayes_pg.sql"));
-        spamAssassinContainer.waitingFor(new SpamAssassinWaitStrategy(spamAssassinContainer));
-    }
-
-    @Override
-    public void beforeEach(ExtensionContext context) {
-        spamAssassinContainer.start();
-        spamAssassin = new SpamAssassin(spamAssassinContainer);
-    }
-
-    @Override
-    public void afterEach(ExtensionContext context) {
-        spamAssassinContainer.close();
-    }
-
-    @Override
-    public boolean supportsParameter(ParameterContext parameterContext, ExtensionContext extensionContext) throws ParameterResolutionException {
-        return (parameterContext.getParameter().getType() == SpamAssassin.class);
-    }
-
-    @Override
-    public Object resolveParameter(ParameterContext parameterContext, ExtensionContext extensionContext) throws ParameterResolutionException {
-        return spamAssassin;
-    }
-
-    public SpamAssassin getSpamAssassin() {
-        return spamAssassin;
-    }
-
-    public static class SpamAssassin {
-        
-        private static final int SPAMASSASSIN_PORT = 783;
-
-        private final String ip;
-        private final int bindingPort;
-        private final GenericContainer<?> spamAssassinContainer;
-
-        private SpamAssassin(GenericContainer<?> spamAssassinContainer) {
-            this.spamAssassinContainer = spamAssassinContainer;
-            this.ip = spamAssassinContainer.getContainerIpAddress();
-            this.bindingPort = spamAssassinContainer.getMappedPort(SPAMASSASSIN_PORT);
-        }
-
-        public String getIp() {
-            return ip;
-        }
-    
-        public int getBindingPort() {
-            return bindingPort;
-        }
-
-        public void train(String user) throws IOException, URISyntaxException {
-            train(user, Paths.get(ClassLoader.getSystemResource("spamassassin_db/spam").toURI()), TrainingKind.SPAM);
-            train(user, Paths.get(ClassLoader.getSystemResource("spamassassin_db/ham").toURI()), TrainingKind.HAM);
-        }
-
-        private void train(String user, Path folder, TrainingKind trainingKind) throws IOException {
-            spamAssassinContainer.getDockerClient().copyArchiveToContainerCmd(spamAssassinContainer.getContainerId())
-                .withHostResource(folder.toAbsolutePath().toString())
-                .withRemotePath("/root")
-                .exec();
-            try (Stream<Path> paths = Files.walk(folder)) {
-                paths
-                    .filter(Files::isRegularFile)
-                    .map(Path::toFile)
-                    .forEach(Throwing.consumer(file -> spamAssassinContainer.execInContainer("sa-learn",
-                        trainingKind.saLearnExtensionName(), "-u", user,
-                        "/root/" + trainingKind.name().toLowerCase(Locale.US) + "/" +  file.getName())));
-            }
-        }
-
-        private enum TrainingKind {
-            SPAM("--spam"), HAM("--ham");
-
-            private String saLearnExtensionName;
-
-            TrainingKind(String saLearnExtensionName) {
-                this.saLearnExtensionName = saLearnExtensionName;
-            }
-
-            public String saLearnExtensionName() {
-                return saLearnExtensionName;
-            }
-        }
-
-        public void sync(String user) throws UnsupportedOperationException, IOException, InterruptedException {
-            spamAssassinContainer.execInContainer("sa-learn", "--sync", "-u", user);
-        }
-
-        public void dump(String user) throws UnsupportedOperationException, IOException, InterruptedException {
-            spamAssassinContainer.execInContainer("sa-learn", "--dump", "magic", "-u", user);
-        }
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/james-project/blob/1fd63a7f/server/container/util/src/test/java/org/apache/james/util/scanner/SpamAssassinInvokerTest.java
----------------------------------------------------------------------
diff --git a/server/container/util/src/test/java/org/apache/james/util/scanner/SpamAssassinInvokerTest.java b/server/container/util/src/test/java/org/apache/james/util/scanner/SpamAssassinInvokerTest.java
deleted file mode 100644
index 4901ba4..0000000
--- a/server/container/util/src/test/java/org/apache/james/util/scanner/SpamAssassinInvokerTest.java
+++ /dev/null
@@ -1,147 +0,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.                                           *
- ****************************************************************/
-package org.apache.james.util.scanner;
-
-import static org.assertj.core.api.Assertions.assertThat;
-
-import java.io.ByteArrayInputStream;
-import java.nio.charset.StandardCharsets;
-
-import javax.mail.internet.MimeMessage;
-
-import org.apache.james.metrics.api.NoopMetricFactory;
-import org.apache.james.util.MimeMessageUtil;
-import org.apache.james.util.scanner.SpamAssassinExtension.SpamAssassin;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.ExtendWith;
-
-@ExtendWith(SpamAssassinExtension.class)
-public class SpamAssassinInvokerTest {
-
-    public static final String USER = "any@james";
-    private SpamAssassin spamAssassin;
-    private SpamAssassinInvoker testee;
-
-    @BeforeEach
-    public void setup(SpamAssassin spamAssassin) throws Exception {
-        this.spamAssassin = spamAssassin;
-        testee = new SpamAssassinInvoker(new NoopMetricFactory(), spamAssassin.getIp(), spamAssassin.getBindingPort());
-    }
-
-    @Test
-    public void scanMailShouldModifyHitsField() throws Exception {
-        MimeMessage mimeMessage = MimeMessageUtil.mimeMessageFromStream(
-                ClassLoader.getSystemResourceAsStream("eml/spam.eml"));
-        SpamAssassinResult result = testee.scanMail(mimeMessage, USER);
-
-        assertThat(result.getHits()).isNotEqualTo(SpamAssassinResult.NO_RESULT);
-    }
-
-    @Test
-    public void scanMailShouldModifyRequiredHitsField() throws Exception {
-        MimeMessage mimeMessage = MimeMessageUtil.mimeMessageFromStream(
-                ClassLoader.getSystemResourceAsStream("eml/spam.eml"));
-        SpamAssassinResult result = testee.scanMail(mimeMessage, USER);
-
-        assertThat(result.getRequiredHits()).isEqualTo("5.0");
-    }
-
-    @Test
-    public void scanMailShouldModifyHeadersField() throws Exception {
-        MimeMessage mimeMessage = MimeMessageUtil.mimeMessageFromStream(
-                ClassLoader.getSystemResourceAsStream("eml/spam.eml"));
-        SpamAssassinResult result = testee.scanMail(mimeMessage, USER);
-
-        assertThat(result.getHeadersAsAttribute()).isNotEmpty();
-    }
-
-    @Test
-    public void scanMailShouldMarkAsSpamWhenKnownAsSpam() throws Exception {
-        spamAssassin.train("user");
-        
-        MimeMessage mimeMessage = MimeMessageUtil.mimeMessageFromStream(
-                ClassLoader.getSystemResourceAsStream("spamassassin_db/spam/spam1"));
-
-        SpamAssassinResult result = testee.scanMail(mimeMessage, USER);
-
-        assertThat(result.getHeadersAsAttribute().get(SpamAssassinResult.FLAG_MAIL_ATTRIBUTE_NAME)).isEqualTo("YES");
-    }
-
-    @Test
-    public void learnAsSpamShouldReturnTrueWhenLearningWorks() throws Exception {
-        MimeMessage mimeMessage = MimeMessageUtil.mimeMessageFromStream(
-                ClassLoader.getSystemResourceAsStream("spamassassin_db/spam/spam2"));
-
-        boolean result = testee.learnAsSpam(mimeMessage.getInputStream(), USER);
-
-        assertThat(result).isTrue();
-    }
-
-    @Test
-    public void scanMailShouldMarkAsSpamWhenMessageAlreadyLearnedAsSpam() throws Exception {
-        MimeMessage mimeMessage = MimeMessageUtil.mimeMessageFromStream(
-                ClassLoader.getSystemResourceAsStream("spamassassin_db/spam/spam1"));
-
-        byte[] messageAsBytes = MimeMessageUtil.asString(mimeMessage).getBytes(StandardCharsets.UTF_8);
-
-        testee.learnAsSpam(new ByteArrayInputStream(messageAsBytes), USER);
-
-        SpamAssassinResult result = testee.scanMail(mimeMessage, USER);
-
-        assertThat(result.getHeadersAsAttribute().get(SpamAssassinResult.FLAG_MAIL_ATTRIBUTE_NAME)).isEqualTo("YES");
-    }
-
-    @Test
-    public void learnAsHamShouldReturnTrueWhenLearningWorks() throws Exception {
-        MimeMessage mimeMessage = MimeMessageUtil.mimeMessageFromStream(
-            ClassLoader.getSystemResourceAsStream("spamassassin_db/ham/ham2"));
-
-        boolean result = testee.learnAsHam(mimeMessage.getInputStream(), USER);
-
-        assertThat(result).isTrue();
-    }
-
-    @Test
-    public void scanMailShouldMarkAsHamWhenMessageAlreadyLearnedAsHam() throws Exception {
-        MimeMessage mimeMessage = MimeMessageUtil.mimeMessageFromStream(
-            ClassLoader.getSystemResourceAsStream("spamassassin_db/ham/ham1"));
-
-        testee.learnAsHam(mimeMessage.getInputStream(), USER);
-
-        SpamAssassinResult result = testee.scanMail(mimeMessage, USER);
-
-        assertThat(result.getHeadersAsAttribute().get(SpamAssassinResult.FLAG_MAIL_ATTRIBUTE_NAME)).isEqualTo("NO");
-    }
-
-    @Test
-    public void learnAsHamShouldAllowToForgetSpam() throws Exception {
-        MimeMessage mimeMessage = MimeMessageUtil.mimeMessageFromStream(
-            ClassLoader.getSystemResourceAsStream("eml/spam.eml"));
-
-        byte[] messageAsBytes = MimeMessageUtil.asString(mimeMessage).getBytes(StandardCharsets.UTF_8);
-
-        testee.learnAsSpam(new ByteArrayInputStream(messageAsBytes), USER);
-        testee.learnAsHam(new ByteArrayInputStream(messageAsBytes), USER);
-
-        SpamAssassinResult result = testee.scanMail(mimeMessage, USER);
-
-        assertThat(result.getHeadersAsAttribute().get(SpamAssassinResult.FLAG_MAIL_ATTRIBUTE_NAME)).isEqualTo("NO");
-    }
-}

http://git-wip-us.apache.org/repos/asf/james-project/blob/1fd63a7f/server/container/util/src/test/java/org/apache/james/util/scanner/SpamAssassinResultTest.java
----------------------------------------------------------------------
diff --git a/server/container/util/src/test/java/org/apache/james/util/scanner/SpamAssassinResultTest.java b/server/container/util/src/test/java/org/apache/james/util/scanner/SpamAssassinResultTest.java
deleted file mode 100644
index 0b67589..0000000
--- a/server/container/util/src/test/java/org/apache/james/util/scanner/SpamAssassinResultTest.java
+++ /dev/null
@@ -1,96 +0,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.                                           *
- ****************************************************************/
-package org.apache.james.util.scanner;
-
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.assertj.core.api.Assertions.assertThatThrownBy;
-
-import org.assertj.core.api.JUnitSoftAssertions;
-import org.junit.Rule;
-import org.junit.Test;
-
-import com.google.common.collect.ImmutableMap;
-
-public class SpamAssassinResultTest {
-
-    @Rule
-    public JUnitSoftAssertions softly = new JUnitSoftAssertions();
-
-    @Test
-    public void buildShouldThrowWhenHitsIsNotGiven() {
-        assertThatThrownBy(() -> SpamAssassinResult.asSpam()
-                .requiredHits("4.0")
-                .build())
-            .isInstanceOf(NullPointerException.class);
-    }
-
-    @Test
-    public void buildShouldThrowWhenRequiredHitsIsNotGiven() {
-        assertThatThrownBy(() -> SpamAssassinResult.asSpam()
-                .hits("4.0")
-                .build())
-            .isInstanceOf(NullPointerException.class);
-    }
-
-    @Test
-    public void buildShouldWork() {
-        String hits = "1.1";
-        String requiredHits = "5.0";
-
-        SpamAssassinResult spamAssassinResult = SpamAssassinResult.asSpam()
-            .hits(hits)
-            .requiredHits(requiredHits)
-            .build();
-
-        softly.assertThat(spamAssassinResult.getHits()).isEqualTo(hits);
-        softly.assertThat(spamAssassinResult.getRequiredHits()).isEqualTo(requiredHits);
-        softly.assertThat(spamAssassinResult.getHeadersAsAttribute())
-            .containsAllEntriesOf(ImmutableMap.of(
-                SpamAssassinResult.FLAG_MAIL_ATTRIBUTE_NAME, "YES",
-                SpamAssassinResult.STATUS_MAIL_ATTRIBUTE_NAME, "Yes, hits=1.1 required=5.0"));
-    }
-
-    @Test
-    public void headersAsAttributeShouldContainSpamHeaderWithYESValueWhenBuiltAsSpam() {
-        String hits = "1.1";
-        String requiredHits = "5.0";
-
-        SpamAssassinResult spamAssassinResult = SpamAssassinResult.asSpam()
-            .hits(hits)
-            .requiredHits(requiredHits)
-            .build();
-
-        assertThat(spamAssassinResult.getHeadersAsAttribute())
-            .containsEntry(SpamAssassinResult.FLAG_MAIL_ATTRIBUTE_NAME, "YES");
-    }
-
-    @Test
-    public void headersAsAttributeShouldContainSpamHeaderWithNOValueWhenBuiltAsHam() {
-        String hits = "1.1";
-        String requiredHits = "5.0";
-
-        SpamAssassinResult spamAssassinResult = SpamAssassinResult.asHam()
-            .hits(hits)
-            .requiredHits(requiredHits)
-            .build();
-
-        assertThat(spamAssassinResult.getHeadersAsAttribute())
-            .containsEntry(SpamAssassinResult.FLAG_MAIL_ATTRIBUTE_NAME, "NO");
-    }
-}

http://git-wip-us.apache.org/repos/asf/james-project/blob/1fd63a7f/server/container/util/src/test/java/org/apache/james/util/scanner/SpamAssassinWaitStrategy.java
----------------------------------------------------------------------
diff --git a/server/container/util/src/test/java/org/apache/james/util/scanner/SpamAssassinWaitStrategy.java b/server/container/util/src/test/java/org/apache/james/util/scanner/SpamAssassinWaitStrategy.java
deleted file mode 100644
index 1341256..0000000
--- a/server/container/util/src/test/java/org/apache/james/util/scanner/SpamAssassinWaitStrategy.java
+++ /dev/null
@@ -1,67 +0,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.                                           *
- ****************************************************************/
-
-package org.apache.james.util.scanner;
-
-import java.io.IOException;
-import java.time.Duration;
-import java.util.concurrent.TimeUnit;
-
-import org.rnorth.ducttape.unreliables.Unreliables;
-import org.testcontainers.containers.GenericContainer;
-import org.testcontainers.containers.wait.strategy.WaitStrategy;
-import org.testcontainers.containers.wait.strategy.WaitStrategyTarget;
-
-import com.google.common.primitives.Ints;
-
-public class SpamAssassinWaitStrategy implements WaitStrategy {
-
-    private static final Duration DEFAULT_TIMEOUT = Duration.ofMinutes(1);
-    private final GenericContainer<?> spamAssassinContainer;
-    private Duration timeout = DEFAULT_TIMEOUT;
-
-    public SpamAssassinWaitStrategy(GenericContainer<?> spamAssassinContainer) {
-        this(spamAssassinContainer, DEFAULT_TIMEOUT);
-    }
-
-    public SpamAssassinWaitStrategy(GenericContainer<?> spamAssassinContainer, Duration timeout) {
-        this.spamAssassinContainer = spamAssassinContainer;
-        this.timeout = timeout;
-    }
-
-    @Override
-    public void waitUntilReady(WaitStrategyTarget waitStrategyTarget) {
-        Unreliables.retryUntilTrue(Ints.checkedCast(timeout.getSeconds()), TimeUnit.SECONDS, () -> {
-                try {
-                    return spamAssassinContainer
-                        .execInContainer("spamassassin", "-V")
-                        .getStdout()
-                        .contains("SpamAssassin version 3.4.1");
-                } catch (IOException | InterruptedException e) {
-                    return false;
-                }
-            }
-        );
-    }
-
-    @Override
-    public WaitStrategy withStartupTimeout(Duration startupTimeout) {
-        return new SpamAssassinWaitStrategy(spamAssassinContainer, startupTimeout);
-    }
-}

http://git-wip-us.apache.org/repos/asf/james-project/blob/1fd63a7f/server/container/util/src/test/resources/docker/spamassassin/Dockerfile
----------------------------------------------------------------------
diff --git a/server/container/util/src/test/resources/docker/spamassassin/Dockerfile b/server/container/util/src/test/resources/docker/spamassassin/Dockerfile
deleted file mode 100644
index ad1187a..0000000
--- a/server/container/util/src/test/resources/docker/spamassassin/Dockerfile
+++ /dev/null
@@ -1,43 +0,0 @@
-FROM postgres:10.3
-
-ENV SPAMASSASSIN_VERSION 3.4.1
-
-RUN apt-get update && \
-    DEBIAN_FRONTEND=noninteractive apt-get install --no-install-recommends -y \
-        gpg \
-        libio-socket-ip-perl \
-        libmail-dkim-perl \
-        libnet-ident-perl \
-        libsocket-getaddrinfo-perl \
-        pyzor \
-        razor \
-        libdbi-perl \
-        libdbd-pg-perl \
-        spamassassin=${SPAMASSASSIN_VERSION}* && \
-    apt-get clean && \
-    rm -rf /var/lib/apt/lists/*
-
-RUN mkdir -p /etc/spamassassin/sa-update-keys && \
-    chmod 700 /etc/spamassassin/sa-update-keys && \
-    chown debian-spamd:debian-spamd /etc/spamassassin/sa-update-keys && \
-    mkdir -p /var/lib/spamassassin/.pyzor && \
-    chmod 700 /var/lib/spamassassin/.pyzor && \
-    echo "public.pyzor.org:24441" > /var/lib/spamassassin/.pyzor/servers && \
-    chmod 600 /var/lib/spamassassin/.pyzor/servers && \
-    chown -R debian-spamd:debian-spamd /var/lib/spamassassin/.pyzor
-
-RUN sed -i 's/^logfile = .*$/logfile = \/dev\/stderr/g' /etc/razor/razor-agent.conf
-
-COPY spamd.sh /
-COPY rule-update.sh /
-COPY run.sh /
-RUN chmod 755 /spamd.sh /rule-update.sh /run.sh
-
-COPY local.cf /etc/spamassassin/
-
-# Bayes database will be created automatically by Postres
-COPY bayes_pg.sql /docker-entrypoint-initdb.d/
-
-EXPOSE 783
-
-ENTRYPOINT ["/spamd.sh"]

http://git-wip-us.apache.org/repos/asf/james-project/blob/1fd63a7f/server/container/util/src/test/resources/docker/spamassassin/bayes_pg.sql
----------------------------------------------------------------------
diff --git a/server/container/util/src/test/resources/docker/spamassassin/bayes_pg.sql b/server/container/util/src/test/resources/docker/spamassassin/bayes_pg.sql
deleted file mode 100644
index ef96472..0000000
--- a/server/container/util/src/test/resources/docker/spamassassin/bayes_pg.sql
+++ /dev/null
@@ -1,119 +0,0 @@
-
-CREATE TABLE bayes_expire (
-  id integer NOT NULL default '0',
-  runtime integer NOT NULL default '0'
-) WITHOUT OIDS;
-
-CREATE INDEX bayes_expire_idx1 ON bayes_expire (id);
-
-CREATE TABLE bayes_global_vars (
-  variable varchar(30) NOT NULL default '',
-  value varchar(200) NOT NULL default '',
-  PRIMARY KEY  (variable)
-) WITHOUT OIDS;
-
-INSERT INTO bayes_global_vars VALUES ('VERSION','3');
-
-CREATE TABLE bayes_seen (
-  id integer NOT NULL default '0',
-  msgid varchar(200) NOT NULL default '',
-  flag character(1) NOT NULL default '',
-  PRIMARY KEY  (id,msgid)
-) WITHOUT OIDS;
-
-CREATE TABLE bayes_token (
-  id integer NOT NULL default '0',
-  token bytea NOT NULL default '',
-  spam_count integer NOT NULL default '0',
-  ham_count integer NOT NULL default '0',
-  atime integer NOT NULL default '0',
-  PRIMARY KEY  (id,token)
-) WITHOUT OIDS;
-
-CREATE INDEX bayes_token_idx1 ON bayes_token (token);
-
-ALTER TABLE bayes_token SET (fillfactor=95);
-
-CREATE TABLE bayes_vars (
-  id serial NOT NULL,
-  username varchar(200) NOT NULL default '',
-  spam_count integer NOT NULL default '0',
-  ham_count integer NOT NULL default '0',
-  token_count integer NOT NULL default '0',
-  last_expire integer NOT NULL default '0',
-  last_atime_delta integer NOT NULL default '0',
-  last_expire_reduce integer NOT NULL default '0',
-  oldest_token_age integer NOT NULL default '2147483647',
-  newest_token_age integer NOT NULL default '0',
-  PRIMARY KEY  (id)
-) WITHOUT OIDS;
-
-CREATE UNIQUE INDEX bayes_vars_idx1 ON bayes_vars (username);
-
-CREATE OR REPLACE FUNCTION greatest_int (integer, integer)
- RETURNS INTEGER
- IMMUTABLE STRICT
- AS 'SELECT CASE WHEN $1 < $2 THEN $2 ELSE $1 END;'
- LANGUAGE SQL;
-
-CREATE OR REPLACE FUNCTION least_int (integer, integer)
- RETURNS INTEGER
- IMMUTABLE STRICT
- AS 'SELECT CASE WHEN $1 < $2 THEN $1 ELSE $2 END;'
- LANGUAGE SQL;
-
-CREATE OR REPLACE FUNCTION put_tokens(INTEGER,
-                                      BYTEA[],
-                                      INTEGER,
-                                      INTEGER,
-                                      INTEGER)
-RETURNS VOID AS ' 
-DECLARE
-  inuserid      ALIAS FOR $1;
-  intokenary    ALIAS FOR $2;
-  inspam_count  ALIAS FOR $3;
-  inham_count   ALIAS FOR $4;
-  inatime       ALIAS FOR $5;
-  _token BYTEA;
-  new_tokens INTEGER := 0;
-BEGIN
-  for i in array_lower(intokenary, 1) .. array_upper(intokenary, 1)
-  LOOP
-    _token := intokenary[i];
-    UPDATE bayes_token
-       SET spam_count = greatest_int(spam_count + inspam_count, 0),
-           ham_count = greatest_int(ham_count + inham_count, 0),
-           atime = greatest_int(atime, inatime)
-     WHERE id = inuserid 
-       AND token = _token;
-    IF NOT FOUND THEN 
-      -- we do not insert negative counts, just return true
-      IF NOT (inspam_count < 0 OR inham_count < 0) THEN
-        INSERT INTO bayes_token (id, token, spam_count, ham_count, atime) 
-        VALUES (inuserid, _token, inspam_count, inham_count, inatime); 
-        IF FOUND THEN
-          new_tokens := new_tokens + 1;
-        END IF;
-      END IF;
-    END IF;
-  END LOOP;
-
-  IF new_tokens > 0 AND inatime > 0 THEN
-    UPDATE bayes_vars
-       SET token_count = token_count + new_tokens,
-           newest_token_age = greatest_int(newest_token_age, inatime),
-           oldest_token_age = least_int(oldest_token_age, inatime)
-     WHERE id = inuserid;
-  ELSIF new_tokens > 0 AND NOT inatime > 0 THEN
-    UPDATE bayes_vars
-       SET token_count = token_count + new_tokens
-     WHERE id = inuserid;
-  ELSIF NOT new_tokens > 0 AND inatime > 0 THEN
-    UPDATE bayes_vars
-       SET newest_token_age = greatest_int(newest_token_age, inatime),
-           oldest_token_age = least_int(oldest_token_age, inatime)
-     WHERE id = inuserid;
-  END IF;
-  RETURN;
-END; 
-' LANGUAGE 'plpgsql'; 

http://git-wip-us.apache.org/repos/asf/james-project/blob/1fd63a7f/server/container/util/src/test/resources/docker/spamassassin/local.cf
----------------------------------------------------------------------
diff --git a/server/container/util/src/test/resources/docker/spamassassin/local.cf b/server/container/util/src/test/resources/docker/spamassassin/local.cf
deleted file mode 100644
index 6005e55..0000000
--- a/server/container/util/src/test/resources/docker/spamassassin/local.cf
+++ /dev/null
@@ -1,97 +0,0 @@
-# This is the right place to customize your installation of SpamAssassin.
-#
-# See 'perldoc Mail::SpamAssassin::Conf' for details of what can be
-# tweaked.
-#
-# Only a small subset of options are listed below
-#
-###########################################################################
-
-#   Add *****SPAM***** to the Subject header of spam e-mails
-#
-# rewrite_header Subject *****SPAM*****
-
-
-#   Save spam messages as a message/rfc822 MIME attachment instead of
-#   modifying the original message (0: off, 2: use text/plain instead)
-#
-# report_safe 1
-
-
-#   Set which networks or hosts are considered 'trusted' by your mail
-#   server (i.e. not spammers)
-#
-# trusted_networks 212.17.35.
-
-
-#   Set file-locking method (flock is not safe over NFS, but is faster)
-#
-# lock_method flock
-
-
-#   Set the threshold at which a message is considered spam (default: 5.0)
-#
-# required_score 5.0
-
-
-#   Use Bayesian classifier (default: 1)
-#
-use_bayes 1
-
-
-#   Bayesian classifier auto-learning (default: 1)
-#
-#bayes_auto_learn 1
-
-bayes_store_module Mail::SpamAssassin::BayesStore::PgSQL
-
-bayes_sql_dsn DBI:Pg:dbname=postgres;host=localhost
-bayes_sql_username postgres
-
-bayes_min_spam_num 1
-bayes_min_ham_num 1
-
-
-#   Set headers which may provide inappropriate cues to the Bayesian
-#   classifier
-#
-# bayes_ignore_header X-Bogosity
-# bayes_ignore_header X-Spam-Flag
-# bayes_ignore_header X-Spam-Status
-
-
-#   Whether to decode non- UTF-8 and non-ASCII textual parts and recode
-#   them to UTF-8 before the text is given over to rules processing.
-#
-# normalize_charset 1
-
-#   Some shortcircuiting, if the plugin is enabled
-# 
-ifplugin Mail::SpamAssassin::Plugin::Shortcircuit
-#
-#   default: strongly-whitelisted mails are *really* whitelisted now, if the
-#   shortcircuiting plugin is active, causing early exit to save CPU load.
-#   Uncomment to turn this on
-#
-# shortcircuit USER_IN_WHITELIST       on
-# shortcircuit USER_IN_DEF_WHITELIST   on
-# shortcircuit USER_IN_ALL_SPAM_TO     on
-# shortcircuit SUBJECT_IN_WHITELIST    on
-
-#   the opposite; blacklisted mails can also save CPU
-#
-# shortcircuit USER_IN_BLACKLIST       on
-# shortcircuit USER_IN_BLACKLIST_TO    on
-# shortcircuit SUBJECT_IN_BLACKLIST    on
-
-#   if you have taken the time to correctly specify your "trusted_networks",
-#   this is another good way to save CPU
-#
-# shortcircuit ALL_TRUSTED             on
-
-#   and a well-trained bayes DB can save running rules, too
-#
-# shortcircuit BAYES_99                spam
-# shortcircuit BAYES_00                ham
-
-endif # Mail::SpamAssassin::Plugin::Shortcircuit

http://git-wip-us.apache.org/repos/asf/james-project/blob/1fd63a7f/server/container/util/src/test/resources/docker/spamassassin/rule-update.sh
----------------------------------------------------------------------
diff --git a/server/container/util/src/test/resources/docker/spamassassin/rule-update.sh b/server/container/util/src/test/resources/docker/spamassassin/rule-update.sh
deleted file mode 100755
index 2867735..0000000
--- a/server/container/util/src/test/resources/docker/spamassassin/rule-update.sh
+++ /dev/null
@@ -1,7 +0,0 @@
-#!/bin/bash
-
-while true; do
-    sleep 1m
-    su debian-spamd -c 'sa-update' && kill -HUP `cat /var/run/spamd.pid`
-    sleep 1d
-done

http://git-wip-us.apache.org/repos/asf/james-project/blob/1fd63a7f/server/container/util/src/test/resources/docker/spamassassin/run.sh
----------------------------------------------------------------------
diff --git a/server/container/util/src/test/resources/docker/spamassassin/run.sh b/server/container/util/src/test/resources/docker/spamassassin/run.sh
deleted file mode 100755
index b4a1351..0000000
--- a/server/container/util/src/test/resources/docker/spamassassin/run.sh
+++ /dev/null
@@ -1,9 +0,0 @@
-#!/bin/bash
-set -m
-
-/rule-update.sh &
-/spamd.sh &
-
-pids=`jobs -p`
-
-wait

http://git-wip-us.apache.org/repos/asf/james-project/blob/1fd63a7f/server/container/util/src/test/resources/docker/spamassassin/spamd.sh
----------------------------------------------------------------------
diff --git a/server/container/util/src/test/resources/docker/spamassassin/spamd.sh b/server/container/util/src/test/resources/docker/spamassassin/spamd.sh
deleted file mode 100755
index 2093cf8..0000000
--- a/server/container/util/src/test/resources/docker/spamassassin/spamd.sh
+++ /dev/null
@@ -1,15 +0,0 @@
-#!/bin/bash
-
-echo "Run Postgres"
-/usr/local/bin/docker-entrypoint.sh postgres &
-
-echo "Run spamd"
-spamd --username debian-spamd \
-      --nouser-config \
-      --syslog stderr \
-      --pidfile /var/run/spamd.pid \
-      --helper-home-dir /var/lib/spamassassin \
-      --ip-address \
-      --allowed-ips 0.0.0.0/0 \
-      --allow-tell \
-      --debug bayes,learn

http://git-wip-us.apache.org/repos/asf/james-project/blob/1fd63a7f/server/container/util/src/test/resources/eml/spam.eml
----------------------------------------------------------------------
diff --git a/server/container/util/src/test/resources/eml/spam.eml b/server/container/util/src/test/resources/eml/spam.eml
deleted file mode 100755
index faf3402..0000000
--- a/server/container/util/src/test/resources/eml/spam.eml
+++ /dev/null
@@ -1,152 +0,0 @@
-Return-Path: <us...@james.org>
-Subject: Fwd: Invitation: (Aucun objet) - ven. 20 janv. 2017 14:00 - 15:00
- (CET) (user@james.org)
-To: <us...@james.org>
-From: user <us...@james.org>
-Message-ID: <f1...@james.org>
-Date: Thu, 19 Jan 2017 20:36:37 +0100
-MIME-Version: 1.0
-In-Reply-To: <00...@google.com>
-Content-Type: multipart/mixed;
- boundary="------------17D96D411CBD55D8239A8C1F"
-
-This is a multi-part message in MIME format.
---------------17D96D411CBD55D8239A8C1F
-Content-Type: multipart/alternative;
- boundary="------------64D716A3DDAEC185D3E67448"
-
-
---------------64D716A3DDAEC185D3E67448
-Content-Type: text/plain; charset=utf-8; format=flowed
-Content-Transfer-Encoding: 8bit
-
-
-
-
--------- Message transéré --------
-Sujet : 	Invitation: (Aucun objet) - ven. 20 janv. 2017 14:00 - 15:00
-(CET) (user@james.org)
-Date : 	Thu, 19 Jan 2017 19:18:23 +0000
-De : 	<us...@james.org>
-Répondre à : 	user@james.org
-Pour : 	user@james.org
-
-
-
-
---------------64D716A3DDAEC185D3E67448
-Content-Type: text/html; charset=utf-8
-Content-Transfer-Encoding: 8bit
-
-<html>
-  <head>
-
-    <meta http-equiv="content-type" content="text/html; charset=utf-8">
-  </head>
-  <body bgcolor="#FFFFFF" text="#000000">
-    <p><br>
-    </p>
-    <div class="moz-forward-container"><br>
-      <br>
-      -------- Message transéré --------
-      <table class="moz-email-headers-table" border="0" cellpadding="0"
-        cellspacing="0">
-        <tbody>
-          <tr>
-            <th align="RIGHT" valign="BASELINE" nowrap="nowrap">Sujet :
-            </th>
-            <td>Invitation: (Aucun objet) - ven. 20 janv. 2017 14:00 -
-              15:00 (CET) (<a class="moz-txt-link-abbreviated" href="mailto:user@james.org">user@james.org</a>)</td>
-          </tr>
-          <tr>
-            <th align="RIGHT" valign="BASELINE" nowrap="nowrap">Date : </th>
-            <td>Thu, 19 Jan 2017 19:18:23 +0000</td>
-          </tr>
-          <tr>
-            <th align="RIGHT" valign="BASELINE" nowrap="nowrap">De : </th>
-            <td>User <a class="moz-txt-link-rfc2396E" href="mailto:user@james.org">&lt;user@james.org&gt;</a></td>
-          </tr>
-          <tr>
-            <th align="RIGHT" valign="BASELINE" nowrap="nowrap">Répondre
-              Ã Â : </th>
-            <td><a class="moz-txt-link-abbreviated" href="mailto:user@james.org">user@james.org</a></td>
-          </tr>
-          <tr>
-            <th align="RIGHT" valign="BASELINE" nowrap="nowrap">Pour : </th>
-            <td><a class="moz-txt-link-abbreviated" href="mailto:user@james.org">user@james.org</a></td>
-          </tr>
-        </tbody>
-      </table>
-      <br>
-      <br>
-    </div>
-  </body>
-</html>
-
---------------64D716A3DDAEC185D3E67448--
-
---------------17D96D411CBD55D8239A8C1F
-Content-Type: text/calendar;
- name="Portion de message joint"
-Content-Transfer-Encoding: 8bit
-Content-Disposition: attachment;
- filename="Portion de message joint"
-
-BEGIN:VCALENDAR
-PRODID:-//Google Inc//Google Calendar 70.9054//EN
-VERSION:2.0
-CALSCALE:GREGORIAN
-METHOD:REQUEST
-BEGIN:VEVENT
-DTSTART:20170120T130000Z
-DTEND:20170120T140000Z
-DTSTAMP:20170119T191823Z
-ORGANIZER;CN=User:mailto:user@james.org
-UID:ah86k5m342bmcrbe9khkkhln00@google.com
-ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;RSVP=
- TRUE;CN=user@james.org;X-NUM-GUESTS=0:mailto:user@james.org
-ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;PARTSTAT=ACCEPTED;RSVP=TRUE
- ;CN=User;X-NUM-GUESTS=0:mailto:user@james.org
-CREATED:20170119T191823Z
-DESCRIPTION:Affichez votre evenement sur la page https://www.google.com/cal
- endar/event?action=VIEW&eid=YWg4Nms1bTM0MmJtY3JiZTlraGtraGxuMDAgYWR1cHJhdEB
- saW5hZ29yYS5jb20&tok=MTkjYW50ZHVwcmF0QGdtYWlsLmNvbTg1OTM5NWM4MGRlYmE1YTI4Nz
- RjN2UyNjU0M2YyZmQ4NzRkNThhYTQ&ctz=Europe/Paris&hl=fr.
-LAST-MODIFIED:20170119T191823Z
-LOCATION:
-SEQUENCE:0
-STATUS:CONFIRMED
-SUMMARY:
-TRANSP:OPAQUE
-END:VEVENT
-END:VCALENDAR
-
-
---------------17D96D411CBD55D8239A8C1F
-Content-Type: application/ics;
- name="invite.ics"
-Content-Transfer-Encoding: base64
-Content-Disposition: attachment;
- filename="invite.ics"
-
-QkVHSU46VkNBTEVOREFSDQpQUk9ESUQ6LS8vR29vZ2xlIEluYy8vR29vZ2xlIENhbGVuZGFy
-IDcwLjkwNTQvL0VODQpWRVJTSU9OOjIuMA0KQ0FMU0NBTEU6R1JFR09SSUFODQpNRVRIT0Q6
-UkVRVUVTVA0KQkVHSU46VkVWRU5UDQpEVFNUQVJUOjIwMTcwMTIwVDEzMDAwMFoNCkRURU5E
-OjIwMTcwMTIwVDE0MDAwMFoNCkRUU1RBTVA6MjAxNzAxMTlUMTkxODIzWg0KT1JHQU5JWkVS
-O0NOPUFudG9pbmUgRHVwcmF0Om1haWx0bzphbnRkdXByYXRAZ21haWwuY29tDQpVSUQ6YWg4
-Nms1bTM0MmJtY3JiZTlraGtraGxuMDBAZ29vZ2xlLmNvbQ0KQVRURU5ERUU7Q1VUWVBFPUlO
-RElWSURVQUw7Uk9MRT1SRVEtUEFSVElDSVBBTlQ7UEFSVFNUQVQ9TkVFRFMtQUNUSU9OO1JT
-VlA9DQogVFJVRTtDTj1hZHVwcmF0QGxpbmFnb3JhLmNvbTtYLU5VTS1HVUVTVFM9MDptYWls
-dG86YWR1cHJhdEBsaW5hZ29yYS5jb20NCkFUVEVOREVFO0NVVFlQRT1JTkRJVklEVUFMO1JP
-TEU9UkVRLVBBUlRJQ0lQQU5UO1BBUlRTVEFUPUFDQ0VQVEVEO1JTVlA9VFJVRQ0KIDtDTj1B
-bnRvaW5lIER1cHJhdDtYLU5VTS1HVUVTVFM9MDptYWlsdG86YW50ZHVwcmF0QGdtYWlsLmNv
-bQ0KQ1JFQVRFRDoyMDE3MDExOVQxOTE4MjNaDQpERVNDUklQVElPTjpBZmZpY2hleiB2b3Ry
-ZSDDqXbDqW5lbWVudCBzdXIgbGEgcGFnZSBodHRwczovL3d3dy5nb29nbGUuY29tL2NhbA0K
-IGVuZGFyL2V2ZW50P2FjdGlvbj1WSUVXJmVpZD1ZV2c0Tm1zMWJUTTBNbUp0WTNKaVpUbHJh
-R3RyYUd4dU1EQWdZV1IxY0hKaGRFQg0KIHNhVzVoWjI5eVlTNWpiMjAmdG9rPU1Ua2pZVzUw
-WkhWd2NtRjBRR2R0WVdsc0xtTnZiVGcxT1RNNU5XTTRNR1JsWW1FMVlUSTROeg0KIFJqTjJV
-eU5qVTBNMll5Wm1RNE56UmtOVGhoWVRRJmN0ej1FdXJvcGUvUGFyaXMmaGw9ZnIuDQpMQVNU
-LU1PRElGSUVEOjIwMTcwMTE5VDE5MTgyM1oNCkxPQ0FUSU9OOg0KU0VRVUVOQ0U6MA0KU1RB
-VFVTOkNPTkZJUk1FRA0KU1VNTUFSWToNClRSQU5TUDpPUEFRVUUNCkVORDpWRVZFTlQNCkVO
-RDpWQ0FMRU5EQVINCg==
---------------17D96D411CBD55D8239A8C1F--

http://git-wip-us.apache.org/repos/asf/james-project/blob/1fd63a7f/server/container/util/src/test/resources/spamassassin_db/ham/ham1
----------------------------------------------------------------------
diff --git a/server/container/util/src/test/resources/spamassassin_db/ham/ham1 b/server/container/util/src/test/resources/spamassassin_db/ham/ham1
deleted file mode 100644
index c50bb11..0000000
--- a/server/container/util/src/test/resources/spamassassin_db/ham/ham1
+++ /dev/null
@@ -1,113 +0,0 @@
-From exmh-workers-admin@redhat.com  Thu Aug 22 12:36:23 2002
-Return-Path: <ex...@spamassassin.taint.org>
-Delivered-To: zzzz@localhost.netnoteinc.com
-Received: from localhost (localhost [127.0.0.1])
-	by phobos.labs.netnoteinc.com (Postfix) with ESMTP id D03E543C36
-	for <zz...@localhost>; Thu, 22 Aug 2002 07:36:16 -0400 (EDT)
-Received: from phobos [127.0.0.1]
-	by localhost with IMAP (fetchmail-5.9.0)
-	for zzzz@localhost (single-drop); Thu, 22 Aug 2002 12:36:16 +0100 (IST)
-Received: from listman.spamassassin.taint.org (listman.spamassassin.taint.org [66.187.233.211]) by
-    dogma.slashnull.org (8.11.6/8.11.6) with ESMTP id g7MBYrZ04811 for
-    <zz...@spamassassin.taint.org>; Thu, 22 Aug 2002 12:34:53 +0100
-Received: from listman.spamassassin.taint.org (localhost.localdomain [127.0.0.1]) by
-    listman.redhat.com (Postfix) with ESMTP id 8386540858; Thu, 22 Aug 2002
-    07:35:02 -0400 (EDT)
-Delivered-To: exmh-workers@listman.spamassassin.taint.org
-Received: from int-mx1.corp.spamassassin.taint.org (int-mx1.corp.spamassassin.taint.org
-    [172.16.52.254]) by listman.redhat.com (Postfix) with ESMTP id 10CF8406D7
-    for <ex...@listman.redhat.com>; Thu, 22 Aug 2002 07:34:10 -0400
-    (EDT)
-Received: (from mail@localhost) by int-mx1.corp.spamassassin.taint.org (8.11.6/8.11.6)
-    id g7MBY7g11259 for exmh-workers@listman.redhat.com; Thu, 22 Aug 2002
-    07:34:07 -0400
-Received: from mx1.spamassassin.taint.org (mx1.spamassassin.taint.org [172.16.48.31]) by
-    int-mx1.corp.redhat.com (8.11.6/8.11.6) with SMTP id g7MBY7Y11255 for
-    <ex...@redhat.com>; Thu, 22 Aug 2002 07:34:07 -0400
-Received: from ratree.psu.ac.th ([202.28.97.6]) by mx1.spamassassin.taint.org
-    (8.11.6/8.11.6) with SMTP id g7MBIhl25223 for <ex...@redhat.com>;
-    Thu, 22 Aug 2002 07:18:55 -0400
-Received: from delta.cs.mu.OZ.AU (delta.coe.psu.ac.th [172.30.0.98]) by
-    ratree.psu.ac.th (8.11.6/8.11.6) with ESMTP id g7MBWel29762;
-    Thu, 22 Aug 2002 18:32:40 +0700 (ICT)
-Received: from munnari.OZ.AU (localhost [127.0.0.1]) by delta.cs.mu.OZ.AU
-    (8.11.6/8.11.6) with ESMTP id g7MBQPW13260; Thu, 22 Aug 2002 18:26:25
-    +0700 (ICT)
-From: Robert Elz <kr...@munnari.OZ.AU>
-To: Chris Garrigues <cw...@DeepEddy.Com>
-Cc: exmh-workers@spamassassin.taint.org
-Subject: Re: New Sequences Window
-In-Reply-To: <10...@deepeddy.vircio.com>
-References: <10...@deepeddy.vircio.com>
-    <10...@deepeddy.vircio.com> <96...@munnari.OZ.AU>
-    <10...@deepeddy.vircio.com>
-    <10...@deepeddy.vircio.com>
-MIME-Version: 1.0
-Content-Type: text/plain; charset=us-ascii
-Message-Id: <13...@munnari.OZ.AU>
-X-Loop: exmh-workers@spamassassin.taint.org
-Sender: exmh-workers-admin@spamassassin.taint.org
-Errors-To: exmh-workers-admin@spamassassin.taint.org
-X-Beenthere: exmh-workers@spamassassin.taint.org
-X-Mailman-Version: 2.0.1
-Precedence: bulk
-List-Help: <mailto:exmh-workers-request@spamassassin.taint.org?subject=help>
-List-Post: <ma...@spamassassin.taint.org>
-List-Subscribe: <https://listman.spamassassin.taint.org/mailman/listinfo/exmh-workers>,
-    <mailto:exmh-workers-request@redhat.com?subject=subscribe>
-List-Id: Discussion list for EXMH developers <exmh-workers.spamassassin.taint.org>
-List-Unsubscribe: <https://listman.spamassassin.taint.org/mailman/listinfo/exmh-workers>,
-    <mailto:exmh-workers-request@redhat.com?subject=unsubscribe>
-List-Archive: <https://listman.spamassassin.taint.org/mailman/private/exmh-workers/>
-Date: Thu, 22 Aug 2002 18:26:25 +0700
-
-    Date:        Wed, 21 Aug 2002 10:54:46 -0500
-    From:        Chris Garrigues <cw...@DeepEddy.Com>
-    Message-ID:  <10...@deepeddy.vircio.com>
-
-
-  | I can't reproduce this error.
-
-For me it is very repeatable... (like every time, without fail).
-
-This is the debug log of the pick happening ...
-
-18:19:03 Pick_It {exec pick +inbox -list -lbrace -lbrace -subject ftp -rbrace -rbrace} {4852-4852 -sequence mercury}
-18:19:03 exec pick +inbox -list -lbrace -lbrace -subject ftp -rbrace -rbrace 4852-4852 -sequence mercury
-18:19:04 Ftoc_PickMsgs {{1 hit}}
-18:19:04 Marking 1 hits
-18:19:04 tkerror: syntax error in expression "int ...
-
-Note, if I run the pick command by hand ...
-
-delta$ pick +inbox -list -lbrace -lbrace -subject ftp -rbrace -rbrace  4852-4852 -sequence mercury
-1 hit
-
-That's where the "1 hit" comes from (obviously).  The version of nmh I'm
-using is ...
-
-delta$ pick -version
-pick -- nmh-1.0.4 [compiled on fuchsia.cs.mu.OZ.AU at Sun Mar 17 14:55:56 ICT 2002]
-
-And the relevant part of my .mh_profile ...
-
-delta$ mhparam pick
--seq sel -list
-
-
-Since the pick command works, the sequence (actually, both of them, the
-one that's explicit on the command line, from the search popup, and the
-one that comes from .mh_profile) do get created.
-
-kre
-
-ps: this is still using the version of the code form a day ago, I haven't
-been able to reach the cvs repository today (local routing issue I think).
-
-
-
-_______________________________________________
-Exmh-workers mailing list
-Exmh-workers@redhat.com
-https://listman.redhat.com/mailman/listinfo/exmh-workers
-

http://git-wip-us.apache.org/repos/asf/james-project/blob/1fd63a7f/server/container/util/src/test/resources/spamassassin_db/ham/ham2
----------------------------------------------------------------------
diff --git a/server/container/util/src/test/resources/spamassassin_db/ham/ham2 b/server/container/util/src/test/resources/spamassassin_db/ham/ham2
deleted file mode 100644
index 7a5b23a..0000000
--- a/server/container/util/src/test/resources/spamassassin_db/ham/ham2
+++ /dev/null
@@ -1,73 +0,0 @@
-From Steve_Burt@cursor-system.com  Thu Aug 22 12:46:39 2002
-Return-Path: <St...@cursor-system.com>
-Delivered-To: zzzz@localhost.netnoteinc.com
-Received: from localhost (localhost [127.0.0.1])
-	by phobos.labs.netnoteinc.com (Postfix) with ESMTP id BE12E43C34
-	for <zz...@localhost>; Thu, 22 Aug 2002 07:46:38 -0400 (EDT)
-Received: from phobos [127.0.0.1]
-	by localhost with IMAP (fetchmail-5.9.0)
-	for zzzz@localhost (single-drop); Thu, 22 Aug 2002 12:46:38 +0100 (IST)
-Received: from n20.grp.scd.yahoo.com (n20.grp.scd.yahoo.com
-    [66.218.66.76]) by dogma.slashnull.org (8.11.6/8.11.6) with SMTP id
-    g7MBkTZ05087 for <zz...@spamassassin.taint.org>; Thu, 22 Aug 2002 12:46:29 +0100
-X-Egroups-Return: sentto-2242572-52726-1030016790-zzzz=spamassassin.taint.org@returns.groups.yahoo.com
-Received: from [66.218.67.196] by n20.grp.scd.yahoo.com with NNFMP;
-    22 Aug 2002 11:46:30 -0000
-X-Sender: steve.burt@cursor-system.com
-X-Apparently-To: zzzzteana@yahoogroups.com
-Received: (EGP: mail-8_1_0_1); 22 Aug 2002 11:46:29 -0000
-Received: (qmail 11764 invoked from network); 22 Aug 2002 11:46:29 -0000
-Received: from unknown (66.218.66.217) by m3.grp.scd.yahoo.com with QMQP;
-    22 Aug 2002 11:46:29 -0000
-Received: from unknown (HELO mailgateway.cursor-system.com) (62.189.7.27)
-    by mta2.grp.scd.yahoo.com with SMTP; 22 Aug 2002 11:46:29 -0000
-Received: from exchange1.cps.local (unverified) by
-    mailgateway.cursor-system.com (Content Technologies SMTPRS 4.2.10) with
-    ESMTP id <T5...@mailgateway.cursor-system.com> for
-    <fo...@yahoogroups.com>; Thu, 22 Aug 2002 13:14:10 +0100
-Received: by exchange1.cps.local with Internet Mail Service (5.5.2653.19)
-    id <PXX6AT23>; Thu, 22 Aug 2002 12:46:27 +0100
-Message-Id: <5E...@exchange1.cps.local>
-To: "'zzzzteana@yahoogroups.com'" <zz...@yahoogroups.com>
-X-Mailer: Internet Mail Service (5.5.2653.19)
-X-Egroups-From: Steve Burt <st...@cursor-system.com>
-From: Steve Burt <St...@cursor-system.com>
-X-Yahoo-Profile: pyruse
-MIME-Version: 1.0
-Mailing-List: list zzzzteana@yahoogroups.com; contact
-    forteana-owner@yahoogroups.com
-Delivered-To: mailing list zzzzteana@yahoogroups.com
-Precedence: bulk
-List-Unsubscribe: <ma...@yahoogroups.com>
-Date: Thu, 22 Aug 2002 12:46:18 +0100
-Subject: [zzzzteana] RE: Alexander
-Reply-To: zzzzteana@yahoogroups.com
-Content-Type: text/plain; charset=US-ASCII
-Content-Transfer-Encoding: 7bit
-
-Martin A posted:
-Tassos Papadopoulos, the Greek sculptor behind the plan, judged that the
- limestone of Mount Kerdylio, 70 miles east of Salonika and not far from the
- Mount Athos monastic community, was ideal for the patriotic sculpture. 
- 
- As well as Alexander's granite features, 240 ft high and 170 ft wide, a
- museum, a restored amphitheatre and car park for admiring crowds are
-planned
----------------------
-So is this mountain limestone or granite?
-If it's limestone, it'll weather pretty fast.
-
------------------------- Yahoo! Groups Sponsor ---------------------~-->
-4 DVDs Free +s&p Join Now
-http://us.click.yahoo.com/pt6YBB/NXiEAA/mG3HAA/7gSolB/TM
----------------------------------------------------------------------~->
-
-To unsubscribe from this group, send an email to:
-forteana-unsubscribe@egroups.com
-
- 
-
-Your use of Yahoo! Groups is subject to http://docs.yahoo.com/info/terms/ 
-
-
-

http://git-wip-us.apache.org/repos/asf/james-project/blob/1fd63a7f/server/container/util/src/test/resources/spamassassin_db/ham/ham3
----------------------------------------------------------------------
diff --git a/server/container/util/src/test/resources/spamassassin_db/ham/ham3 b/server/container/util/src/test/resources/spamassassin_db/ham/ham3
deleted file mode 100644
index c7cfbc8..0000000
--- a/server/container/util/src/test/resources/spamassassin_db/ham/ham3
+++ /dev/null
@@ -1,82 +0,0 @@
-From timc@2ubh.com  Thu Aug 22 13:52:59 2002
-Return-Path: <ti...@2ubh.com>
-Delivered-To: zzzz@localhost.netnoteinc.com
-Received: from localhost (localhost [127.0.0.1])
-	by phobos.labs.netnoteinc.com (Postfix) with ESMTP id 0314547C66
-	for <zz...@localhost>; Thu, 22 Aug 2002 08:52:58 -0400 (EDT)
-Received: from phobos [127.0.0.1]
-	by localhost with IMAP (fetchmail-5.9.0)
-	for zzzz@localhost (single-drop); Thu, 22 Aug 2002 13:52:59 +0100 (IST)
-Received: from n16.grp.scd.yahoo.com (n16.grp.scd.yahoo.com
-    [66.218.66.71]) by dogma.slashnull.org (8.11.6/8.11.6) with SMTP id
-    g7MCrdZ07070 for <zz...@spamassassin.taint.org>; Thu, 22 Aug 2002 13:53:39 +0100
-X-Egroups-Return: sentto-2242572-52733-1030020820-zzzz=spamassassin.taint.org@returns.groups.yahoo.com
-Received: from [66.218.67.198] by n16.grp.scd.yahoo.com with NNFMP;
-    22 Aug 2002 12:53:40 -0000
-X-Sender: timc@2ubh.com
-X-Apparently-To: zzzzteana@yahoogroups.com
-Received: (EGP: mail-8_1_0_1); 22 Aug 2002 12:53:39 -0000
-Received: (qmail 76099 invoked from network); 22 Aug 2002 12:53:39 -0000
-Received: from unknown (66.218.66.218) by m5.grp.scd.yahoo.com with QMQP;
-    22 Aug 2002 12:53:39 -0000
-Received: from unknown (HELO rhenium.btinternet.com) (194.73.73.93) by
-    mta3.grp.scd.yahoo.com with SMTP; 22 Aug 2002 12:53:39 -0000
-Received: from host217-36-23-185.in-addr.btopenworld.com ([217.36.23.185])
-    by rhenium.btinternet.com with esmtp (Exim 3.22 #8) id 17hrT0-0004gj-00
-    for forteana@yahoogroups.com; Thu, 22 Aug 2002 13:53:38 +0100
-X-Mailer: Microsoft Outlook Express Macintosh Edition - 4.5 (0410)
-To: zzzzteana <zz...@yahoogroups.com>
-X-Priority: 3
-Message-Id: <E1...@rhenium.btinternet.com>
-From: "Tim Chapman" <ti...@2ubh.com>
-X-Yahoo-Profile: tim2ubh
-MIME-Version: 1.0
-Mailing-List: list zzzzteana@yahoogroups.com; contact
-    forteana-owner@yahoogroups.com
-Delivered-To: mailing list zzzzteana@yahoogroups.com
-Precedence: bulk
-List-Unsubscribe: <ma...@yahoogroups.com>
-Date: Thu, 22 Aug 2002 13:52:38 +0100
-Subject: [zzzzteana] Moscow bomber
-Reply-To: zzzzteana@yahoogroups.com
-Content-Type: text/plain; charset=US-ASCII
-Content-Transfer-Encoding: 7bit
-
-Man Threatens Explosion In Moscow 
-
-Thursday August 22, 2002 1:40 PM
-MOSCOW (AP) - Security officers on Thursday seized an unidentified man who
-said he was armed with explosives and threatened to blow up his truck in
-front of Russia's Federal Security Services headquarters in Moscow, NTV
-television reported.
-The officers seized an automatic rifle the man was carrying, then the man
-got out of the truck and was taken into custody, NTV said. No other details
-were immediately available.
-The man had demanded talks with high government officials, the Interfax and
-ITAR-Tass news agencies said. Ekho Moskvy radio reported that he wanted to
-talk with Russian President Vladimir Putin.
-Police and security forces rushed to the Security Service building, within
-blocks of the Kremlin, Red Square and the Bolshoi Ballet, and surrounded the
-man, who claimed to have one and a half tons of explosives, the news
-agencies said. Negotiations continued for about one and a half hours outside
-the building, ITAR-Tass and Interfax reported, citing witnesses.
-The man later drove away from the building, under police escort, and drove
-to a street near Moscow's Olympic Penta Hotel, where authorities held
-further negotiations with him, the Moscow police press service said. The
-move appeared to be an attempt by security services to get him to a more
-secure location. 
-
------------------------- Yahoo! Groups Sponsor ---------------------~-->
-4 DVDs Free +s&p Join Now
-http://us.click.yahoo.com/pt6YBB/NXiEAA/mG3HAA/7gSolB/TM
----------------------------------------------------------------------~->
-
-To unsubscribe from this group, send an email to:
-forteana-unsubscribe@egroups.com
-
- 
-
-Your use of Yahoo! Groups is subject to http://docs.yahoo.com/info/terms/ 
-
-
-

http://git-wip-us.apache.org/repos/asf/james-project/blob/1fd63a7f/server/container/util/src/test/resources/spamassassin_db/ham/ham4
----------------------------------------------------------------------
diff --git a/server/container/util/src/test/resources/spamassassin_db/ham/ham4 b/server/container/util/src/test/resources/spamassassin_db/ham/ham4
deleted file mode 100644
index 9a726c2..0000000
--- a/server/container/util/src/test/resources/spamassassin_db/ham/ham4
+++ /dev/null
@@ -1,78 +0,0 @@
-From irregulars-admin@tb.tf  Thu Aug 22 14:23:39 2002
-Return-Path: <ir...@tb.tf>
-Delivered-To: zzzz@localhost.netnoteinc.com
-Received: from localhost (localhost [127.0.0.1])
-	by phobos.labs.netnoteinc.com (Postfix) with ESMTP id 9DAE147C66
-	for <zz...@localhost>; Thu, 22 Aug 2002 09:23:38 -0400 (EDT)
-Received: from phobos [127.0.0.1]
-	by localhost with IMAP (fetchmail-5.9.0)
-	for zzzz@localhost (single-drop); Thu, 22 Aug 2002 14:23:38 +0100 (IST)
-Received: from web.tb.tf (route-64-131-126-36.telocity.com
-    [64.131.126.36]) by dogma.slashnull.org (8.11.6/8.11.6) with ESMTP id
-    g7MDGOZ07922 for <zz...@spamassassin.taint.org>; Thu, 22 Aug 2002 14:16:24 +0100
-Received: from web.tb.tf (localhost.localdomain [127.0.0.1]) by web.tb.tf
-    (8.11.6/8.11.6) with ESMTP id g7MDP9I16418; Thu, 22 Aug 2002 09:25:09
-    -0400
-Received: from red.harvee.home (red [192.168.25.1] (may be forged)) by
-    web.tb.tf (8.11.6/8.11.6) with ESMTP id g7MDO4I16408 for
-    <ir...@tb.tf>; Thu, 22 Aug 2002 09:24:04 -0400
-Received: from prserv.net (out4.prserv.net [32.97.166.34]) by
-    red.harvee.home (8.11.6/8.11.6) with ESMTP id g7MDFBD29237 for
-    <ir...@tb.tf>; Thu, 22 Aug 2002 09:15:12 -0400
-Received: from [209.202.248.109]
-    (slip-32-103-249-10.ma.us.prserv.net[32.103.249.10]) by prserv.net (out4)
-    with ESMTP id <2002082213150220405qu8jce>; Thu, 22 Aug 2002 13:15:07 +0000
-MIME-Version: 1.0
-X-Sender: @ (Unverified)
-Message-Id: <p04330137b98a941c58a8@[209.202.248.109]>
-To: undisclosed-recipient: ;
-From: Monty Solomon <mo...@roscom.com>
-Content-Type: text/plain; charset="us-ascii"
-Subject: [IRR] Klez: The Virus That  Won't Die
-Sender: irregulars-admin@tb.tf
-Errors-To: irregulars-admin@tb.tf
-X-Beenthere: irregulars@tb.tf
-X-Mailman-Version: 2.0.6
-Precedence: bulk
-List-Help: <mailto:irregulars-request@tb.tf?subject=help>
-List-Post: <ma...@tb.tf>
-List-Subscribe: <http://tb.tf/mailman/listinfo/irregulars>,
-    <mailto:irregulars-request@tb.tf?subject=subscribe>
-List-Id: New home of the TBTF Irregulars mailing list <irregulars.tb.tf>
-List-Unsubscribe: <http://tb.tf/mailman/listinfo/irregulars>,
-    <mailto:irregulars-request@tb.tf?subject=unsubscribe>
-List-Archive: <http://tb.tf/mailman/private/irregulars/>
-Date: Thu, 22 Aug 2002 09:15:25 -0400
-
-Klez: The Virus That Won't Die
- 
-Already the most prolific virus ever, Klez continues to wreak havoc.
-
-Andrew Brandt
->>From the September 2002 issue of PC World magazine
-Posted Thursday, August 01, 2002
-
-
-The Klez worm is approaching its seventh month of wriggling across 
-the Web, making it one of the most persistent viruses ever. And 
-experts warn that it may be a harbinger of new viruses that use a 
-combination of pernicious approaches to go from PC to PC.
-
-Antivirus software makers Symantec and McAfee both report more than 
-2000 new infections daily, with no sign of letup at press time. The 
-British security firm MessageLabs estimates that 1 in every 300 
-e-mail messages holds a variation of the Klez virus, and says that 
-Klez has already surpassed last summer's SirCam as the most prolific 
-virus ever.
-
-And some newer Klez variants aren't merely nuisances--they can carry 
-other viruses in them that corrupt your data.
-
-...
-
-http://www.pcworld.com/news/article/0,aid,103259,00.asp
-_______________________________________________
-Irregulars mailing list
-Irregulars@tb.tf
-http://tb.tf/mailman/listinfo/irregulars
-

http://git-wip-us.apache.org/repos/asf/james-project/blob/1fd63a7f/server/container/util/src/test/resources/spamassassin_db/ham/ham5
----------------------------------------------------------------------
diff --git a/server/container/util/src/test/resources/spamassassin_db/ham/ham5 b/server/container/util/src/test/resources/spamassassin_db/ham/ham5
deleted file mode 100644
index 57b6801..0000000
--- a/server/container/util/src/test/resources/spamassassin_db/ham/ham5
+++ /dev/null
@@ -1,77 +0,0 @@
-From Stewart.Smith@ee.ed.ac.uk  Thu Aug 22 14:44:26 2002
-Return-Path: <St...@ee.ed.ac.uk>
-Delivered-To: zzzz@localhost.netnoteinc.com
-Received: from localhost (localhost [127.0.0.1])
-	by phobos.labs.netnoteinc.com (Postfix) with ESMTP id EC69D47C66
-	for <zz...@localhost>; Thu, 22 Aug 2002 09:44:25 -0400 (EDT)
-Received: from phobos [127.0.0.1]
-	by localhost with IMAP (fetchmail-5.9.0)
-	for zzzz@localhost (single-drop); Thu, 22 Aug 2002 14:44:25 +0100 (IST)
-Received: from n6.grp.scd.yahoo.com (n6.grp.scd.yahoo.com [66.218.66.90])
-    by dogma.slashnull.org (8.11.6/8.11.6) with SMTP id g7MDcOZ08504 for
-    <zz...@spamassassin.taint.org>; Thu, 22 Aug 2002 14:38:25 +0100
-X-Egroups-Return: sentto-2242572-52736-1030023506-zzzz=spamassassin.taint.org@returns.groups.yahoo.com
-Received: from [66.218.67.192] by n6.grp.scd.yahoo.com with NNFMP;
-    22 Aug 2002 13:38:26 -0000
-X-Sender: Stewart.Smith@ee.ed.ac.uk
-X-Apparently-To: zzzzteana@yahoogroups.com
-Received: (EGP: mail-8_1_0_1); 22 Aug 2002 13:38:25 -0000
-Received: (qmail 48882 invoked from network); 22 Aug 2002 13:38:25 -0000
-Received: from unknown (66.218.66.218) by m10.grp.scd.yahoo.com with QMQP;
-    22 Aug 2002 13:38:25 -0000
-Received: from unknown (HELO postbox.ee.ed.ac.uk) (129.215.80.253) by
-    mta3.grp.scd.yahoo.com with SMTP; 22 Aug 2002 13:38:24 -0000
-Received: from ee.ed.ac.uk (sxs@dunblane [129.215.34.86]) by
-    postbox.ee.ed.ac.uk (8.11.0/8.11.0) with ESMTP id g7MDcNi28645 for
-    <fo...@yahoogroups.com>; Thu, 22 Aug 2002 14:38:23 +0100 (BST)
-Message-Id: <3D...@ee.ed.ac.uk>
-Organization: Scottish Microelectronics Centre
-User-Agent: Mozilla/5.0 (X11; U; SunOS sun4u; en-US; rv:1.1b) Gecko/20020628
-X-Accept-Language: en, en-us
-To: zzzzteana@yahoogroups.com
-References: <3D...@localhost>
-From: Stewart Smith <St...@ee.ed.ac.uk>
-X-Yahoo-Profile: stochasticus
-MIME-Version: 1.0
-Mailing-List: list zzzzteana@yahoogroups.com; contact
-    forteana-owner@yahoogroups.com
-Delivered-To: mailing list zzzzteana@yahoogroups.com
-Precedence: bulk
-List-Unsubscribe: <ma...@yahoogroups.com>
-Date: Thu, 22 Aug 2002 14:38:22 +0100
-Subject: Re: [zzzzteana] Nothing like mama used to make
-Reply-To: zzzzteana@yahoogroups.com
-Content-Type: text/plain; charset=US-ASCII
-Content-Transfer-Encoding: 7bit
-
->  in adding cream to spaghetti carbonara, which has the same effect on pasta as
->  making a pizza a deep-pie; 
-
-I just had to jump in here as Carbonara is one of my favourites to make and ask 
-what the hell are you supposed to use instead of cream?  I've never seen a 
-recipe that hasn't used this.  Personally I use low fat creme fraiche because it 
-works quite nicely but the only time I've seen an supposedly authentic recipe 
-for carbonara  it was identical to mine (cream, eggs and lots of fresh parmesan) 
-except for the creme fraiche.
-
-Stew
--- 
-Stewart Smith
-Scottish Microelectronics Centre, University of Edinburgh.
-http://www.ee.ed.ac.uk/~sxs/
-
-
------------------------- Yahoo! Groups Sponsor ---------------------~-->
-4 DVDs Free +s&p Join Now
-http://us.click.yahoo.com/pt6YBB/NXiEAA/mG3HAA/7gSolB/TM
----------------------------------------------------------------------~->
-
-To unsubscribe from this group, send an email to:
-forteana-unsubscribe@egroups.com
-
- 
-
-Your use of Yahoo! Groups is subject to http://docs.yahoo.com/info/terms/ 
-
-
-


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org