JAMES-2015 make mail sent by vacation mailet marked as authenticated

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

Branch: refs/heads/master
Commit: 2aba6ef3a6822a4bbf9504960ba2fb8b77763223
Parents: 469a074
Author: Luc DUZAN <[email protected]>
Authored: Fri May 5 11:27:26 2017 +0200
Committer: benwa <[email protected]>
Committed: Wed May 17 15:12:48 2017 +0700

----------------------------------------------------------------------
 .../destination/conf/mailetcontainer.xml        |  5 +-
 .../destination/conf/mailetcontainer.xml        | 12 ++-
 .../jpa/destination/conf/mailetcontainer.xml    |  2 +-
 .../spring/destination/conf/mailetcontainer.xml |  9 +-
 .../src/main/java/org/apache/mailet/Mail.java   |  1 +
 .../mailet/base/test/FakeMailContext.java       | 15 +++-
 .../james/transport/matchers/SentByMailet.java  | 41 +++++++++
 .../mailets/UseHeaderRecipientsTest.java        |  1 +
 .../transport/matchers/SentByMailetTest.java    | 92 +++++++++++++++++++
 .../src/test/resources/mailetcontainer.xml      | 11 ++-
 .../src/test/resources/mailetcontainer.xml      |  8 +-
 .../sample-configuration/mailetcontainer.xml    |  8 +-
 .../sample-configuration/mailetcontainer.xml    | 12 ++-
 .../src/test/resources/mailetcontainer.xml      | 11 ++-
 .../resources/defaultJmapMailetContainer.xml    |  5 +-
 .../impl/JamesMailetContext.java                |  1 +
 .../james/transport/mailets/BounceTest.java     |  1 +
 .../RecipientRewriteTableProcessorTest.java     |  5 ++
 .../mailets/delivery/MailDispatcherTest.java    |  1 +
 .../mailets/delivery/SieveIntegrationTest.java  |  7 ++
 .../managesieve/ManageSieveMailetTestCase.java  |  1 +
 .../mailets/remoteDelivery/BouncerTest.java     |  2 +
 .../CassandraVacationRelayIntegrationTest.java  |  2 -
 .../src/test/resources/mailetcontainer.xml      | 11 ++-
 .../MemoryVacationRelayIntegrationTest.java     |  2 -
 .../src/test/resources/mailetcontainer.xml      |  8 +-
 .../apache/james/jmap/mailet/SentByJmap.java    | 42 +++++++++
 .../james/jmap/mailet/SentByJmapTest.java       | 94 ++++++++++++++++++++
 .../src/test/resources/mailetcontainer.xml      |  8 +-
 29 files changed, 396 insertions(+), 22 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/2aba6ef3/dockerfiles/run/guice/cassandra-ldap/destination/conf/mailetcontainer.xml
----------------------------------------------------------------------
diff --git 
a/dockerfiles/run/guice/cassandra-ldap/destination/conf/mailetcontainer.xml 
b/dockerfiles/run/guice/cassandra-ldap/destination/conf/mailetcontainer.xml
index 681b966..5a45d3e 100644
--- a/dockerfiles/run/guice/cassandra-ldap/destination/conf/mailetcontainer.xml
+++ b/dockerfiles/run/guice/cassandra-ldap/destination/conf/mailetcontainer.xml
@@ -73,7 +73,10 @@
             <mailet match="SMTPAuthSuccessful" class="ToProcessor">
                 <processor>relay</processor>
             </mailet>
-            <mailet 
match="HasMailAttribute=org.apache.james.jmap.send.MailMetaData.messageId" 
class="ToProcessor">
+            <mailet match="org.apache.james.jmap.mailet.SentByJmap" 
class="ToProcessor">
+                <processor>relay</processor>
+            </mailet>
+            <mailet match="SentByMailet" class="ToProcessor">
                 <processor>relay</processor>
             </mailet>
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/2aba6ef3/dockerfiles/run/guice/cassandra/destination/conf/mailetcontainer.xml
----------------------------------------------------------------------
diff --git 
a/dockerfiles/run/guice/cassandra/destination/conf/mailetcontainer.xml 
b/dockerfiles/run/guice/cassandra/destination/conf/mailetcontainer.xml
index 681b966..d766643 100644
--- a/dockerfiles/run/guice/cassandra/destination/conf/mailetcontainer.xml
+++ b/dockerfiles/run/guice/cassandra/destination/conf/mailetcontainer.xml
@@ -70,10 +70,16 @@
                 <notice>550 - Requested action not taken: no such user 
here</notice>
             </mailet>
 
-            <mailet match="SMTPAuthSuccessful" class="ToProcessor">
-                <processor>relay</processor>
+            <mailet match="SMTPAuthSuccessful" class="SetMailAttribute">
+                <RelayAllowed>true</RelayAllowed>
+            </mailet>
+            <mailet match="SentByMailet" class="SetMailAttribute">
+                <RelayAllowed>true</RelayAllowed>
+            </mailet>
+            <mailet match="org.apache.james.jmap.mailet.SentByJmap" 
class="SetMailAttribute">
+                <RelayAllowed>true</RelayAllowed>
             </mailet>
-            <mailet 
match="HasMailAttribute=org.apache.james.jmap.send.MailMetaData.messageId" 
class="ToProcessor">
+            <mailet match="HasMailAttribute=RelayAllowed" class="ToProcessor">
                 <processor>relay</processor>
             </mailet>
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/2aba6ef3/dockerfiles/run/guice/jpa/destination/conf/mailetcontainer.xml
----------------------------------------------------------------------
diff --git a/dockerfiles/run/guice/jpa/destination/conf/mailetcontainer.xml 
b/dockerfiles/run/guice/jpa/destination/conf/mailetcontainer.xml
index 29248b8..cc18299 100644
--- a/dockerfiles/run/guice/jpa/destination/conf/mailetcontainer.xml
+++ b/dockerfiles/run/guice/jpa/destination/conf/mailetcontainer.xml
@@ -72,7 +72,7 @@
             <mailet match="SMTPAuthSuccessful" class="ToProcessor">
                 <processor>relay</processor>
             </mailet>
