JAMES-2366 Fix error handling in SMTPMessageSender

We need step by step checks with an error fully describing what happened.

Also, sending a mail with this tool is synchronous. Our code should reflect 
this.


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

Branch: refs/heads/master
Commit: cf91dd4cbc2f21f4721ad995fc257df81c5880e6
Parents: 696929b
Author: benwa <btell...@linagora.com>
Authored: Thu Apr 19 10:56:05 2018 +0700
Committer: benwa <btell...@linagora.com>
Committed: Fri Apr 20 09:12:02 2018 +0700

----------------------------------------------------------------------
 .../CassandraMailRepositoryIntegrationTest.java |   3 +-
 .../org/apache/james/JPAJamesServerTest.java    |   3 +-
 .../james/mailets/AddDeliveredToHeaderTest.java |   3 +-
 .../mailets/CommonMailetConfigurationTest.java  |   3 +-
 .../mailets/NetworkMatcherIntegrationTest.java  |  24 ++---
 .../RecipientRewriteTableIntegrationTest.java   |  24 ++---
 .../org/apache/james/mailets/SieveDelivery.java |   3 +-
 .../james/mailets/SmtpAuthIntegrationTest.java  |   6 +-
 .../crypto/SMIMEDecryptIntegrationTest.java     |   9 +-
 .../crypto/SMIMESignIntegrationTest.java        |   6 +-
 .../james/smtp/SmtpAuthorizedAddressesTest.java |  21 ++--
 .../james/smtp/SmtpBracketEnforcementTest.java  |  22 ++--
 .../smtp/SmtpIdentityVerificationTest.java      |  19 ++--
 .../apache/james/smtp/SmtpNullSenderTest.java   |   6 +-
 .../james/smtp/SmtpSizeLimitationTest.java      |  16 +--
 .../james/transport/mailets/AddFooterTest.java  |   6 +-
 .../mailets/AmqpForwardAttachmentTest.java      |   3 +-
 .../transport/mailets/ContactExtractorTest.java |   3 +-
 .../transport/mailets/GroupMappingTest.java     |  61 +++++------
 .../mailets/ICSAttachmentWorkflowTest.java      |  30 ++----
 .../mailets/IsOverQuotaMatcherTest.java         |  18 ++--
 .../transport/mailets/SpamAssassinTest.java     |  12 +--
 .../transport/mailets/StripAttachmentTest.java  |   3 +-
 .../transport/mailets/ToRepositoryTest.java     |  12 +--
 .../integration/SetMessagesMethodTest.java      |   2 -
 .../apache/james/utils/SMTPMessageSender.java   | 108 ++++++++-----------
 .../james/utils/SMTPSendingException.java       |  73 +++++++++++++
 .../org/apache/james/utils/SmtpSendingStep.java |  28 +++++
 28 files changed, 272 insertions(+), 255 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/cf91dd4c/server/container/guice/cassandra-guice/src/test/java/org/apache/james/CassandraMailRepositoryIntegrationTest.java
----------------------------------------------------------------------
diff --git 
a/server/container/guice/cassandra-guice/src/test/java/org/apache/james/CassandraMailRepositoryIntegrationTest.java
 