-            <mailet 
match="HasMailAttribute=org.apache.james.jmap.send.MailMetaData.messageId" 
class="ToProcessor">
+            <mailet match="SentByMailet" class="ToProcessor">
                 <processor>relay</processor>
             </mailet>
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/2aba6ef3/dockerfiles/run/spring/destination/conf/mailetcontainer.xml
----------------------------------------------------------------------
diff --git a/dockerfiles/run/spring/destination/conf/mailetcontainer.xml 
b/dockerfiles/run/spring/destination/conf/mailetcontainer.xml
index 29248b8..2998503 100644
--- a/dockerfiles/run/spring/destination/conf/mailetcontainer.xml
+++ b/dockerfiles/run/spring/destination/conf/mailetcontainer.xml
@@ -69,10 +69,13 @@
                 <notice>550 - Requested action not taken: no such user 
here</notice>
             </mailet>
 
-            <mailet match="SMTPAuthSuccessful" class="ToProcessor">
-                <processor>relay</processor>
+            <mailet match="SMTPAuthSuccessful" class="SetMailAttribute">
+                <RelayAllowed>true</RelayAllowed>
+            </mailet>
+            <mailet match="SentByMailet" class="SetMailAttribute">
+                <RelayAllowed>true</RelayAllowed>
             </mailet>