b/server/container/guice/cassandra-guice/src/test/java/org/apache/james/CassandraMailRepositoryIntegrationTest.java
index 81972d1..3d5db0c 100644
--- 
a/server/container/guice/cassandra-guice/src/test/java/org/apache/james/CassandraMailRepositoryIntegrationTest.java
+++ 
b/server/container/guice/cassandra-guice/src/test/java/org/apache/james/CassandraMailRepositoryIntegrationTest.java
@@ -69,8 +69,7 @@ public class CassandraMailRepositoryIntegrationTest {
         server.getProbe(DataProbeImpl.class).addUser("u...@domain.com", 
"secret");
 
         smtpMessageSender.connect("127.0.0.1", 1025)
-            .sendMessage("den...@other.com", "u...@domain.com")
-            .awaitSent(await);
+            .sendMessage("den...@other.com", "u...@domain.com");
 
         MailRepositoryProbeImpl repositoryProbe = 
server.getProbe(MailRepositoryProbeImpl.class);
         await.until(() -> 
repositoryProbe.getRepositoryMailCount("cassandra://var/mail/sender-denied/") 
== 1);

http://git-wip-us.apache.org/repos/asf/james-project/blob/cf91dd4c/server/container/guice/jpa-guice/src/test/java/org/apache/james/JPAJamesServerTest.java
----------------------------------------------------------------------
diff --git 
a/server/container/guice/jpa-guice/src/test/java/org/apache/james/JPAJamesServerTest.java
 
b/server/container/guice/jpa-guice/src/test/java/org/apache/james/JPAJamesServerTest.java
index 91d1d49..ee2144f 100644
--- 
a/server/container/guice/jpa-guice/src/test/java/org/apache/james/JPAJamesServerTest.java
+++ 
b/server/container/guice/jpa-guice/src/test/java/org/apache/james/JPAJamesServerTest.java
@@ -78,8 +78,7 @@ public class JPAJamesServerTest extends 
AbstractJamesServerTest {
 
         // ~ 12 KB email
         smtpMessageSender.connect(LOCALHOST, SMTP_PORT)
-            .sendMessageWithHeaders(USER, USER, "header: toto\\r\\n\\r\\n" + 
Strings.repeat("0123456789\n", 1024))
-            .awaitSent(AWAIT);
+            .sendMessageWithHeaders(USER, USER, "header: toto\\r\\n\\r\\n" + 
Strings.repeat("0123456789\n", 1024));
         AWAIT.until(() -> imapMessageReader.connect(LOCALHOST, IMAP_PORT)
             .login(USER, PASSWORD)
             .select(IMAPMessageReader.INBOX)

http://git-wip-us.apache.org/repos/asf/james-project/blob/cf91dd4c/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/AddDeliveredToHeaderTest.java
----------------------------------------------------------------------
diff --git 
a/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/AddDeliveredToHeaderTest.java
 
b/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/AddDeliveredToHeaderTest.java
index f173489..469f0f0 100644
--- 
a/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/AddDeliveredToHeaderTest.java
+++ 
b/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/AddDeliveredToHeaderTest.java
@@ -67,8 +67,7 @@ public class AddDeliveredToHeaderTest {
     @Test
     public void receivedMessagesShouldContainDeliveredToHeaders() throws 
Exception {
         messageSender.connect(LOCALHOST_IP, SMTP_PORT)
-            .sendMessage(FROM, RECIPIENT)
-            .awaitSent(awaitAtMostOneMinute);
+            .sendMessage(FROM, RECIPIENT);
 
         imapMessageReader.connect(LOCALHOST_IP, IMAP_PORT)
             .login(RECIPIENT, PASSWORD)

http://git-wip-us.apache.org/repos/asf/james-project/blob/cf91dd4c/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/CommonMailetConfigurationTest.java
----------------------------------------------------------------------
diff --git 
a/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/CommonMailetConfigurationTest.java
 
b/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/CommonMailetConfigurationTest.java
index d45f29c..0861fdb 100644
--- 
a/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/CommonMailetConfigurationTest.java
+++ 
b/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/CommonMailetConfigurationTest.java
@@ -69,8 +69,7 @@ public class CommonMailetConfigurationTest {
     @Test
     public void simpleMailShouldBeSent() throws Exception {
         messageSender.connect(LOCALHOST_IP, SMTP_PORT)
-            .sendMessage(FROM, RECIPIENT)
-            .awaitSent(awaitAtMostOneMinute);
+            .sendMessage(FROM, RECIPIENT);
 
         imapMessageReader.connect(LOCALHOST_IP, IMAP_PORT)
             .login(RECIPIENT, PASSWORD)

http://git-wip-us.apache.org/repos/asf/james-project/blob/cf91dd4c/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/NetworkMatcherIntegrationTest.java
----------------------------------------------------------------------
diff --git 
a/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/NetworkMatcherIntegrationTest.java
 
b/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/NetworkMatcherIntegrationTest.java
index e844d54..7fcc013 100644
--- 
a/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/NetworkMatcherIntegrationTest.java
+++ 
b/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/NetworkMatcherIntegrationTest.java
@@ -97,8 +97,7 @@ public class NetworkMatcherIntegrationTest {
 
         messageSender.connect(LOCALHOST_IP, SMTP_PORT)
             .authenticate(FROM, PASSWORD)
-            .sendMessage(FROM, FROM)
-            .awaitSent(awaitAtMostOneMinute);
+            .sendMessage(FROM, FROM);
 
         imapMessageReader.connect(LOCALHOST_IP, IMAP_PORT)
             .login(FROM, PASSWORD)
@@ -118,8 +117,7 @@ public class NetworkMatcherIntegrationTest {
 
         messageSender.connect(LOCALHOST_IP, SMTP_PORT)
             .authenticate(FROM, PASSWORD)
-            .sendMessage(FROM, FROM)
-            .awaitSent(awaitAtMostOneMinute);
+            .sendMessage(FROM, FROM);
 
         imapMessageReader.connect(LOCALHOST_IP, IMAP_PORT)
             .login(FROM, PASSWORD)
@@ -139,8 +137,7 @@ public class NetworkMatcherIntegrationTest {
 
         messageSender.connect(LOCALHOST_IP, SMTP_PORT)
             .authenticate(FROM, PASSWORD)
-            .sendMessage(FROM, FROM)
-            .awaitSent(awaitAtMostOneMinute);
+            .sendMessage(FROM, FROM);
 
         imapMessageReader.connect(LOCALHOST_IP, IMAP_PORT)
             .login(FROM, PASSWORD)
@@ -160,8 +157,7 @@ public class NetworkMatcherIntegrationTest {
 
         messageSender.connect(LOCALHOST_IP, SMTP_PORT)
             .authenticate(FROM, PASSWORD)
-            .sendMessage(FROM, FROM)
-            .awaitSent(awaitAtMostOneMinute);
+            .sendMessage(FROM, FROM);
 
         imapMessageReader.connect(LOCALHOST_IP, IMAP_PORT)
             .login(FROM, PASSWORD)
@@ -181,8 +177,7 @@ public class NetworkMatcherIntegrationTest {
 
         messageSender.connect(LOCALHOST_IP, SMTP_PORT)
             .authenticate(FROM, PASSWORD)
-            .sendMessage(FROM, FROM)
-            .awaitSent(awaitAtMostOneMinute);
+            .sendMessage(FROM, FROM);
 
         imapMessageReader.connect(LOCALHOST_IP, IMAP_PORT)
             .login(FROM, PASSWORD)
@@ -202,8 +197,7 @@ public class NetworkMatcherIntegrationTest {
 
         messageSender.connect(LOCALHOST_IP, SMTP_PORT)
             .authenticate(FROM, PASSWORD)
-            .sendMessage(FROM, FROM)
-            .awaitSent(awaitAtMostOneMinute);
+            .sendMessage(FROM, FROM);
 
         imapMessageReader.connect(LOCALHOST_IP, IMAP_PORT)
             .login(FROM, PASSWORD)
@@ -223,8 +217,7 @@ public class NetworkMatcherIntegrationTest {
 
         messageSender.connect(LOCALHOST_IP, SMTP_PORT)
             .authenticate(FROM, PASSWORD)
-            .sendMessage(FROM, FROM)
-            .awaitSent(awaitAtMostOneMinute);
+            .sendMessage(FROM, FROM);
 
         MailRepositoryProbeImpl repositoryProbe = 
jamesServer.getProbe(MailRepositoryProbeImpl.class);
         awaitAtMostOneMinute.until(() -> 
repositoryProbe.getRepositoryMailCount(DROPPED_MAILS) == 1);
@@ -248,8 +241,7 @@ public class NetworkMatcherIntegrationTest {
 
         messageSender.connect(LOCALHOST_IP, SMTP_PORT)
             .authenticate(FROM, PASSWORD)
-            .sendMessage(FROM, FROM)
-            .awaitSent(awaitAtMostOneMinute);
+            .sendMessage(FROM, FROM);
 
         MailRepositoryProbeImpl repositoryProbe = 
jamesServer.getProbe(MailRepositoryProbeImpl.class);
         awaitAtMostOneMinute.until(() -> 
repositoryProbe.getRepositoryMailCount(DROPPED_MAILS) == 1);

http://git-wip-us.apache.org/repos/asf/james-project/blob/cf91dd4c/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/RecipientRewriteTableIntegrationTest.java
----------------------------------------------------------------------
diff --git 
a/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/RecipientRewriteTableIntegrationTest.java
 
b/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/RecipientRewriteTableIntegrationTest.java
index fb859aa..4bc8a3c 100644
--- 
a/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/RecipientRewriteTableIntegrationTest.java
+++ 
b/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/RecipientRewriteTableIntegrationTest.java
@@ -82,8 +82,7 @@ public class RecipientRewriteTableIntegrationTest {
     @Test
     public void rrtServiceShouldNotImpactRecipientsNotMatchingAnyRRT() throws 
Exception {
         messageSender.connect(LOCALHOST_IP, SMTP_PORT)
-            .sendMessage(FROM, RECIPIENT)
-            .awaitSent(awaitAtMostOneMinute);
+            .sendMessage(FROM, RECIPIENT);
 
         imapMessageReader.connect(LOCALHOST_IP, IMAP_PORT)
             .login(RECIPIENT, PASSWORD)
@@ -98,8 +97,7 @@ public class RecipientRewriteTableIntegrationTest {
         dataProbe.addAddressMapping(RECIPIENT_LOCAL_PART, DEFAULT_DOMAIN, 
OTHER_AT_JAMES);
 
         messageSender.connect(LOCALHOST_IP, SMTP_PORT)
-            .sendMessage(FROM, RECIPIENT)
-            .awaitSent(awaitAtMostOneMinute);
+            .sendMessage(FROM, RECIPIENT);
 
         imapMessageReader.connect(LOCALHOST_IP, IMAP_PORT)
             .login(ANY_AT_JAMES, PASSWORD)
@@ -119,8 +117,7 @@ public class RecipientRewriteTableIntegrationTest {
         dataProbe.addAddressMapping(RECIPIENT_LOCAL_PART, DEFAULT_DOMAIN, 
OTHER_AT_JAMES);
 
         messageSender.connect(LOCALHOST_IP, SMTP_PORT)
-            .sendMessage(FROM, RECIPIENT)
-            .awaitSent(awaitAtMostOneMinute);
+            .sendMessage(FROM, RECIPIENT);
 
         imapMessageReader.connect(LOCALHOST_IP, IMAP_PORT)
             .login(RECIPIENT, PASSWORD)
@@ -139,8 +136,7 @@ public class RecipientRewriteTableIntegrationTest {
         dataProbe.addAddressMapping(RECIPIENT_LOCAL_PART, DEFAULT_DOMAIN, 
OTHER_AT_JAMES);
 
         messageSender.connect(LOCALHOST_IP, SMTP_PORT)
-            .sendMessage(FROM, RECIPIENT)
-            .awaitSent(awaitAtMostOneMinute);
+            .sendMessage(FROM, RECIPIENT);
 
         imapMessageReader.connect(LOCALHOST_IP, IMAP_PORT)
             .login(localUser, PASSWORD)
@@ -160,8 +156,7 @@ public class RecipientRewriteTableIntegrationTest {
         dataProbe.addUser(ANY_AT_ANOTHER_DOMAIN, PASSWORD);
 
         messageSender.connect(LOCALHOST_IP, SMTP_PORT)
-            .sendMessage(FROM, ANY_AT_JAMES)
-            .awaitSent(awaitAtMostOneMinute);
+            .sendMessage(FROM, ANY_AT_JAMES);
 
         imapMessageReader.connect(LOCALHOST_IP, IMAP_PORT)
             .login(ANY_AT_ANOTHER_DOMAIN, PASSWORD)
@@ -176,8 +171,7 @@ public class RecipientRewriteTableIntegrationTest {
         dataProbe.addUser(ANY_AT_ANOTHER_DOMAIN, PASSWORD);
 
         messageSender.connect(LOCALHOST_IP, SMTP_PORT)
-            .sendMessage(FROM, ANY_AT_JAMES)
-            .awaitSent(awaitAtMostOneMinute);
+            .sendMessage(FROM, ANY_AT_JAMES);
 
         imapMessageReader.connect(LOCALHOST_IP, IMAP_PORT)
             .login(ANY_AT_JAMES, PASSWORD)
@@ -192,8 +186,7 @@ public class RecipientRewriteTableIntegrationTest {
         dataProbe.addForwardMapping(RECIPIENT_LOCAL_PART, DEFAULT_DOMAIN, 
OTHER_AT_JAMES);
 
         messageSender.connect(LOCALHOST_IP, SMTP_PORT)
-            .sendMessage(FROM, RECIPIENT)
-            .awaitSent(awaitAtMostOneMinute);
+            .sendMessage(FROM, RECIPIENT);
 
         imapMessageReader.connect(LOCALHOST_IP, IMAP_PORT)
             .login(ANY_AT_JAMES, PASSWORD)
@@ -213,8 +206,7 @@ public class RecipientRewriteTableIntegrationTest {
         dataProbe.addForwardMapping(ANY_LOCAL_PART, DEFAULT_DOMAIN, 
OTHER_AT_JAMES);
 
         messageSender.connect(LOCALHOST_IP, SMTP_PORT)
-            .sendMessage(FROM, GROUP)
-            .awaitSent(awaitAtMostOneMinute);
+            .sendMessage(FROM, GROUP);
 
         imapMessageReader.connect(LOCALHOST_IP, IMAP_PORT)
             .login(OTHER_AT_JAMES, PASSWORD)

http://git-wip-us.apache.org/repos/asf/james-project/blob/cf91dd4c/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/SieveDelivery.java
----------------------------------------------------------------------
diff --git 
a/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/SieveDelivery.java
 
b/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/SieveDelivery.java
index cfe116b..c2706f9 100644
--- 
a/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/SieveDelivery.java
+++ 
b/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/SieveDelivery.java
@@ -78,8 +78,7 @@ public class SieveDelivery {
             "fileinto \"" + TARGETED_MAILBOX + "\";");
 
         messageSender.connect(LOCALHOST_IP, SMTP_PORT)
-            .sendMessage(FROM, RECIPIENT)
-            .awaitSent(awaitAtMostOneMinute);
+            .sendMessage(FROM, RECIPIENT);
 
         imapMessageReader.connect(LOCALHOST_IP, IMAP_PORT)
             .login(RECIPIENT, PASSWORD)

http://git-wip-us.apache.org/repos/asf/james-project/blob/cf91dd4c/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/SmtpAuthIntegrationTest.java
----------------------------------------------------------------------
diff --git 
a/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/SmtpAuthIntegrationTest.java
 
b/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/SmtpAuthIntegrationTest.java
index 89dee69..0796b77 100644
--- 
a/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/SmtpAuthIntegrationTest.java
+++ 
b/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/SmtpAuthIntegrationTest.java
@@ -103,8 +103,7 @@ public class SmtpAuthIntegrationTest {
     public void authenticatedSmtpSessionsShouldBeDelivered() throws Exception {
         messageSender.connect(LOCALHOST_IP, SMTP_PORT)
             .authenticate(FROM, PASSWORD)
-            .sendMessage(FROM, FROM)
-            .awaitSent(awaitAtMostOneMinute);
+            .sendMessage(FROM, FROM);
 
         imapMessageReader.connect(LOCALHOST_IP, IMAP_PORT)
             .login(FROM, PASSWORD)
@@ -115,8 +114,7 @@ public class SmtpAuthIntegrationTest {
     @Test
     public void nonAuthenticatedSmtpSessionsShouldNotBeDelivered() throws 
Exception {
         messageSender.connect(LOCALHOST_IP, SMTP_PORT)
-            .sendMessage(FROM, FROM)
-            .awaitSent(awaitAtMostOneMinute);
+            .sendMessage(FROM, FROM);
 
         awaitAtMostOneMinute.until(() -> 
repositoryProbe.getRepositoryMailCount(DROPPED_MAILS) == 1);
         assertThat(

http://git-wip-us.apache.org/repos/asf/james-project/blob/cf91dd4c/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/crypto/SMIMEDecryptIntegrationTest.java
----------------------------------------------------------------------
diff --git 
a/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/crypto/SMIMEDecryptIntegrationTest.java
 
b/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/crypto/SMIMEDecryptIntegrationTest.java
index e1b2d57..554e0d5 100644
--- 
a/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/crypto/SMIMEDecryptIntegrationTest.java
+++ 
b/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/crypto/SMIMEDecryptIntegrationTest.java
@@ -99,8 +99,7 @@ public class SMIMEDecryptIntegrationTest {
         messageSender.connect(LOCALHOST_IP, SMTP_SECURE_PORT)
             .authenticate(FROM, PASSWORD)
             .sendMessageWithHeaders(FROM, FROM,
-                ClassLoaderUtils.getSystemResourceAsString("eml/crypted.eml"))
-            .awaitSent(awaitAtMostOneMinute);
+                ClassLoaderUtils.getSystemResourceAsString("eml/crypted.eml"));
 
         imapMessageReader.connect(LOCALHOST_IP, IMAP_PORT)
             .login(FROM, PASSWORD)
@@ -114,8 +113,7 @@ public class SMIMEDecryptIntegrationTest {
         messageSender.connect(LOCALHOST_IP, SMTP_SECURE_PORT)
             .authenticate(FROM, PASSWORD)
             .sendMessageWithHeaders(FROM, FROM,
-                
ClassLoaderUtils.getSystemResourceAsString("eml/crypted_with_attachment.eml"))
-            .awaitSent(awaitAtMostOneMinute);
+                
ClassLoaderUtils.getSystemResourceAsString("eml/crypted_with_attachment.eml"));
 
         imapMessageReader.connect(LOCALHOST_IP, IMAP_PORT)
             .login(FROM, PASSWORD)
@@ -130,8 +128,7 @@ public class SMIMEDecryptIntegrationTest {
         messageSender.connect(LOCALHOST_IP, SMTP_SECURE_PORT)
             .authenticate(FROM, PASSWORD)
             .sendMessageWithHeaders(FROM, FROM,
-                
ClassLoaderUtils.getSystemResourceAsString("eml/bad_crypted.eml"))
-            .awaitSent(awaitAtMostOneMinute);
+                
ClassLoaderUtils.getSystemResourceAsString("eml/bad_crypted.eml"));
 
         imapMessageReader.connect(LOCALHOST_IP, IMAP_PORT)
             .login(FROM, PASSWORD)

http://git-wip-us.apache.org/repos/asf/james-project/blob/cf91dd4c/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/crypto/SMIMESignIntegrationTest.java
----------------------------------------------------------------------
diff --git 
a/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/crypto/SMIMESignIntegrationTest.java
 
b/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/crypto/SMIMESignIntegrationTest.java
index 859ee94..669248f 100644
--- 
a/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/crypto/SMIMESignIntegrationTest.java
+++ 
b/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/crypto/SMIMESignIntegrationTest.java
@@ -114,8 +114,7 @@ public class SMIMESignIntegrationTest {
     public void authenticatedMessagesShouldBeSigned() throws Exception {
         messageSender.connect(LOCALHOST_IP, SMTP_SECURE_PORT)
             .authenticate(FROM, PASSWORD)
-            .sendMessage(FROM, RECIPIENT)
-            .awaitSent(awaitAtMostOneMinute);
+            .sendMessage(FROM, RECIPIENT);
 
         imapMessageReader.connect(LOCALHOST_IP, IMAP_PORT)
             .login(RECIPIENT, PASSWORD)
@@ -128,8 +127,7 @@ public class SMIMESignIntegrationTest {
     @Test
     public void nonAuthenticatedMessagesShouldNotBeSigned() throws Exception {
         messageSender.connect(LOCALHOST_IP, SMTP_SECURE_PORT)
-            .sendMessage(FROM, RECIPIENT)
-            .awaitSent(awaitAtMostOneMinute);
+            .sendMessage(FROM, RECIPIENT);
 
         imapMessageReader.connect(LOCALHOST_IP, IMAP_PORT)
             .login(RECIPIENT, PASSWORD)

http://git-wip-us.apache.org/repos/asf/james-project/blob/cf91dd4c/server/mailet/integration-testing/src/test/java/org/apache/james/smtp/SmtpAuthorizedAddressesTest.java
----------------------------------------------------------------------
diff --git 
a/server/mailet/integration-testing/src/test/java/org/apache/james/smtp/SmtpAuthorizedAddressesTest.java
 
b/server/mailet/integration-testing/src/test/java/org/apache/james/smtp/SmtpAuthorizedAddressesTest.java
index bdc6e39..859325d 100644
--- 
a/server/mailet/integration-testing/src/test/java/org/apache/james/smtp/SmtpAuthorizedAddressesTest.java
+++ 
b/server/mailet/integration-testing/src/test/java/org/apache/james/smtp/SmtpAuthorizedAddressesTest.java
@@ -25,6 +25,7 @@ import static 
org.apache.james.mailets.configuration.Constants.LOCALHOST_IP;
 import static org.apache.james.mailets.configuration.Constants.PASSWORD;
 import static org.apache.james.mailets.configuration.Constants.SMTP_PORT;
 import static 
org.apache.james.mailets.configuration.Constants.awaitAtMostOneMinute;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
 import static org.hamcrest.Matchers.equalTo;
 import static org.hamcrest.Matchers.hasSize;
 
@@ -41,6 +42,8 @@ import org.apache.james.utils.DataProbeImpl;
 import org.apache.james.utils.FakeSmtp;
 import org.apache.james.utils.IMAPMessageReader;
 import org.apache.james.utils.SMTPMessageSender;
+import org.apache.james.utils.SMTPSendingException;
+import org.apache.james.utils.SmtpSendingStep;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Rule;
@@ -63,7 +66,7 @@ public class SmtpAuthorizedAddressesTest {
     private TemporaryJamesServer jamesServer;
 
     @Before
-    public void setup() throws Exception {
+    public void setup() {
         fakeSmtp.awaitStarted(awaitAtMostOneMinute);
     }
 
@@ -101,8 +104,7 @@ public class SmtpAuthorizedAddressesTest {
             .withAutorizedAddresses("127.0.0.0/8"));
 
         messageSender.connect(LOCALHOST_IP, SMTP_PORT)
-            .sendMessage(FROM, TO)
-            .awaitSent(awaitAtMostOneMinute);
+            .sendMessage(FROM, TO);
 
         awaitAtMostOneMinute.until(() -> fakeSmtp.isReceived(response -> 
response
             .body("", hasSize(1))
@@ -116,9 +118,10 @@ public class SmtpAuthorizedAddressesTest {
             .requireAuthentication()
             .withAutorizedAddresses("172.0.0.0/8"));
 
-        messageSender.connect(LOCALHOST_IP, SMTP_PORT)
-            .sendMessage(FROM, TO)
-            .awaitSentFail(awaitAtMostOneMinute);
+        assertThatThrownBy(() ->
+            messageSender.connect(LOCALHOST_IP, SMTP_PORT)
+                .sendMessage(FROM, TO))
+            .isEqualTo(new SMTPSendingException(SmtpSendingStep.RCPT, "530 
5.7.1 Authentication Required\n"));
     }
 
     @Test
@@ -129,8 +132,7 @@ public class SmtpAuthorizedAddressesTest {
 
         messageSender.connect(LOCALHOST_IP, SMTP_PORT)
             .authenticate(FROM, PASSWORD)
-            .sendMessage(FROM, TO)
-            .awaitSent(awaitAtMostOneMinute);
+            .sendMessage(FROM, TO);
 
         awaitAtMostOneMinute.until(() -> fakeSmtp.isReceived(response -> 
response
             .body("", hasSize(1))
@@ -145,8 +147,7 @@ public class SmtpAuthorizedAddressesTest {
             .withAutorizedAddresses("172.0.0.0/8"));
 
         messageSender.connect(LOCALHOST_IP, SMTP_PORT)
-            .sendMessage(TO, FROM)
-            .awaitSent(awaitAtMostOneMinute);
+            .sendMessage(TO, FROM);
 
         imapMessageReader.connect(LOCALHOST_IP, IMAP_PORT)
             .login(FROM, PASSWORD)

http://git-wip-us.apache.org/repos/asf/james-project/blob/cf91dd4c/server/mailet/integration-testing/src/test/java/org/apache/james/smtp/SmtpBracketEnforcementTest.java
----------------------------------------------------------------------
diff --git 
a/server/mailet/integration-testing/src/test/java/org/apache/james/smtp/SmtpBracketEnforcementTest.java
 
b/server/mailet/integration-testing/src/test/java/org/apache/james/smtp/SmtpBracketEnforcementTest.java
index 4f2832b..a974d3f 100644
--- 
a/server/mailet/integration-testing/src/test/java/org/apache/james/smtp/SmtpBracketEnforcementTest.java
+++ 
b/server/mailet/integration-testing/src/test/java/org/apache/james/smtp/SmtpBracketEnforcementTest.java
@@ -23,13 +23,15 @@ import static 
org.apache.james.mailets.configuration.Constants.DEFAULT_DOMAIN;
 import static org.apache.james.mailets.configuration.Constants.LOCALHOST_IP;
 import static org.apache.james.mailets.configuration.Constants.PASSWORD;
 import static org.apache.james.mailets.configuration.Constants.SMTP_PORT;
-import static 
org.apache.james.mailets.configuration.Constants.awaitAtMostOneMinute;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
 
 import org.apache.james.mailets.TemporaryJamesServer;
 import org.apache.james.mailets.configuration.SmtpConfiguration;
 import org.apache.james.probe.DataProbe;
 import org.apache.james.utils.DataProbeImpl;
 import org.apache.james.utils.SMTPMessageSender;
+import org.apache.james.utils.SMTPSendingException;
+import org.apache.james.utils.SmtpSendingStep;
 import org.junit.After;
 import org.junit.Rule;
 import org.junit.Test;
@@ -69,8 +71,7 @@ public class SmtpBracketEnforcementTest {
 
         messageSender.connect(LOCALHOST_IP, SMTP_PORT)
             .authenticate(USER, PASSWORD)
-            .sendMessage(USER, USER)
-            .awaitSent(awaitAtMostOneMinute);
+            .sendMessage(USER, USER);
     }
 
     @Test
@@ -80,8 +81,7 @@ public class SmtpBracketEnforcementTest {
 
         messageSender.connect(LOCALHOST_IP, SMTP_PORT)
             .authenticate(USER, PASSWORD)
-            .sendMessageNoBracket(USER, USER)
-            .awaitSent(awaitAtMostOneMinute);
+            .sendMessageNoBracket(USER, USER);
     }
 
     @Test
@@ -91,8 +91,7 @@ public class SmtpBracketEnforcementTest {
 
         messageSender.connect(LOCALHOST_IP, SMTP_PORT)
             .authenticate(USER, PASSWORD)
-            .sendMessage(USER, USER)
-            .awaitSent(awaitAtMostOneMinute);
+            .sendMessage(USER, USER);
     }
 
     @Test
@@ -100,9 +99,10 @@ public class SmtpBracketEnforcementTest {
         createJamesServer(SmtpConfiguration.builder()
             .requireBracketEnforcement());
 
-        messageSender.connect(LOCALHOST_IP, SMTP_PORT)
-            .authenticate(USER, PASSWORD)
-            .sendMessageNoBracket(USER, USER)
-            .awaitSentFail(awaitAtMostOneMinute);
+        assertThatThrownBy(() ->
+            messageSender.connect(LOCALHOST_IP, SMTP_PORT)
+                .authenticate(USER, PASSWORD)
+                .sendMessageNoBracket(USER, USER))
+            .isEqualTo(new SMTPSendingException(SmtpSendingStep.RCPT, "501 
5.5.2 Syntax error in parameters or arguments\n"));
     }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/cf91dd4c/server/mailet/integration-testing/src/test/java/org/apache/james/smtp/SmtpIdentityVerificationTest.java
----------------------------------------------------------------------
diff --git 
a/server/mailet/integration-testing/src/test/java/org/apache/james/smtp/SmtpIdentityVerificationTest.java
 
b/server/mailet/integration-testing/src/test/java/org/apache/james/smtp/SmtpIdentityVerificationTest.java
index 5a8582d..1a7d323 100644
--- 
a/server/mailet/integration-testing/src/test/java/org/apache/james/smtp/SmtpIdentityVerificationTest.java
+++ 
b/server/mailet/integration-testing/src/test/java/org/apache/james/smtp/SmtpIdentityVerificationTest.java
@@ -23,13 +23,15 @@ import static 
org.apache.james.mailets.configuration.Constants.DEFAULT_DOMAIN;
 import static org.apache.james.mailets.configuration.Constants.LOCALHOST_IP;
 import static org.apache.james.mailets.configuration.Constants.PASSWORD;
 import static org.apache.james.mailets.configuration.Constants.SMTP_PORT;
-import static 
org.apache.james.mailets.configuration.Constants.awaitAtMostOneMinute;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
 
 import org.apache.james.mailets.TemporaryJamesServer;
 import org.apache.james.mailets.configuration.SmtpConfiguration;
 import org.apache.james.probe.DataProbe;
 import org.apache.james.utils.DataProbeImpl;
 import org.apache.james.utils.SMTPMessageSender;
+import org.apache.james.utils.SMTPSendingException;
+import org.apache.james.utils.SmtpSendingStep;
 import org.junit.After;
 import org.junit.Rule;
 import org.junit.Test;
@@ -73,8 +75,7 @@ public class SmtpIdentityVerificationTest {
             .verifyIdentity());
 
         messageSender.connect(LOCALHOST_IP, SMTP_PORT)
-            .authenticate(USER, PASSWORD).sendMessage(USER, USER)
-            .awaitSent(awaitAtMostOneMinute);
+            .authenticate(USER, PASSWORD).sendMessage(USER, USER);
     }
 
     @Test
@@ -85,8 +86,7 @@ public class SmtpIdentityVerificationTest {
 
         messageSender.connect(LOCALHOST_IP, SMTP_PORT)
             .authenticate(ATTACKER, ATTACKER_PASSWORD)
-            .sendMessage(USER, USER)
-            .awaitSent(awaitAtMostOneMinute);
+            .sendMessage(USER, USER);
     }
 
     @Test
@@ -95,10 +95,11 @@ public class SmtpIdentityVerificationTest {
             .requireAuthentication()
             .verifyIdentity());
 
-        messageSender.connect(LOCALHOST_IP, SMTP_PORT)
-            .authenticate(ATTACKER, ATTACKER_PASSWORD)
-            .sendMessage(USER, USER)
-            .awaitSentFail(awaitAtMostOneMinute);
+        assertThatThrownBy(() ->
+            messageSender.connect(LOCALHOST_IP, SMTP_PORT)
+                .authenticate(ATTACKER, ATTACKER_PASSWORD)
+                .sendMessage(USER, USER))
+            .isEqualTo(new SMTPSendingException(SmtpSendingStep.RCPT, "503 
5.7.1 Incorrect Authentication for Specified Email Address\n"));
     }
 
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/cf91dd4c/server/mailet/integration-testing/src/test/java/org/apache/james/smtp/SmtpNullSenderTest.java
----------------------------------------------------------------------
diff --git 
a/server/mailet/integration-testing/src/test/java/org/apache/james/smtp/SmtpNullSenderTest.java
 
b/server/mailet/integration-testing/src/test/java/org/apache/james/smtp/SmtpNullSenderTest.java
index b6b6d80..2bcb837 100644
--- 
a/server/mailet/integration-testing/src/test/java/org/apache/james/smtp/SmtpNullSenderTest.java
+++ 
b/server/mailet/integration-testing/src/test/java/org/apache/james/smtp/SmtpNullSenderTest.java
@@ -67,15 +67,13 @@ public class SmtpNullSenderTest {
     @Test
     public void smtpLayerShouldAcceptEmptySenders() throws Exception {
         messageSender.connect(LOCALHOST_IP, SMTP_PORT)
-            .sendMessageWithHeaders("", USER,"Short message")
-            .awaitSent(awaitAtMostOneMinute);
+            .sendMessageWithHeaders("", USER,"Short message");
     }
 
     @Test
     public void mailProcessingShouldDeliverNullSender() throws Exception {
         messageSender.connect(LOCALHOST_IP, SMTP_PORT)
-            .sendMessageWithHeaders("", USER,"Short message")
-            .awaitSent(awaitAtMostOneMinute);
+            .sendMessageWithHeaders("", USER,"Short message");
 
         imapMessageReader.connect(LOCALHOST_IP, IMAP_PORT)
             .login(USER, PASSWORD)

http://git-wip-us.apache.org/repos/asf/james-project/blob/cf91dd4c/server/mailet/integration-testing/src/test/java/org/apache/james/smtp/SmtpSizeLimitationTest.java
----------------------------------------------------------------------
diff --git 
a/server/mailet/integration-testing/src/test/java/org/apache/james/smtp/SmtpSizeLimitationTest.java
 
b/server/mailet/integration-testing/src/test/java/org/apache/james/smtp/SmtpSizeLimitationTest.java
index 28b31ea..bc5aea9 100644
--- 
a/server/mailet/integration-testing/src/test/java/org/apache/james/smtp/SmtpSizeLimitationTest.java
+++ 
b/server/mailet/integration-testing/src/test/java/org/apache/james/smtp/SmtpSizeLimitationTest.java
@@ -23,13 +23,15 @@ import static 
org.apache.james.mailets.configuration.Constants.DEFAULT_DOMAIN;
 import static org.apache.james.mailets.configuration.Constants.LOCALHOST_IP;
 import static org.apache.james.mailets.configuration.Constants.PASSWORD;
 import static org.apache.james.mailets.configuration.Constants.SMTP_PORT;
-import static 
org.apache.james.mailets.configuration.Constants.awaitAtMostOneMinute;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
 
 import org.apache.james.mailets.TemporaryJamesServer;
 import org.apache.james.mailets.configuration.SmtpConfiguration;
 import org.apache.james.probe.DataProbe;
 import org.apache.james.utils.DataProbeImpl;
 import org.apache.james.utils.SMTPMessageSender;
+import org.apache.james.utils.SMTPSendingException;
+import org.apache.james.utils.SmtpSendingStep;
 import org.junit.After;
 import org.junit.Rule;
 import org.junit.Test;
@@ -70,10 +72,11 @@ public class SmtpSizeLimitationTest {
             .doNotVerifyIdentity()
             .withMaxMessageSizeInKb(10));
 
-        messageSender.connect(LOCALHOST_IP, SMTP_PORT)
-            .authenticate(USER, PASSWORD)
-            .sendMessageWithHeaders(USER, USER, Strings.repeat("Long message", 
1024))
-            .awaitSentFail(awaitAtMostOneMinute);
+        assertThatThrownBy(() ->
+            messageSender.connect(LOCALHOST_IP, SMTP_PORT)
+                .authenticate(USER, PASSWORD)
+                .sendMessageWithHeaders(USER, USER, Strings.repeat("Long 
message", 1024)))
+            .isEqualTo(new SMTPSendingException(SmtpSendingStep.Data, "500 
Line length exceeded. See RFC 2821 #4.5.3.1.\n"));
     }
 
     @Test
@@ -84,7 +87,6 @@ public class SmtpSizeLimitationTest {
 
         messageSender.connect(LOCALHOST_IP, SMTP_PORT)
             .authenticate(USER, PASSWORD)
-            .sendMessageWithHeaders(USER, USER,"Short message")
-            .awaitSent(awaitAtMostOneMinute);
+            .sendMessageWithHeaders(USER, USER,"Short message");
     }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/cf91dd4c/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/AddFooterTest.java
----------------------------------------------------------------------
diff --git 
a/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/AddFooterTest.java
 
b/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/AddFooterTest.java
index 3e35051..88adc4e 100644
--- 
a/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/AddFooterTest.java
+++ 
b/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/AddFooterTest.java
@@ -90,8 +90,7 @@ public class AddFooterTest {
                     .setText("Any content")
                     .setSubject("test"))
                 .sender(FROM)
-                .recipient(RECIPIENT))
-            .awaitSent(awaitAtMostOneMinute);
+                .recipient(RECIPIENT));
 
         imapMessageReader.connect(LOCALHOST_IP, IMAP_PORT)
             .login(RECIPIENT, PASSWORD)
@@ -115,8 +114,7 @@ public class AddFooterTest {
                             .type("application/data"))
                     .setSubject("test"))
                 .sender(FROM)
-                .recipient(RECIPIENT))
-            .awaitSent(awaitAtMostOneMinute);
+                .recipient(RECIPIENT));
 
         imapMessageReader.connect(LOCALHOST_IP, IMAP_PORT)
             .login(RECIPIENT, PASSWORD)

http://git-wip-us.apache.org/repos/asf/james-project/blob/cf91dd4c/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/AmqpForwardAttachmentTest.java
----------------------------------------------------------------------
diff --git 
a/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/AmqpForwardAttachmentTest.java
 
b/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/AmqpForwardAttachmentTest.java
index b67d4eb..c876847 100644
--- 
a/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/AmqpForwardAttachmentTest.java
+++ 
b/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/AmqpForwardAttachmentTest.java
@@ -130,8 +130,7 @@ public class AmqpForwardAttachmentTest {
             .sendMessage(FakeMail.builder()
                 .mimeMessage(message)
                 .sender(FROM)
-                .recipient(RECIPIENT))
-            .awaitSent(awaitAtMostOneMinute);
+                .recipient(RECIPIENT));
 
         imapMessageReader.connect(LOCALHOST_IP, IMAP_PORT)
             .login(RECIPIENT, PASSWORD)

http://git-wip-us.apache.org/repos/asf/james-project/blob/cf91dd4c/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/ContactExtractorTest.java
----------------------------------------------------------------------
diff --git 
a/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/ContactExtractorTest.java
 
b/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/ContactExtractorTest.java
index ba6bda2..050e177 100644
--- 
a/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/ContactExtractorTest.java
+++ 
b/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/ContactExtractorTest.java
@@ -125,8 +125,7 @@ public class ContactExtractorTest {
             .sendMessage(FakeMail.builder()
                 .mimeMessage(message)
                 .sender(SENDER)
-                .recipients(TO, TO2, CC, CC2, BCC, BCC2))
-            .awaitSent(awaitAtMostOneMinute);
+                .recipients(TO, TO2, CC, CC2, BCC, BCC2));
 
         imapMessageReader.connect(LOCALHOST_IP, IMAP_PORT)
             .login(TO, PASSWORD)

http://git-wip-us.apache.org/repos/asf/james-project/blob/cf91dd4c/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/GroupMappingTest.java
----------------------------------------------------------------------
diff --git 
a/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/GroupMappingTest.java
 
b/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/GroupMappingTest.java
index 2339ca5..cd9606e 100644
--- 
a/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/GroupMappingTest.java
+++ 
b/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/GroupMappingTest.java
@@ -27,6 +27,7 @@ import static 
org.apache.james.mailets.configuration.Constants.PASSWORD;
 import static org.apache.james.mailets.configuration.Constants.SMTP_PORT;
 import static 
org.apache.james.mailets.configuration.Constants.awaitAtMostOneMinute;
 import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
 import static org.hamcrest.Matchers.equalTo;
 
 import javax.mail.internet.MimeMessage;
@@ -41,13 +42,14 @@ import 
org.apache.james.mailets.configuration.MailetContainer;
 import org.apache.james.mailets.configuration.ProcessorConfiguration;
 import org.apache.james.modules.MailboxProbeImpl;
 import org.apache.james.probe.DataProbe;
-import org.apache.james.protocols.smtp.SMTPRetCode;
 import org.apache.james.transport.matchers.All;
 import org.apache.james.transport.matchers.RecipientIsLocal;
 import org.apache.james.utils.DataProbeImpl;
 import org.apache.james.utils.FakeSmtp;
 import org.apache.james.utils.IMAPMessageReader;
 import org.apache.james.utils.SMTPMessageSender;
+import org.apache.james.utils.SMTPSendingException;
+import org.apache.james.utils.SmtpSendingStep;
 import org.apache.james.utils.WebAdminGuiceProbe;
 import org.apache.james.webadmin.WebAdminUtils;
 import org.apache.james.webadmin.routes.GroupsRoutes;
@@ -143,8 +145,7 @@ public class GroupMappingTest {
             .sendMessage(FakeMail.builder()
                 .mimeMessage(message)
                 .sender(SENDER)
-                .recipient(GROUP_ON_DOMAIN1))
-            .awaitSent(awaitAtMostOneMinute);
+                .recipient(GROUP_ON_DOMAIN1));
 
         imapMessageReader.connect(LOCALHOST_IP, IMAP_PORT)
             .login(USER_DOMAIN1, PASSWORD)
@@ -161,8 +162,7 @@ public class GroupMappingTest {
             .sendMessage(FakeMail.builder()
                 .mimeMessage(message)
                 .sender(SENDER)
-                .recipient(GROUP_ON_DOMAIN1))
-            .awaitSent(awaitAtMostOneMinute);
+                .recipient(GROUP_ON_DOMAIN1));
 
         imapMessageReader.connect(LOCALHOST_IP, IMAP_PORT)
             .login(USER_DOMAIN2, PASSWORD)
@@ -181,8 +181,7 @@ public class GroupMappingTest {
             .sendMessage(FakeMail.builder()
                 .mimeMessage(message)
                 .sender(SENDER)
-                .recipient(GROUP_ON_DOMAIN1))
-            .awaitSent(awaitAtMostOneMinute);
+                .recipient(GROUP_ON_DOMAIN1));
 
         imapMessageReader.connect(LOCALHOST_IP, IMAP_PORT)
             .login(USER_DOMAIN1, PASSWORD)
@@ -204,8 +203,7 @@ public class GroupMappingTest {
             .sendMessage(FakeMail.builder()
                 .mimeMessage(message)
                 .sender(SENDER)
-                .recipient(GROUP_ON_DOMAIN1))
-            .awaitSent(awaitAtMostOneMinute);
+                .recipient(GROUP_ON_DOMAIN1));
 
         imapMessageReader.connect(LOCALHOST_IP, IMAP_PORT)
             .login(USER_DOMAIN2, PASSWORD)
@@ -226,8 +224,7 @@ public class GroupMappingTest {
             .sendMessage(FakeMail.builder()
                 .mimeMessage(message)
                 .sender(SENDER)
-                .recipient(GROUP_ON_DOMAIN1))
-            .awaitSent(awaitAtMostOneMinute);
+                .recipient(GROUP_ON_DOMAIN1));
 
         imapMessageReader.connect(LOCALHOST_IP, IMAP_PORT)
             .login(USER_DOMAIN1, PASSWORD)
@@ -243,8 +240,7 @@ public class GroupMappingTest {
             .sendMessage(FakeMail.builder()
                 .mimeMessage(message)
                 .sender(SENDER)
-                .recipients(GROUP_ON_DOMAIN1, USER_DOMAIN1))
-            .awaitSent(awaitAtMostOneMinute);
+                .recipients(GROUP_ON_DOMAIN1, USER_DOMAIN1));
 
         imapMessageReader.connect(LOCALHOST_IP, IMAP_PORT)
             .login(USER_DOMAIN1, PASSWORD)
@@ -264,8 +260,7 @@ public class GroupMappingTest {
             .sendMessage(FakeMail.builder()
                 .mimeMessage(message)
                 .sender(SENDER)
-                .recipient(GROUP_ON_DOMAIN1))
-            .awaitSent(awaitAtMostOneMinute);
+                .recipient(GROUP_ON_DOMAIN1));
 
         imapMessageReader.connect(LOCALHOST_IP, IMAP_PORT)
             .login(USER_DOMAIN2, PASSWORD)
@@ -288,12 +283,15 @@ public class GroupMappingTest {
 
         webAdminApi.put(GroupsRoutes.ROOT_PATH + "/" + GROUP_ON_DOMAIN2 + "/" 
+ GROUP_ON_DOMAIN1);
 
-        messageSender.connect(LOCALHOST_IP, SMTP_PORT)
-            .sendEnvelope(FakeMail.builder()
-                .mimeMessage(message)
-                .sender(SENDER)
-                .recipient(GROUP_ON_DOMAIN1))
-            .awaitSentFail(SMTPRetCode.MAILBOX_PERM_UNAVAILABLE, 
awaitAtMostOneMinute);
+
+        assertThatThrownBy(() ->
+            messageSender.connect(LOCALHOST_IP, SMTP_PORT)
+                .sendMessage(FakeMail.builder()
+                    .mimeMessage(message)
+                    .sender(SENDER)
+                    .recipient(GROUP_ON_DOMAIN1)))
+            .isInstanceOf(SMTPSendingException.class)
+            .matches(t -> SMTPSendingException.isForStep(t, 
SmtpSendingStep.RCPT));
 
         imapMessageReader.connect(LOCALHOST_IP, IMAP_PORT)
             .login(USER_DOMAIN1, PASSWORD)
@@ -316,8 +314,7 @@ public class GroupMappingTest {
             .sendMessage(FakeMail.builder()
                 .mimeMessage(message)
                 .sender(SENDER)
-                .recipient(GROUP_ON_DOMAIN1))
-            .awaitSent(awaitAtMostOneMinute);
+                .recipient(GROUP_ON_DOMAIN1));
 
         imapMessageReader.connect(LOCALHOST_IP, IMAP_PORT)
             .login(USER_DOMAIN2, PASSWORD)
@@ -335,8 +332,7 @@ public class GroupMappingTest {
             .sendMessage(FakeMail.builder()
                 .mimeMessage(message)
                 .sender(SENDER)
-                .recipient(GROUP_ON_DOMAIN1))
-            .awaitSent(awaitAtMostOneMinute);
+                .recipient(GROUP_ON_DOMAIN1));
 
         imapMessageReader.connect(LOCALHOST_IP, IMAP_PORT)
             .login(USER_DOMAIN1, PASSWORD)
@@ -354,8 +350,7 @@ public class GroupMappingTest {
             .sendMessage(FakeMail.builder()
                 .mimeMessage(message)
                 .sender(SENDER)
-                .recipient((GROUP_ON_DOMAIN1)))
-            .awaitSent(awaitAtMostOneMinute);
+                .recipient((GROUP_ON_DOMAIN1)));
 
         imapMessageReader.connect(LOCALHOST_IP, IMAP_PORT)
             .login(USER_DOMAIN2, PASSWORD)
@@ -373,8 +368,7 @@ public class GroupMappingTest {
             .sendMessage(FakeMail.builder()
                 .mimeMessage(message)
                 .sender(SENDER)
-                .recipient(groupWithSlash))
-            .awaitSent(awaitAtMostOneMinute);
+                .recipient(groupWithSlash));
 
         imapMessageReader.connect(LOCALHOST_IP, IMAP_PORT)
             .login(USER_DOMAIN1, PASSWORD)
@@ -393,8 +387,7 @@ public class GroupMappingTest {
             .sendMessage(FakeMail.builder()
                 .mimeMessage(message)
                 .sender(SENDER)
-                .recipient(GROUP_ON_DOMAIN1))
-            .awaitSent(awaitAtMostOneMinute);
+                .recipient(GROUP_ON_DOMAIN1));
 
         imapMessageReader.connect(LOCALHOST_IP, IMAP_PORT)
             .login(userWithSlash, PASSWORD)
@@ -412,8 +405,7 @@ public class GroupMappingTest {
             .sendMessage(FakeMail.builder()
                 .mimeMessage(message)
                 .sender(SENDER)
-                .recipient(GROUP_ON_DOMAIN1))
-            .awaitSent(awaitAtMostOneMinute);
+                .recipient(GROUP_ON_DOMAIN1));
 
         imapMessageReader.connect(LOCALHOST_IP, IMAP_PORT)
             .login(USER_DOMAIN1, PASSWORD)
@@ -430,8 +422,7 @@ public class GroupMappingTest {
             .sendMessage(FakeMail.builder()
                 .mimeMessage(message)
                 .sender(SENDER)
-                .recipient(GROUP_ON_DOMAIN1))
-            .awaitSent(awaitAtMostOneMinute);
+                .recipient(GROUP_ON_DOMAIN1));
 
         fakeSmtp.isReceived(response -> response
             .body("[0].from", equalTo(SENDER))

http://git-wip-us.apache.org/repos/asf/james-project/blob/cf91dd4c/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/ICSAttachmentWorkflowTest.java
----------------------------------------------------------------------
diff --git 
a/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/ICSAttachmentWorkflowTest.java
 
b/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/ICSAttachmentWorkflowTest.java
index cc78ded..8c8a794 100644
--- 
a/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/ICSAttachmentWorkflowTest.java
+++ 
b/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/ICSAttachmentWorkflowTest.java
@@ -558,8 +558,7 @@ public class ICSAttachmentWorkflowTest {
             .sendMessage(FakeMail.builder()
                 .mimeMessage(messageWithoutICSAttached)
                 .sender(FROM)
-                .recipient(RECIPIENT))
-            .awaitSent(awaitAtMostOneMinute);
+                .recipient(RECIPIENT));
 
         imapMessageReader.connect(LOCALHOST_IP, IMAP_PORT)
             .login(RECIPIENT, PASSWORD)
@@ -575,8 +574,7 @@ public class ICSAttachmentWorkflowTest {
             .sendMessage(FakeMail.builder()
                 .mimeMessage(messageWithICSAttached)
                 .sender(FROM)
-                .recipient(RECIPIENT))
-            .awaitSent(awaitAtMostOneMinute);
+                .recipient(RECIPIENT));
 
         imapMessageReader.connect(LOCALHOST_IP, IMAP_PORT)
             .login(RECIPIENT, PASSWORD)
@@ -608,8 +606,7 @@ public class ICSAttachmentWorkflowTest {
             .sendMessage(FakeMail.builder()
                 .mimeMessage(messageWithoutICSAttached)
                 .sender(FROM)
-                .recipient(RECIPIENT))
-            .awaitSent(awaitAtMostOneMinute);
+                .recipient(RECIPIENT));
 
         imapMessageReader.connect(LOCALHOST_IP, IMAP_PORT)
             .login(RECIPIENT, PASSWORD)
@@ -630,8 +627,7 @@ public class ICSAttachmentWorkflowTest {
             .sendMessage(FakeMail.builder()
                 .mimeMessage(messageWithICSAttached)
                 .sender(FROM)
-                .recipient(RECIPIENT))
-            .awaitSent(awaitAtMostOneMinute);
+                .recipient(RECIPIENT));
 
         imapMessageReader.connect(LOCALHOST_IP, IMAP_PORT)
             .login(RECIPIENT, PASSWORD)
@@ -651,8 +647,7 @@ public class ICSAttachmentWorkflowTest {
             .sendMessage(FakeMail.builder()
                 .mimeMessage(messageWithICSBase64Attached)
                 .sender(FROM)
-                .recipient(RECIPIENT))
-            .awaitSent(awaitAtMostOneMinute);
+                .recipient(RECIPIENT));
 
         imapMessageReader.connect(LOCALHOST_IP, IMAP_PORT)
             .login(RECIPIENT, PASSWORD)
@@ -672,8 +667,7 @@ public class ICSAttachmentWorkflowTest {
             .sendMessage(FakeMail.builder()
                 .mimeMessage(messageWithICSBase64Attached)
                 .sender(FROM)
-                .recipient(RECIPIENT))
-            .awaitSent(awaitAtMostOneMinute);
+                .recipient(RECIPIENT));
 
         imapMessageReader.connect(LOCALHOST_IP, IMAP_PORT)
             .login(RECIPIENT, PASSWORD)
@@ -698,8 +692,7 @@ public class ICSAttachmentWorkflowTest {
             .sendMessage(FakeMail.builder()
                 .mimeMessage(yahooInvitationMessage)
                 .sender(FROM)
-                .recipient(RECIPIENT))
-            .awaitSent(awaitAtMostOneMinute);
+                .recipient(RECIPIENT));
 
         imapMessageReader.connect(LOCALHOST_IP, IMAP_PORT)
             .login(RECIPIENT, PASSWORD)
@@ -725,8 +718,7 @@ public class ICSAttachmentWorkflowTest {
             .sendMessage(FakeMail.builder()
                 .mimeMessage(messageWithThreeICSAttached)
                 .sender(FROM)
-                .recipient(RECIPIENT))
-            .awaitSent(awaitAtMostOneMinute);
+                .recipient(RECIPIENT));
 
         imapMessageReader.connect(LOCALHOST_IP, IMAP_PORT)
             .login(RECIPIENT, PASSWORD)
@@ -746,8 +738,7 @@ public class ICSAttachmentWorkflowTest {
             .sendMessage(FakeMail.builder()
                 .mimeMessage(messageWithThreeICSAttached)
                 .sender(FROM)
-                .recipient(RECIPIENT))
-            .awaitSent(awaitAtMostOneMinute);
+                .recipient(RECIPIENT));
 
         imapMessageReader.connect(LOCALHOST_IP, IMAP_PORT)
             .login(RECIPIENT, PASSWORD)
@@ -785,8 +776,7 @@ public class ICSAttachmentWorkflowTest {
             .sendMessage(FakeMail.builder()
                 .mimeMessage(calendarMessage)
                 .sender(FROM)
-                .recipient(RECIPIENT))
-            .awaitSent(awaitAtMostOneMinute);
+                .recipient(RECIPIENT));
 
         imapMessageReader.connect(LOCALHOST_IP, IMAP_PORT)
             .login(RECIPIENT, PASSWORD)

http://git-wip-us.apache.org/repos/asf/james-project/blob/cf91dd4c/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/IsOverQuotaMatcherTest.java
----------------------------------------------------------------------
diff --git 
a/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/IsOverQuotaMatcherTest.java
 
b/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/IsOverQuotaMatcherTest.java
index f6e7850..26a3658 100644
--- 
a/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/IsOverQuotaMatcherTest.java
+++ 
b/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/IsOverQuotaMatcherTest.java
@@ -116,8 +116,7 @@ public class IsOverQuotaMatcherTest {
             .put("/quota/users/" + RECIPIENT + "/size");
 
         messageSender.connect(LOCALHOST_IP, SMTP_PORT)
-            .sendMessage(FROM, RECIPIENT)
-            .awaitSent(awaitAtMostOneMinute);
+            .sendMessage(FROM, RECIPIENT);
 
         IMAPMessageReader messageReader = 
imapMessageReader.connect(LOCALHOST_IP, IMAP_PORT)
             .login(FROM, PASSWORD)
@@ -135,8 +134,7 @@ public class IsOverQuotaMatcherTest {
             .put("/quota/domains/" + DEFAULT_DOMAIN + "/size");
 
         messageSender.connect(LOCALHOST_IP, SMTP_PORT)
-            .sendMessage(FROM, RECIPIENT)
-            .awaitSent(awaitAtMostOneMinute);
+            .sendMessage(FROM, RECIPIENT);
 
         IMAPMessageReader messageReader = 
imapMessageReader.connect(LOCALHOST_IP, IMAP_PORT)
             .login(FROM, PASSWORD)
@@ -154,8 +152,7 @@ public class IsOverQuotaMatcherTest {
             .put("/quota/users/" + RECIPIENT + "/size");
 
         messageSender.connect(LOCALHOST_IP, SMTP_PORT)
-            .sendMessage(FROM, RECIPIENT)
-            .awaitSent(awaitAtMostOneMinute);
+            .sendMessage(FROM, RECIPIENT);
 
         imapMessageReader.connect(LOCALHOST_IP, IMAP_PORT)
             .login(RECIPIENT, PASSWORD)
@@ -170,8 +167,7 @@ public class IsOverQuotaMatcherTest {
             .put("/quota/users/" + RECIPIENT + "/count");
 
         messageSender.connect(LOCALHOST_IP, SMTP_PORT)
-            .sendMessage(FROM, RECIPIENT)
-            .awaitSent(awaitAtMostOneMinute);
+            .sendMessage(FROM, RECIPIENT);
 
         IMAPMessageReader messageReader = 
imapMessageReader.connect(LOCALHOST_IP, IMAP_PORT)
             .login(FROM, PASSWORD)
@@ -189,8 +185,7 @@ public class IsOverQuotaMatcherTest {
             .put("/quota/domains/" + DEFAULT_DOMAIN + "/count");
 
         messageSender.connect(LOCALHOST_IP, SMTP_PORT)
-            .sendMessage(FROM, RECIPIENT)
-            .awaitSent(awaitAtMostOneMinute);
+            .sendMessage(FROM, RECIPIENT);
 
         IMAPMessageReader messageReader = 
imapMessageReader.connect(LOCALHOST_IP, IMAP_PORT)
             .login(FROM, PASSWORD)
@@ -208,8 +203,7 @@ public class IsOverQuotaMatcherTest {
             .put("/quota/users/" + RECIPIENT + "/count");
 
         messageSender.connect(LOCALHOST_IP, SMTP_PORT)
-            .sendMessage(FROM, RECIPIENT)
-            .awaitSent(awaitAtMostOneMinute);
+            .sendMessage(FROM, RECIPIENT);
 
         imapMessageReader.connect(LOCALHOST_IP, IMAP_PORT)
             .login(RECIPIENT, PASSWORD)

http://git-wip-us.apache.org/repos/asf/james-project/blob/cf91dd4c/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/SpamAssassinTest.java
----------------------------------------------------------------------
diff --git 
a/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/SpamAssassinTest.java
 
b/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/SpamAssassinTest.java
index 970fe48..8ed9729 100644
--- 
a/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/SpamAssassinTest.java
+++ 
b/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/SpamAssassinTest.java
@@ -101,8 +101,7 @@ public class SpamAssassinTest {
     @Test
     public void spamAssassinShouldAppendNewHeaderOnMessage() throws Exception {
         messageSender.connect(LOCALHOST_IP, SMTP_PORT)
-            .sendMessage(mailWithContent("This is the content", RECIPIENT))
-            .awaitSent(awaitAtMostOneMinute);
+            .sendMessage(mailWithContent("This is the content", RECIPIENT));
 
         messageReader.connect(LOCALHOST_IP, IMAP_PORT)
             .login(RECIPIENT, PASSWORD)
@@ -118,8 +117,7 @@ public class SpamAssassinTest {
     @Test
     public void 
spamAssassinShouldAppendNewHeaderWhichDetectIsSpamWhenSpamMessage() throws 
Exception {
         messageSender.connect(LOCALHOST_IP, SMTP_PORT)
-            .sendMessage(mailWithContent(SPAM_CONTENT, RECIPIENT))
-            .awaitSent(awaitAtMostOneMinute);
+            .sendMessage(mailWithContent(SPAM_CONTENT, RECIPIENT));
 
         messageReader.connect(LOCALHOST_IP, IMAP_PORT)
             .login(RECIPIENT, PASSWORD)
@@ -134,8 +132,7 @@ public class SpamAssassinTest {
     @Test
     public void spamAssassinShouldAppendNewHeaderWhichNoWhenNonSpamMessage() 
throws Exception {
         messageSender.connect(LOCALHOST_IP, SMTP_PORT)
-            .sendMessage(mailWithContent("This is the content", RECIPIENT))
-            .awaitSent(awaitAtMostOneMinute);
+            .sendMessage(mailWithContent("This is the content", RECIPIENT));
 
         messageReader.connect(LOCALHOST_IP, IMAP_PORT)
             .login(RECIPIENT, PASSWORD)
@@ -150,8 +147,7 @@ public class SpamAssassinTest {
     @Test
     public void spamAssassinShouldAppendNewHeaderPerRecipientOnMessage() 
throws Exception {
         messageSender.connect(LOCALHOST_IP, SMTP_PORT)
-            .sendMessage(mailWithContent("This is the content", RECIPIENT, 
RECIPIENT2))
-            .awaitSent(awaitAtMostOneMinute);
+            .sendMessage(mailWithContent("This is the content", RECIPIENT, 
RECIPIENT2));
 
         messageReader.connect(LOCALHOST_IP, IMAP_PORT)
             .login(RECIPIENT, PASSWORD)

http://git-wip-us.apache.org/repos/asf/james-project/blob/cf91dd4c/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/StripAttachmentTest.java
----------------------------------------------------------------------
diff --git 
a/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/StripAttachmentTest.java
 
b/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/StripAttachmentTest.java
index 9e35168..5ed44b3 100644
--- 
a/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/StripAttachmentTest.java
+++ 
b/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/StripAttachmentTest.java
@@ -122,8 +122,7 @@ public class StripAttachmentTest {
             .sendMessage(FakeMail.builder()
                 .mimeMessage(message)
                 .sender(FROM)
-                .recipient(RECIPIENT))
-            .awaitSent(awaitAtMostOneMinute);
+                .recipient(RECIPIENT));
 
         imapMessageReader.connect(LOCALHOST_IP, IMAP_PORT)
             .login(RECIPIENT, PASSWORD)

http://git-wip-us.apache.org/repos/asf/james-project/blob/cf91dd4c/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/ToRepositoryTest.java
----------------------------------------------------------------------
diff --git 
a/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/ToRepositoryTest.java
 
b/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/ToRepositoryTest.java
index 4a4edb5..ede133d 100644
--- 
a/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/ToRepositoryTest.java
+++ 
b/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/ToRepositoryTest.java
@@ -99,9 +99,7 @@ public class ToRepositoryTest {
     public void incomingShouldBeStoredInProcessorByDefault() throws Exception {
         messageSender.connect(LOCALHOST_IP, SMTP_PORT)
             .sendMessage(RECIPIENT, RECIPIENT)
-            .awaitSent(awaitAtMostOneMinute)
-            .sendMessage(RECIPIENT, RECIPIENT)
-            .awaitSent(awaitAtMostOneMinute);
+            .sendMessage(RECIPIENT, RECIPIENT);
 
         awaitAtMostOneMinute.until(() -> 
probe.getRepositoryMailCount(CUSTOM_REPOSITORY) == 2);
     }
@@ -110,9 +108,7 @@ public class ToRepositoryTest {
     public void userShouldBeAbleToAccessReprocessedMails() throws Exception {
         messageSender.connect(LOCALHOST_IP, SMTP_PORT)
             .sendMessage(RECIPIENT, RECIPIENT)
-            .awaitSent(awaitAtMostOneMinute)
-            .sendMessage(RECIPIENT, RECIPIENT)
-            .awaitSent(awaitAtMostOneMinute);
+            .sendMessage(RECIPIENT, RECIPIENT);
 
         awaitAtMostOneMinute.until(() -> 
probe.getRepositoryMailCount(CUSTOM_REPOSITORY) == 2);
 
@@ -138,9 +134,7 @@ public class ToRepositoryTest {
     public void userShouldBeAbleToAccessReprocessedMail() throws Exception {
         messageSender.connect(LOCALHOST_IP, SMTP_PORT)
             .sendMessage(RECIPIENT, RECIPIENT)
-            .awaitSent(awaitAtMostOneMinute)
-            .sendMessage(RECIPIENT, RECIPIENT)
-            .awaitSent(awaitAtMostOneMinute);
+            .sendMessage(RECIPIENT, RECIPIENT);
 
         awaitAtMostOneMinute.until(() -> 
probe.getRepositoryMailCount(CUSTOM_REPOSITORY) == 2);
         String key = probe.listMailKeys(CUSTOM_REPOSITORY).get(0);

http://git-wip-us.apache.org/repos/asf/james-project/blob/cf91dd4c/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/SetMessagesMethodTest.java
----------------------------------------------------------------------
diff --git 
a/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/SetMessagesMethodTest.java
 
b/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/SetMessagesMethodTest.java
index 0c2a08c..d484a10 100644
--- 
a/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/SetMessagesMethodTest.java
+++ 
b/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/SetMessagesMethodTest.java
@@ -117,7 +117,6 @@ import org.junit.Test;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Lists;
 import com.google.common.io.ByteStreams;
-import com.jayway.awaitility.Duration;
 import com.jayway.restassured.RestAssured;
 import com.jayway.restassured.builder.RequestSpecBuilder;
 import com.jayway.restassured.builder.ResponseSpecBuilder;
@@ -5390,7 +5389,6 @@ public abstract class SetMessagesMethodTest {
             .build();
         try (SMTPMessageSender messageSender = 
SMTPMessageSender.noAuthentication(LOCALHOST_IP, SMTP_PORT, DOMAIN)) {
             messageSender.sendMessage(mail);
-            
calmlyAwait.atMost(Duration.ONE_MINUTE).until(messageSender::messageHasBeenSent);
         }
 
         calmlyAwait.atMost(30, TimeUnit.SECONDS).until(() -> 
isAnyMessageFoundInInbox(accessToken));

http://git-wip-us.apache.org/repos/asf/james-project/blob/cf91dd4c/server/testing/src/main/java/org/apache/james/utils/SMTPMessageSender.java
----------------------------------------------------------------------
diff --git 
a/server/testing/src/main/java/org/apache/james/utils/SMTPMessageSender.java 
b/server/testing/src/main/java/org/apache/james/utils/SMTPMessageSender.java
index 723f4e1..8d132a9 100644
--- a/server/testing/src/main/java/org/apache/james/utils/SMTPMessageSender.java
+++ b/server/testing/src/main/java/org/apache/james/utils/SMTPMessageSender.java
@@ -38,7 +38,6 @@ import org.junit.rules.ExternalResource;
 
 import com.github.fge.lambdas.Throwing;
 import com.google.common.base.Throwables;
-import com.jayway.awaitility.core.ConditionFactory;
 
 public class SMTPMessageSender extends ExternalResource implements Closeable {
 
@@ -85,17 +84,17 @@ public class SMTPMessageSender extends ExternalResource 
implements Closeable {
 
     public SMTPMessageSender authenticate(String username, String password) 
throws IOException, NoSuchAlgorithmException, InvalidKeyException, 
InvalidKeySpecException {
         if (smtpClient.auth(AuthenticatingSMTPClient.AUTH_METHOD.PLAIN, 
username, password) == false) {
-            throw new RuntimeException("auth failed");
+            throw new SMTPSendingException(SmtpSendingStep.Authentication, 
smtpClient.getReplyString());
         }
         return this;
     }
 
     public SMTPMessageSender sendMessage(String from, String recipient) {
         try {
-            smtpClient.helo(senderDomain);
-            smtpClient.setSender(from);
-            smtpClient.rcpt("<" + recipient + ">");
-            smtpClient.sendShortMessageData("FROM: " + from + "\r\n" +
+            doHelo();
+            doSetSender(from);
+            doRCPT("<" + recipient + ">");
+            doData("FROM: " + from + "\r\n" +
                 "subject: test\r\n" +
                 "\r\n" +
                 "content\r\n" +
@@ -108,10 +107,10 @@ public class SMTPMessageSender extends ExternalResource 
implements Closeable {
 
     public SMTPMessageSender sendMessageNoBracket(String from, String 
recipient) {
         try {
-            smtpClient.helo(senderDomain);
-            smtpClient.setSender(from);
-            smtpClient.rcpt(recipient);
-            smtpClient.sendShortMessageData("FROM: " + from + "\r\n" +
+            doHelo();
+            doSetSender(from);
+            doRCPT(recipient);
+            doData("FROM: " + from + "\r\n" +
                 "subject: test\r\n" +
                 "\r\n" +
                 "content\r\n" +
@@ -124,10 +123,10 @@ public class SMTPMessageSender extends ExternalResource 
implements Closeable {
 
     public SMTPMessageSender sendMessageWithHeaders(String from, String 
recipient, String message) {
         try {
-            smtpClient.helo(senderDomain);
-            smtpClient.setSender(from);
-            smtpClient.rcpt("<" + recipient + ">");
-            smtpClient.sendShortMessageData(message);
+            doHelo();
+            doSetSender(from);
+            doRCPT("<" + recipient + ">");
+            doData(message);
         } catch (IOException e) {
             throw Throwables.propagate(e);
         }
@@ -137,37 +136,19 @@ public class SMTPMessageSender extends ExternalResource 
implements Closeable {
     public SMTPMessageSender sendMessage(Mail mail) throws MessagingException {
         try {
             String from = mail.getSender().asString();
-            smtpClient.helo(senderDomain);
-            smtpClient.setSender(from);
+            doHelo();
+            doSetSender(from);
             mail.getRecipients().stream()
                 .map(MailAddress::asString)
-                .forEach(Throwing.consumer(smtpClient::addRecipient));
-            smtpClient.sendShortMessageData(asString(mail.getMessage()));
+                .forEach(Throwing.consumer(this::doAddRcpt));
+            doData(asString(mail.getMessage()));
         } catch (IOException e) {
             throw Throwables.propagate(e);
         }
         return this;
     }
 
-    public SMTPMessageSender sendEnvelope(Mail mail) throws MessagingException 
{
-        try {
-            String from = mail.getSender().asString();
-            smtpClient.helo(senderDomain);
-            smtpClient.setSender(from);
-            mail.getRecipients().stream()
-                .map(MailAddress::asString)
-                .forEach(Throwing.consumer(smtpClient::addRecipient));
-        } catch (IOException e) {
-            throw Throwables.propagate(e);
-        }
-        return this;
-    }
-
-    public SMTPMessageSender sendEnvelope(FakeMail.Builder mail) throws 
MessagingException {
-        return sendEnvelope(mail.build());
-    }
-
-    public SMTPMessageSender sendMessage(FakeMail.Builder mail) throws 
MessagingException {
+    public SMTPMessageSender sendMessage(FakeMail.Builder mail) throws 
MessagingException, IOException {
         return sendMessage(mail.build());
     }
 
@@ -177,40 +158,43 @@ public class SMTPMessageSender extends ExternalResource 
implements Closeable {
         return new String(outputStream.toByteArray(), StandardCharsets.UTF_8);
     }
 
-    public boolean messageHasBeenSent() throws IOException {
-        return smtpClient.getReplyString()
-            .contains("250 2.6.0 Message received");
-    }
-
-    public SMTPMessageSender awaitSent(ConditionFactory conditionFactory) {
-        conditionFactory.until(this::messageHasBeenSent);
-        return this;
-    }
-
-    public void awaitSentFail(ConditionFactory conditionFactory) {
-        conditionFactory.until(this::messageSendingFailed);
+    @Override
+    public void close() throws IOException {
+        smtpClient.disconnect();
     }
 
-    public void awaitSentFail(String code, ConditionFactory conditionFactory) {
-        conditionFactory.until(() -> messageSendingFailedWithCode(code));
+    private void doSetSender(String from) throws IOException {
+        boolean success = smtpClient.setSender(from);
+        if (!success) {
+            throw new SMTPSendingException(SmtpSendingStep.Sender, 
smtpClient.getReplyString());
+        }
     }
 
-    public boolean messageSendingFailed() {
-        String replyString = smtpClient.getReplyString().trim();
-        return replyString.startsWith("4") || replyString.startsWith("5");
+    private void doHelo() throws IOException {
+        int code = smtpClient.helo(senderDomain);
+        if (code != 250) {
+            throw new SMTPSendingException(SmtpSendingStep.Helo, 
smtpClient.getReplyString());
+        }
     }
 
-    public boolean messageSendingFailedWithCode(String code) {
-        String replyString = smtpClient.getReplyString().trim();
-        return replyString.startsWith(code);
+    private void doRCPT(String recipient) throws IOException {
+        int code = smtpClient.rcpt(recipient);
+        if (code != 250) {
+            throw new SMTPSendingException(SmtpSendingStep.RCPT, 
smtpClient.getReplyString());
+        }
     }
 
-    public boolean messageHaveNotBeenSent() throws IOException {
-        return !messageHasBeenSent();
+    private void doData(String message) throws IOException {
+        boolean success = smtpClient.sendShortMessageData(message);
+        if (!success) {
+            throw new SMTPSendingException(SmtpSendingStep.Data, 
smtpClient.getReplyString());
+        }
     }
 
-    @Override
-    public void close() throws IOException {
-        smtpClient.disconnect();
+    private void doAddRcpt(String rcpt) throws IOException {
+        boolean success = smtpClient.addRecipient(rcpt);
+        if (!success) {
+            throw new SMTPSendingException(SmtpSendingStep.RCPT, 
smtpClient.getReplyString());
+        }
     }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/cf91dd4c/server/testing/src/main/java/org/apache/james/utils/SMTPSendingException.java
----------------------------------------------------------------------
diff --git 
a/server/testing/src/main/java/org/apache/james/utils/SMTPSendingException.java 
b/server/testing/src/main/java/org/apache/james/utils/SMTPSendingException.java
new file mode 100644
index 0000000..42be74e
--- /dev/null
+++ 
b/server/testing/src/main/java/org/apache/james/utils/SMTPSendingException.java
@@ -0,0 +1,73 @@
+/****************************************************************
+ * 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.utils;
+
+import java.util.List;
+import java.util.Objects;
+
+import com.google.common.base.Joiner;
+import com.google.common.base.Splitter;
+
+public class SMTPSendingException extends RuntimeException {
+
+    public static boolean isForStep(Throwable t, SmtpSendingStep step) {
+        if (t instanceof SMTPSendingException) {
+            SMTPSendingException e = (SMTPSendingException) t;
+            return e.sendingStep.equals(step);
+        }
+        return false;
+    }
+
+    private static String sanitizeString(String lastServerMessage) {
+        List<String> lines = Splitter.on("\r\n")
+            .trimResults()
+            .omitEmptyStrings()
+            .splitToList(lastServerMessage);
+
+        return Joiner.on("\n")
+            .skipNulls()
+            .join(lines);
+    }
+
+    private final SmtpSendingStep sendingStep;
+    private final String lastServerMessage;
+
+    public SMTPSendingException(SmtpSendingStep sendingStep, String 
lastServerMessage) {
+        super(String.format("Error upon step %s: %s", sendingStep, 
lastServerMessage));
+        this.sendingStep = sendingStep;
+        this.lastServerMessage = sanitizeString(lastServerMessage);
+    }
+
+    @Override
+    public final boolean equals(Object o) {
+        if (o instanceof SMTPSendingException) {
+            SMTPSendingException that = (SMTPSendingException) o;
+
+            return Objects.equals(this.sendingStep, that.sendingStep)
+                && Objects.equals(this.lastServerMessage, 
that.lastServerMessage);
+        }
+        return false;
+    }
+
+    @Override
+    public final int hashCode() {
+        return Objects.hash(sendingStep, lastServerMessage);
+    }
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/cf91dd4c/server/testing/src/main/java/org/apache/james/utils/SmtpSendingStep.java
----------------------------------------------------------------------
diff --git 
a/server/testing/src/main/java/org/apache/james/utils/SmtpSendingStep.java 
b/server/testing/src/main/java/org/apache/james/utils/SmtpSendingStep.java
new file mode 100644
index 0000000..51b9b8d
--- /dev/null
+++ b/server/testing/src/main/java/org/apache/james/utils/SmtpSendingStep.java
@@ -0,0 +1,28 @@
+/****************************************************************
+ * 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.utils;
+
+public enum SmtpSendingStep {
+    Authentication,
+    Helo,
+    RCPT,
+    Sender,
+    Data
+}


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

Reply via email to