-            <mailet 
match="HasMailAttribute=org.apache.james.jmap.send.MailMetaData.messageId" 
class="ToProcessor">
+            <mailet match="HasMailAttribute=RelayAllowed" class="ToProcessor">
                 <processor>relay</processor>
             </mailet>
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/2aba6ef3/mailet/api/src/main/java/org/apache/mailet/Mail.java
----------------------------------------------------------------------
diff --git a/mailet/api/src/main/java/org/apache/mailet/Mail.java 
b/mailet/api/src/main/java/org/apache/mailet/Mail.java
index 982e48e..158359a 100644
--- a/mailet/api/src/main/java/org/apache/mailet/Mail.java
+++ b/mailet/api/src/main/java/org/apache/mailet/Mail.java
@@ -74,6 +74,7 @@ public interface Mail extends Serializable, Cloneable {
     String ERROR = "error";
     String TRANSPORT = "transport";
     String SMTP_AUTH_USER_ATTRIBUTE_NAME = "org.apache.james.SMTPAuthUser";
+    String SENT_BY_MAILET = "org.apache.james.SentByMailet";
     /**
      * Returns the name of this message.
      * 

http://git-wip-us.apache.org/repos/asf/james-project/blob/2aba6ef3/mailet/base/src/test/java/org/apache/mailet/base/test/FakeMailContext.java
----------------------------------------------------------------------
diff --git 
a/mailet/base/src/test/java/org/apache/mailet/base/test/FakeMailContext.java 
b/mailet/base/src/test/java/org/apache/mailet/base/test/FakeMailContext.java
index 1b22e44..9a70622 100644
--- a/mailet/base/src/test/java/org/apache/mailet/base/test/FakeMailContext.java
+++ b/mailet/base/src/test/java/org/apache/mailet/base/test/FakeMailContext.java
@@ -56,13 +56,14 @@ public class FakeMailContext implements MailetContext {
         return new SentMail.Builder();
     }
 
-    public static SentMail fromMail(Mail mail ) throws MessagingException {
+    public static SentMail fromMail(Mail mail) throws MessagingException {
         return sentMailBuilder()
             .sender(mail.getSender())
             .recipients(mail.getRecipients())
             .message(mail.getMessage())
             .state(mail.getState())
             .attributes(buildAttributesMap(mail))
+            .fromMailet()
             .build();
     }
 
@@ -111,6 +112,7 @@ public class FakeMailContext implements MailetContext {
             private MimeMessage msg;
             private Map<String, Serializable> attributes = new HashMap<String, 
Serializable>();
             private Optional<String> state = Optional.absent();
+            private Optional<Boolean> fromMailet = Optional.absent();
 
             public Builder sender(MailAddress sender) {
                 this.sender = sender;
@@ -122,6 +124,11 @@ public class FakeMailContext implements MailetContext {
                 return this;
             }
 
+            public Builder fromMailet() {
+                this.fromMailet = Optional.of(true);
+                return this;
+            }
+
             public Builder recipients(MailAddress... recipients) {
                 this.recipients = 
Optional.<Collection<MailAddress>>of(ImmutableList.copyOf(recipients));
                 return this;
@@ -153,6 +160,9 @@ public class FakeMailContext implements MailetContext {
             }
 
             public SentMail build() {
+                if (fromMailet.or(false)) {
+                    this.attribute(Mail.SENT_BY_MAILET, "true");
+                }
                 return new SentMail(sender, 
recipients.or(ImmutableList.<MailAddress>of()), msg,
                     ImmutableMap.copyOf(attributes), state.or(Mail.DEFAULT));
             }
@@ -371,6 +381,7 @@ public class FakeMailContext implements MailetContext {
     public void sendMail(MimeMessage mimemessage) throws MessagingException {
         sentMails.add(sentMailBuilder()
             .message(mimemessage)
+            .fromMailet()
             .build());
     }
 
@@ -379,6 +390,7 @@ public class FakeMailContext implements MailetContext {
             .recipients(recipients)
             .sender(sender)
             .message(msg)
+            .fromMailet()
             .build());
     }
 
@@ -388,6 +400,7 @@ public class FakeMailContext implements MailetContext {
             .message(msg)
             .state(state)
             .sender(sender)
+            .fromMailet()
             .build());
     }
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/2aba6ef3/mailet/standard/src/main/java/org/apache/james/transport/matchers/SentByMailet.java
----------------------------------------------------------------------
diff --git 
a/mailet/standard/src/main/java/org/apache/james/transport/matchers/SentByMailet.java
 
b/mailet/standard/src/main/java/org/apache/james/transport/matchers/SentByMailet.java
new file mode 100644
index 0000000..0df6e96
--- /dev/null
+++ 
b/mailet/standard/src/main/java/org/apache/james/transport/matchers/SentByMailet.java
@@ -0,0 +1,41 @@
+/****************************************************************
+ * 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.transport.matchers;
+
+import java.util.Collection;
+
+import com.google.common.collect.ImmutableList;
+import org.apache.mailet.Mail;
+import org.apache.mailet.MailAddress;
+import org.apache.mailet.base.GenericMatcher;
+
+public class SentByMailet extends GenericMatcher {
+
+    public Collection<MailAddress> match(Mail mail) {
+        String authUser = (String) mail.getAttribute(Mail.SENT_BY_MAILET);
+        if (authUser != null) {
+            return mail.getRecipients();
+        } else {
+            return ImmutableList.of();
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/2aba6ef3/mailet/standard/src/test/java/org/apache/james/transport/mailets/UseHeaderRecipientsTest.java
----------------------------------------------------------------------
diff --git 
a/mailet/standard/src/test/java/org/apache/james/transport/mailets/UseHeaderRecipientsTest.java
 
b/mailet/standard/src/test/java/org/apache/james/transport/mailets/UseHeaderRecipientsTest.java
index 95d220a..cdcb968 100644
--- 
a/mailet/standard/src/test/java/org/apache/james/transport/mailets/UseHeaderRecipientsTest.java
+++ 
b/mailet/standard/src/test/java/org/apache/james/transport/mailets/UseHeaderRecipientsTest.java
@@ -135,6 +135,7 @@ public class UseHeaderRecipientsTest {
         assertThat(mailetContext.getSentMails())
             .containsOnly(FakeMailContext.sentMailBuilder()
                 .recipients(mailAddress1, mailAddress2, mailAddress3)
+                .fromMailet()
                 .build());
     }
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/2aba6ef3/mailet/standard/src/test/java/org/apache/james/transport/matchers/SentByMailetTest.java
----------------------------------------------------------------------
diff --git 
a/mailet/standard/src/test/java/org/apache/james/transport/matchers/SentByMailetTest.java
 
b/mailet/standard/src/test/java/org/apache/james/transport/matchers/SentByMailetTest.java
new file mode 100644
index 0000000..4f36a98
--- /dev/null
+++ 
b/mailet/standard/src/test/java/org/apache/james/transport/matchers/SentByMailetTest.java
@@ -0,0 +1,92 @@
+/****************************************************************
+ * 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.transport.matchers;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.util.Collection;
+
+import org.apache.mailet.Mail;
+import org.apache.mailet.MailAddress;
+import org.apache.mailet.base.test.FakeMail;
+import org.apache.mailet.base.test.FakeMailContext;
+import org.apache.mailet.base.test.FakeMatcherConfig;
+import org.junit.Before;
+import org.junit.Test;
+
+public class SentByMailetTest {
+
+    private SentByMailet testee;
+
+    @Before
+    public void setUp() throws Exception {
+        testee = new SentByMailet();
+        testee.init(FakeMatcherConfig.builder().matcherName("matcherName")
+            .mailetContext(FakeMailContext.defaultContext())
+            .build());
+    }
+
+    @Test
+    public void matchShouldReturnRecipientsWhenAuthUserAttributeIsPresent() 
throws Exception{
+        MailAddress recipient = new MailAddress("[email protected]");
+        FakeMail fakeMail = FakeMail.builder()
+            .recipient(recipient)
+            .attribute(Mail.SENT_BY_MAILET, "true")
+            .build();
+
+        Collection<MailAddress> results =  testee.match(fakeMail);
+
+        assertThat(results).containsOnly(recipient);
+    }
+
+    @Test
+    public void 
matchShouldReturnEmptyCollectionWhenAuthUserAttributeIsAbsent() throws 
Exception{
+        FakeMail fakeMail = FakeMail.builder()
+            .recipients(new MailAddress("[email protected]"))
+            .build();
+
+        Collection<MailAddress> results =  testee.match(fakeMail);
+
+        assertThat(results).isEmpty();
+    }
+
+    @Test
+    public void 
matchShouldReturnEmptyCollectionWhenAuthUserAttributeIsAbsentAndThereIsNoRecipient()
 throws Exception {
+        FakeMail fakeMail = FakeMail.builder()
+            .recipients()
+            .build();
+
+        Collection<MailAddress> results =  testee.match(fakeMail);
+
+        assertThat(results).isEmpty();
+    }
+
+    @Test
+    public void 
matchShouldReturnEmptyCollectionWhenAuthUserAttributeIsPresentAndThereIsNoRecipient()
 throws Exception {
+        FakeMail fakeMail = FakeMail.builder()
+            .recipients()
+            .attribute(Mail.SENT_BY_MAILET, "true")
+            .build();
+
+        Collection<MailAddress> results =  testee.match(fakeMail);
+
+        assertThat(results).isEmpty();
+    }
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/2aba6ef3/server/container/cli-integration/src/test/resources/mailetcontainer.xml
----------------------------------------------------------------------
diff --git 
a/server/container/cli-integration/src/test/resources/mailetcontainer.xml 
b/server/container/cli-integration/src/test/resources/mailetcontainer.xml
index 28bdcee..a842eee 100644
--- a/server/container/cli-integration/src/test/resources/mailetcontainer.xml
+++ b/server/container/cli-integration/src/test/resources/mailetcontainer.xml
@@ -60,7 +60,16 @@
                 <processor>local-address-error</processor>
                 <notice>550 - Requested action not taken: no such user 
here</notice>
             </mailet>
-            <mailet match="SMTPAuthSuccessful" class="RemoteDelivery">
+            <mailet match="SMTPAuthSuccessful" class="SetMailAttribute">
+                <RelayAllowed>true</RelayAllowed>
+            </mailet>
+            <mailet match="SentByMailet" class="SetMailAttribute">
+                <RelayAllowed>true</RelayAllowed>
+            </mailet>
+            <mailet match="org.apache.james.jmap.mailet.SentByJmap" 
class="SetMailAttribute">
+                <RelayAllowed>true</RelayAllowed>
+            </mailet>
+            <mailet match="HasMailAttribute=RelayAllowed" 
class="RemoteDelivery">
                 <outgoingQueue>outgoing</outgoingQueue>
                 <delayTime>5000, 100000, 500000</delayTime>
                 <maxRetries>25</maxRetries>

http://git-wip-us.apache.org/repos/asf/james-project/blob/2aba6ef3/server/container/guice/jpa-guice/src/test/resources/mailetcontainer.xml
----------------------------------------------------------------------
diff --git 
a/server/container/guice/jpa-guice/src/test/resources/mailetcontainer.xml 
b/server/container/guice/jpa-guice/src/test/resources/mailetcontainer.xml
index 426cab8..2f1ee37 100644
--- a/server/container/guice/jpa-guice/src/test/resources/mailetcontainer.xml
+++ b/server/container/guice/jpa-guice/src/test/resources/mailetcontainer.xml
@@ -60,7 +60,13 @@
                 <processor>local-address-error</processor>
                 <notice>550 - Requested action not taken: no such user 
here</notice>
             </mailet>
-            <mailet match="SMTPAuthSuccessful" class="RemoteDelivery">
+            <mailet match="SMTPAuthSuccessful" class="SetMailAttribute">
+                <RelayAllowed>true</RelayAllowed>
+            </mailet>
+            <mailet match="SentByMailet" class="SetMailAttribute">
+                <RelayAllowed>true</RelayAllowed>
+            </mailet>
+            <mailet match="HasMailAttribute=RelayAllowed" 
class="RemoteDelivery">
                 <outgoingQueue>outgoing</outgoingQueue>
                 <delayTime>5000, 100000, 500000</delayTime>
                 <maxRetries>25</maxRetries>

http://git-wip-us.apache.org/repos/asf/james-project/blob/2aba6ef3/server/container/guice/jpa-smtp/sample-configuration/mailetcontainer.xml
----------------------------------------------------------------------
diff --git 
a/server/container/guice/jpa-smtp/sample-configuration/mailetcontainer.xml 
b/server/container/guice/jpa-smtp/sample-configuration/mailetcontainer.xml
index 968b59c..909c5db 100644
--- a/server/container/guice/jpa-smtp/sample-configuration/mailetcontainer.xml
+++ b/server/container/guice/jpa-smtp/sample-configuration/mailetcontainer.xml
@@ -86,7 +86,13 @@
                 <processor>local-address-error</processor>
                 <notice>550 - Requested action not taken: no such user 
here</notice>
             </mailet>
-            <mailet match="SMTPAuthSuccessful" class="RemoteDelivery">
+            <mailet match="SMTPAuthSuccessful" class="SetMailAttribute">
+                <RelayAllowed>true</RelayAllowed>
+            </mailet>
+            <mailet match="SentByMailet" class="SetMailAttribute">
+                <RelayAllowed>true</RelayAllowed>
+            </mailet>
+            <mailet match="HasMailAttribute=RelayAllowed" 
class="RemoteDelivery">
                 <outgoingQueue>outgoing</outgoingQueue>
                 <delayTime>5000, 100000, 500000</delayTime>
                 <maxRetries>25</maxRetries>

http://git-wip-us.apache.org/repos/asf/james-project/blob/2aba6ef3/server/container/guice/memory-guice/sample-configuration/mailetcontainer.xml
----------------------------------------------------------------------
diff --git 
a/server/container/guice/memory-guice/sample-configuration/mailetcontainer.xml 
b/server/container/guice/memory-guice/sample-configuration/mailetcontainer.xml
index 1a4343f..40509a8 100644
--- 
a/server/container/guice/memory-guice/sample-configuration/mailetcontainer.xml
+++ 
b/server/container/guice/memory-guice/sample-configuration/mailetcontainer.xml
@@ -50,6 +50,9 @@
                 <name>X-UserIsAuth</name>
                 <value>true</value>
             </mailet>
+            <mailet match="org.apache.james.jmap.mailet.SentByJmap" 
class="SetMailAttribute">
+                <RelayAllowed>true</RelayAllowed>
+            </mailet>
             <mailet 
match="HasMailAttribute=org.apache.james.SMIMECheckSignature" 
class="SetMimeHeader">
                 <name>X-WasSigned</name>
                 <value>true</value>
@@ -61,7 +64,14 @@
             <mailet match="RecipientIsLocal" 
class="org.apache.james.jmap.mailet.VacationMailet"/>
             <mailet match="RecipientIsLocal" class="Sieve"/>
             <mailet match="RecipientIsLocal" class="LocalDelivery"/>
-            <mailet match="SMTPAuthSuccessful" class="RemoteDelivery">
+
+            <mailet match="SMTPAuthSuccessful" class="SetMailAttribute">
+                <RelayAllowed>true</RelayAllowed>
+            </mailet>
+            <mailet match="SentByMailet" class="SetMailAttribute">
+                <RelayAllowed>true</RelayAllowed>
+            </mailet>
+            <mailet match="HasMailAttribute=RelayAllowed" 
class="RemoteDelivery">
                 <outgoingQueue>outgoing</outgoingQueue>
                 <delayTime>5000, 100000, 500000</delayTime>
                 <maxRetries>25</maxRetries>

http://git-wip-us.apache.org/repos/asf/james-project/blob/2aba6ef3/server/container/guice/memory-guice/src/test/resources/mailetcontainer.xml
----------------------------------------------------------------------
diff --git 
a/server/container/guice/memory-guice/src/test/resources/mailetcontainer.xml 
b/server/container/guice/memory-guice/src/test/resources/mailetcontainer.xml
index b265f93..04ffa3e 100644
--- a/server/container/guice/memory-guice/src/test/resources/mailetcontainer.xml
+++ b/server/container/guice/memory-guice/src/test/resources/mailetcontainer.xml
@@ -61,7 +61,16 @@
                 <processor>local-address-error</processor>
                 <notice>550 - Requested action not taken: no such user 
here</notice>
             </mailet>
-            <mailet match="SMTPAuthSuccessful" class="RemoteDelivery">
+            <mailet match="SMTPAuthSuccessful" class="SetMailAttribute">
+                <RelayAllowed>true</RelayAllowed>
+            </mailet>
+            <mailet match="SentByMailet" class="SetMailAttribute">
+                <RelayAllowed>true</RelayAllowed>
+            </mailet>
+            <mailet match="org.apache.james.jmap.mailet.SentByJmap" 
class="SetMailAttribute">
+                <RelayAllowed>true</RelayAllowed>
+            </mailet>
+            <mailet match="HasMailAttribute=RelayAllowed" 
class="RemoteDelivery">
                 <outgoingQueue>outgoing</outgoingQueue>
                 <delayTime>5000, 100000, 500000</delayTime>
                 <maxRetries>25</maxRetries>

http://git-wip-us.apache.org/repos/asf/james-project/blob/2aba6ef3/server/container/guice/protocols/jmap/src/main/resources/defaultJmapMailetContainer.xml
----------------------------------------------------------------------
diff --git 
a/server/container/guice/protocols/jmap/src/main/resources/defaultJmapMailetContainer.xml
 
b/server/container/guice/protocols/jmap/src/main/resources/defaultJmapMailetContainer.xml
index 81386a4..ccf6017 100644
--- 
a/server/container/guice/protocols/jmap/src/main/resources/defaultJmapMailetContainer.xml
+++ 
b/server/container/guice/protocols/jmap/src/main/resources/defaultJmapMailetContainer.xml
@@ -50,7 +50,10 @@
         <mailet match="SMTPAuthSuccessful" class="ToProcessor">
             <processor>relay</processor>
         </mailet>
-        <mailet 
match="HasMailAttribute=org.apache.james.jmap.send.MailMetaData.messageId" 
class="ToProcessor">
+        <mailet match="org.apache.james.jmap.mailet.SentByJmap" 
class="ToProcessor">
+            <processor>relay</processor>
+        </mailet>
+        <mailet match="SentByMailet" class="ToProcessor">
             <processor>relay</processor>
         </mailet>
         <mailet match="All" class="ToProcessor">

http://git-wip-us.apache.org/repos/asf/james-project/blob/2aba6ef3/server/mailet/mailetcontainer-camel/src/main/java/org/apache/james/mailetcontainer/impl/JamesMailetContext.java
----------------------------------------------------------------------
diff --git 
a/server/mailet/mailetcontainer-camel/src/main/java/org/apache/james/mailetcontainer/impl/JamesMailetContext.java
 
b/server/mailet/mailetcontainer-camel/src/main/java/org/apache/james/mailetcontainer/impl/JamesMailetContext.java
index fca950a..4274727 100644
--- 
a/server/mailet/mailetcontainer-camel/src/main/java/org/apache/james/mailetcontainer/impl/JamesMailetContext.java
+++ 
b/server/mailet/mailetcontainer-camel/src/main/java/org/apache/james/mailetcontainer/impl/JamesMailetContext.java
@@ -400,6 +400,7 @@ public class JamesMailetContext implements MailetContext, 
LogEnabled, Configurab
 
     @Override
     public void sendMail(Mail mail) throws MessagingException {
+        mail.setAttribute(Mail.SENT_BY_MAILET, "true");
         rootMailQueue.enQueue(mail);
     }
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/2aba6ef3/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/BounceTest.java
----------------------------------------------------------------------
diff --git 
a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/BounceTest.java
 
b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/BounceTest.java
index 4ff3ca9..e5b3e97 100644
--- 
a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/BounceTest.java
+++ 
b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/BounceTest.java
@@ -122,6 +122,7 @@ public class BounceTest {
 
         FakeMailContext.SentMail expected = FakeMailContext.sentMailBuilder()
             .recipient(senderMailAddress)
+            .fromMailet()
             .build();
         assertThat(fakeMailContext.getSentMails()).containsOnly(expected);
     }

http://git-wip-us.apache.org/repos/asf/james-project/blob/2aba6ef3/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/RecipientRewriteTableProcessorTest.java
----------------------------------------------------------------------
diff --git 
a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/RecipientRewriteTableProcessorTest.java
 
b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/RecipientRewriteTableProcessorTest.java
index 09cd5ef..4e31a6f 100644
--- 
a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/RecipientRewriteTableProcessorTest.java
+++ 
b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/RecipientRewriteTableProcessorTest.java
@@ -164,6 +164,7 @@ public class RecipientRewriteTableProcessorTest {
         FakeMailContext.SentMail expected = FakeMailContext.sentMailBuilder()
                 .sender(MailAddressFixture.ANY_AT_JAMES)
                 .recipients(ImmutableList.of(MailAddressFixture.ANY_AT_JAMES, 
MailAddressFixture.OTHER_AT_JAMES))
+                .fromMailet()
                 .message(message)
                 .build();
 
@@ -213,6 +214,7 @@ public class RecipientRewriteTableProcessorTest {
         FakeMailContext.SentMail expected = FakeMailContext.sentMailBuilder()
                 .sender(MailAddressFixture.ANY_AT_JAMES)
                 .recipients(ImmutableList.of(MailAddressFixture.ANY_AT_JAMES, 
MailAddressFixture.OTHER_AT_JAMES))
+                .fromMailet()
                 .message(message)
                 .build();
 
@@ -251,6 +253,7 @@ public class RecipientRewriteTableProcessorTest {
                 .sender(MailAddressFixture.ANY_AT_JAMES)
                 .recipient(MailAddressFixture.OTHER_AT_LOCAL)
                 .message(message)
+                .fromMailet()
                 .state(Mail.ERROR)
                 .build();
 
@@ -276,6 +279,7 @@ public class RecipientRewriteTableProcessorTest {
                 .recipient(MailAddressFixture.OTHER_AT_LOCAL)
                 .message(message)
                 .state(Mail.ERROR)
+                .fromMailet()
                 .build();
 
         assertThat(mailetContext.getSentMails()).containsOnly(expected);
@@ -299,6 +303,7 @@ public class RecipientRewriteTableProcessorTest {
                 .sender(MailAddressFixture.ANY_AT_JAMES)
                 .recipient(MailAddressFixture.OTHER_AT_LOCAL)
                 .message(message)
+                .fromMailet()
                 .state(Mail.ERROR)
                 .build();
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/2aba6ef3/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/MailDispatcherTest.java
----------------------------------------------------------------------
diff --git 
a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/MailDispatcherTest.java
 
b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/MailDispatcherTest.java
index 2e2c14c..d08e00c 100644
--- 
a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/MailDispatcherTest.java
+++ 
b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/MailDispatcherTest.java
@@ -153,6 +153,7 @@ public class MailDispatcherTest {
         FakeMailContext.SentMail expected = FakeMailContext.sentMailBuilder()
             .sender(MailAddressFixture.OTHER_AT_JAMES)
             .recipient(MailAddressFixture.ANY_AT_JAMES)
+            .fromMailet()
             .state(Mail.ERROR).build();
         assertThat(actual).containsOnly(expected);
         assertThat(IOUtils.toString(actual.get(0).getMsg().getInputStream(), 
Charsets.UTF_8))

http://git-wip-us.apache.org/repos/asf/james-project/blob/2aba6ef3/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/SieveIntegrationTest.java
----------------------------------------------------------------------
diff --git 
a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/SieveIntegrationTest.java
 
b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/SieveIntegrationTest.java
index e3bdddf..04a4b6c 100644
--- 
a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/SieveIntegrationTest.java
+++ 
b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/SieveIntegrationTest.java
@@ -411,6 +411,7 @@ public class SieveIntegrationTest {
         FakeMailContext.SentMail expectedSentMail = 
FakeMailContext.sentMailBuilder()
             .sender(new MailAddress("[email protected]"))
             .recipient(new MailAddress("[email protected]"))
+            .fromMailet()
             .build();
         assertThat(fakeMailContext.getSentMails())
             .containsExactly(expectedSentMail);
@@ -777,6 +778,7 @@ public class SieveIntegrationTest {
         
assertThat(fakeMailContext.getSentMails()).containsExactly(FakeMailContext.sentMailBuilder()
             .recipient(new MailAddress(RECEIVER_DOMAIN_COM))
             .sender(new MailAddress(RECEIVER_DOMAIN_COM))
+            .fromMailet()
             .build());
         // No action taken
         assertThat(mail.getAttribute(MailStore.DELIVERY_PATH_PREFIX + 
LOCAL_PART)).isNull();
@@ -794,6 +796,7 @@ public class SieveIntegrationTest {
         FakeMailContext.SentMail expectedSentMail = 
FakeMailContext.sentMailBuilder()
             .sender(new MailAddress(RECEIVER_DOMAIN_COM))
             .recipient(new MailAddress("[email protected]"))
+            .fromMailet()
             .build();
         
assertThat(fakeMailContext.getSentMails()).containsExactly(expectedSentMail);
     }
@@ -854,6 +857,7 @@ public class SieveIntegrationTest {
         FakeMailContext.SentMail expectedSentMail = 
FakeMailContext.sentMailBuilder()
             .sender(new MailAddress(RECEIVER_DOMAIN_COM))
             .recipient(new MailAddress("[email protected]"))
+            .fromMailet()
             .build();
         
assertThat(fakeMailContext.getSentMails()).containsExactly(expectedSentMail);
     }
@@ -869,6 +873,7 @@ public class SieveIntegrationTest {
         FakeMailContext.SentMail expectedSentMail = 
FakeMailContext.sentMailBuilder()
             .sender(new MailAddress(RECEIVER_DOMAIN_COM))
             .recipient(new MailAddress("[email protected]"))
+            .fromMailet()
             .build();
         
assertThat(fakeMailContext.getSentMails()).containsExactly(expectedSentMail);
     }
@@ -884,6 +889,7 @@ public class SieveIntegrationTest {
         FakeMailContext.SentMail expectedSentMail = 
FakeMailContext.sentMailBuilder()
             .sender(new MailAddress("[email protected]"))
             .recipient(new MailAddress("[email protected]"))
+            .fromMailet()
             .build();
         
assertThat(fakeMailContext.getSentMails()).containsExactly(expectedSentMail);
     }
@@ -899,6 +905,7 @@ public class SieveIntegrationTest {
         FakeMailContext.SentMail expectedSentMail = 
FakeMailContext.sentMailBuilder()
             .sender(new MailAddress(RECEIVER_DOMAIN_COM))
             .recipient(new MailAddress("[email protected]"))
+            .fromMailet()
             .build();
         
assertThat(fakeMailContext.getSentMails()).containsExactly(expectedSentMail);
     }

http://git-wip-us.apache.org/repos/asf/james-project/blob/2aba6ef3/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/managesieve/ManageSieveMailetTestCase.java
----------------------------------------------------------------------
diff --git 
a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/managesieve/ManageSieveMailetTestCase.java
 
b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/managesieve/ManageSieveMailetTestCase.java
index c229052..1f743ba 100644
--- 
a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/managesieve/ManageSieveMailetTestCase.java
+++ 
b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/managesieve/ManageSieveMailetTestCase.java
@@ -533,6 +533,7 @@ public class ManageSieveMailetTestCase {
         FakeMailContext.SentMail sentMail = FakeMailContext.sentMailBuilder()
             .recipient(new MailAddress(USER))
             .sender(new MailAddress(SIEVE_LOCALHOST))
+            .fromMailet()
             .build();
         assertThat(fakeMailContext.getSentMails()).containsOnly(sentMail);
         MimeMessage result = fakeMailContext.getSentMails().get(0).getMsg();

http://git-wip-us.apache.org/repos/asf/james-project/blob/2aba6ef3/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/remoteDelivery/BouncerTest.java
----------------------------------------------------------------------
diff --git 
a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/remoteDelivery/BouncerTest.java
 
b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/remoteDelivery/BouncerTest.java
index cc600ad..f687643 100644
--- 
a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/remoteDelivery/BouncerTest.java
+++ 
b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/remoteDelivery/BouncerTest.java
@@ -349,6 +349,7 @@ public class BouncerTest {
             .sender(MailAddressFixture.ANY_AT_JAMES)
             .attribute(DELIVERY_ERROR, errorMessage)
             .state(BOUNCE_PROCESSOR)
+            .fromMailet()
             .build();
         assertThat(mailetContext.getSentMails()).containsOnly(expected);
         assertThat(mailetContext.getBouncedMails()).isEmpty();
@@ -450,6 +451,7 @@ public class BouncerTest {
             .sender(MailAddressFixture.ANY_AT_JAMES)
             .attribute(DELIVERY_ERROR, "null")
             .state(BOUNCE_PROCESSOR)
+            .fromMailet()
             .build();
         assertThat(mailetContext.getSentMails()).containsOnly(expected);
         assertThat(mailetContext.getBouncedMails()).isEmpty();

http://git-wip-us.apache.org/repos/asf/james-project/blob/2aba6ef3/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraVacationRelayIntegrationTest.java
----------------------------------------------------------------------
diff --git 
a/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraVacationRelayIntegrationTest.java
 
b/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraVacationRelayIntegrationTest.java
index 6559c72..e5555f8 100644
--- 
a/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraVacationRelayIntegrationTest.java
+++ 
b/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraVacationRelayIntegrationTest.java
@@ -24,10 +24,8 @@ import org.apache.james.GuiceJamesServer;
 import org.apache.james.dnsservice.api.DNSService;
 import org.apache.james.dnsservice.api.InMemoryDNSService;
 import org.apache.james.jmap.VacationRelayIntegrationTest;
-import org.junit.Ignore;
 import org.junit.Rule;
 
-@Ignore
 public class CassandraVacationRelayIntegrationTest extends 
VacationRelayIntegrationTest {
 
     private final InMemoryDNSService inMemoryDNSService = new 
InMemoryDNSService();

http://git-wip-us.apache.org/repos/asf/james-project/blob/2aba6ef3/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/resources/mailetcontainer.xml
----------------------------------------------------------------------
diff --git 
a/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/resources/mailetcontainer.xml
 
b/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/resources/mailetcontainer.xml
index 6a76330..f26cd89 100644
--- 
a/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/resources/mailetcontainer.xml
+++ 
b/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/resources/mailetcontainer.xml
@@ -57,7 +57,16 @@
                 <processor>local-address-error</processor>
                 <notice>550 - Requested action not taken: no such user 
here</notice>
             </mailet>
-            <mailet match="SMTPAuthSuccessful" class="RemoteDelivery">
+            <mailet match="SMTPAuthSuccessful" class="SetMailAttribute">
+                <RelayAllowed>true</RelayAllowed>
+            </mailet>
+            <mailet match="SentByMailet" class="SetMailAttribute">
+                <RelayAllowed>true</RelayAllowed>
+            </mailet>
+            <mailet match="org.apache.james.jmap.mailet.SentByJmap" 
class="SetMailAttribute">
+                <RelayAllowed>true</RelayAllowed>
+            </mailet>
+            <mailet match="HasMailAttribute=RelayAllowed" 
class="RemoteDelivery">
                 <outgoingQueue>outgoing</outgoingQueue>
                 <delayTime>5000, 100000, 500000</delayTime>
                 <maxRetries>25</maxRetries>

http://git-wip-us.apache.org/repos/asf/james-project/blob/2aba6ef3/server/protocols/jmap-integration-testing/memory-jmap-integration-testing/src/test/java/org/apache/james/jmap/memory/MemoryVacationRelayIntegrationTest.java
----------------------------------------------------------------------
diff --git 
a/server/protocols/jmap-integration-testing/memory-jmap-integration-testing/src/test/java/org/apache/james/jmap/memory/MemoryVacationRelayIntegrationTest.java
 
b/server/protocols/jmap-integration-testing/memory-jmap-integration-testing/src/test/java/org/apache/james/jmap/memory/MemoryVacationRelayIntegrationTest.java
index 9eea53a..9095c4d 100644
--- 
a/server/protocols/jmap-integration-testing/memory-jmap-integration-testing/src/test/java/org/apache/james/jmap/memory/MemoryVacationRelayIntegrationTest.java
+++ 
b/server/protocols/jmap-integration-testing/memory-jmap-integration-testing/src/test/java/org/apache/james/jmap/memory/MemoryVacationRelayIntegrationTest.java
@@ -24,10 +24,8 @@ import org.apache.james.MemoryJmapTestRule;
 import org.apache.james.dnsservice.api.DNSService;
 import org.apache.james.dnsservice.api.InMemoryDNSService;
 import org.apache.james.jmap.VacationRelayIntegrationTest;
-import org.junit.Ignore;
 import org.junit.Rule;
 
-@Ignore
 public class MemoryVacationRelayIntegrationTest extends 
VacationRelayIntegrationTest {
 
     @Rule

http://git-wip-us.apache.org/repos/asf/james-project/blob/2aba6ef3/server/protocols/jmap-integration-testing/memory-jmap-integration-testing/src/test/resources/mailetcontainer.xml
----------------------------------------------------------------------
diff --git 
a/server/protocols/jmap-integration-testing/memory-jmap-integration-testing/src/test/resources/mailetcontainer.xml
 
b/server/protocols/jmap-integration-testing/memory-jmap-integration-testing/src/test/resources/mailetcontainer.xml
index 6a76330..8e66ed5 100644
--- 
a/server/protocols/jmap-integration-testing/memory-jmap-integration-testing/src/test/resources/mailetcontainer.xml
+++ 
b/server/protocols/jmap-integration-testing/memory-jmap-integration-testing/src/test/resources/mailetcontainer.xml
@@ -57,7 +57,13 @@
                 <processor>local-address-error</processor>
                 <notice>550 - Requested action not taken: no such user 
here</notice>
             </mailet>
-            <mailet match="SMTPAuthSuccessful" class="RemoteDelivery">
+            <mailet match="SMTPAuthSuccessful" class="SetMailAttribute">
+                <RelayAllowed>true</RelayAllowed>
+            </mailet>
+            <mailet match="SentByMailet" class="SetMailAttribute">
+                <RelayAllowed>true</RelayAllowed>
+            </mailet>
+            <mailet match="HasMailAttribute=RelayAllowed" 
class="RemoteDelivery">
                 <outgoingQueue>outgoing</outgoingQueue>
                 <delayTime>5000, 100000, 500000</delayTime>
                 <maxRetries>25</maxRetries>

http://git-wip-us.apache.org/repos/asf/james-project/blob/2aba6ef3/server/protocols/jmap/src/main/java/org/apache/james/jmap/mailet/SentByJmap.java
----------------------------------------------------------------------
diff --git 
a/server/protocols/jmap/src/main/java/org/apache/james/jmap/mailet/SentByJmap.java
 
b/server/protocols/jmap/src/main/java/org/apache/james/jmap/mailet/SentByJmap.java
new file mode 100644
index 0000000..68bcb55
--- /dev/null
+++ 
b/server/protocols/jmap/src/main/java/org/apache/james/jmap/mailet/SentByJmap.java
@@ -0,0 +1,42 @@
+/****************************************************************
+ * 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.jmap.mailet;
+
+import java.util.Collection;
+
+import org.apache.james.jmap.send.MailMetadata;
+import org.apache.mailet.Mail;
+import org.apache.mailet.MailAddress;
+import org.apache.mailet.base.GenericMatcher;
+
+import com.google.common.collect.ImmutableList;
+
+public class SentByJmap extends GenericMatcher {
+    public Collection<MailAddress> match(Mail mail) {
+        String authUser = (String) 
mail.getAttribute(MailMetadata.MAIL_METADATA_USERNAME_ATTRIBUTE);
+        if (authUser != null) {
+            return mail.getRecipients();
+        } else {
+            return ImmutableList.of();
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/2aba6ef3/server/protocols/jmap/src/test/java/org/apache/james/jmap/mailet/SentByJmapTest.java
----------------------------------------------------------------------
diff --git 
a/server/protocols/jmap/src/test/java/org/apache/james/jmap/mailet/SentByJmapTest.java
 
b/server/protocols/jmap/src/test/java/org/apache/james/jmap/mailet/SentByJmapTest.java
new file mode 100644
index 0000000..876695d
--- /dev/null
+++ 
b/server/protocols/jmap/src/test/java/org/apache/james/jmap/mailet/SentByJmapTest.java
@@ -0,0 +1,94 @@
+/****************************************************************
+ * 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.jmap.mailet;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.util.Collection;
+
+import org.apache.james.jmap.send.MailMetadata;
+import org.apache.mailet.Mail;
+import org.apache.mailet.MailAddress;
+import org.apache.mailet.base.MailAddressFixture;
+import org.apache.mailet.base.test.FakeMail;
+import org.apache.mailet.base.test.FakeMailContext;
+import org.apache.mailet.base.test.FakeMatcherConfig;
+import org.junit.Before;
+import org.junit.Test;
+
+public class SentByJmapTest {
+
+    private SentByJmap testee;
+
+    @Before
+    public void setUp() throws Exception {
+        testee = new SentByJmap();
+        testee.init(FakeMatcherConfig.builder().matcherName("matcherName")
+            .mailetContext(FakeMailContext.defaultContext())
+            .build());
+    }
+
+    @Test
+    public void matchShouldReturnRecipientsWhenUserAttributeIsPresent() throws 
Exception{
+        MailAddress recipient = MailAddressFixture.ANY_AT_JAMES;
+        FakeMail fakeMail = FakeMail.builder()
+            .recipient(recipient)
+            .attribute(MailMetadata.MAIL_METADATA_USERNAME_ATTRIBUTE, "true")
+            .build();
+
+        Collection<MailAddress> results =  testee.match(fakeMail);
+
+        assertThat(results).containsOnly(recipient);
+    }
+
+    @Test
+    public void matchShouldReturnEmptyCollectionWhenUserAttributeIsAbsent() 
throws Exception{
+        FakeMail fakeMail = FakeMail.builder()
+            .recipients(MailAddressFixture.ANY_AT_JAMES)
+            .build();
+
+        Collection<MailAddress> results =  testee.match(fakeMail);
+
+        assertThat(results).isEmpty();
+    }
+
+    @Test
+    public void 
matchShouldReturnEmptyCollectionWhenUserAttributeIsAbsentAndThereIsNoRecipient()
 throws Exception {
+        FakeMail fakeMail = FakeMail.builder()
+            .recipients()
+            .build();
+
+        Collection<MailAddress> results =  testee.match(fakeMail);
+
+        assertThat(results).isEmpty();
+    }
+
+    @Test
+    public void 
matchShouldReturnEmptyCollectionWhenUserAttributeIsPresentAndThereIsNoRecipient()
 throws Exception {
+        FakeMail fakeMail = FakeMail.builder()
+            .recipients()
+            .attribute(MailMetadata.MAIL_METADATA_USERNAME_ATTRIBUTE, "true")
+            .build();
+
+        Collection<MailAddress> results =  testee.match(fakeMail);
+
+        assertThat(results).isEmpty();
+    }
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/2aba6ef3/server/protocols/webadmin-integration-test/src/test/resources/mailetcontainer.xml
----------------------------------------------------------------------
diff --git 
a/server/protocols/webadmin-integration-test/src/test/resources/mailetcontainer.xml
 
b/server/protocols/webadmin-integration-test/src/test/resources/mailetcontainer.xml
index f1ea4af..cf90f14 100644
--- 
a/server/protocols/webadmin-integration-test/src/test/resources/mailetcontainer.xml
+++ 
b/server/protocols/webadmin-integration-test/src/test/resources/mailetcontainer.xml
@@ -62,7 +62,13 @@
                 <processor>local-address-error</processor>
                 <notice>550 - Requested action not taken: no such user 
here</notice>
             </mailet>
-            <mailet match="SMTPAuthSuccessful" class="RemoteDelivery">
+            <mailet match="SMTPAuthSuccessful" class="SetMailAttribute">
+                <RelayAllowed>true</RelayAllowed>
+            </mailet>
+            <mailet match="SentByMailet" class="SetMailAttribute">
+                <RelayAllowed>true</RelayAllowed>
+            </mailet>
+            <mailet match="HasMailAttribute=RelayAllowed" 
class="RemoteDelivery">
                 <outgoingQueue>outgoing</outgoingQueue>
                 <delayTime>5000, 100000, 500000</delayTime>
                 <maxRetries>25</maxRetries>


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to