You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by ro...@apache.org on 2017/01/10 14:18:53 UTC
[38/50] [abbrv] james-project git commit: JAMES-1877 Bounce on
invalid addresses before discarding them
JAMES-1877 Bounce on invalid addresses before discarding them
Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/96465710
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/96465710
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/96465710
Branch: refs/heads/master
Commit: 9646571062ae917dd678c4c15c90012a648c2ab8
Parents: 1c6d1d0
Author: Benoit Tellier <bt...@linagora.com>
Authored: Wed Dec 7 10:13:38 2016 +0700
Committer: Benoit Tellier <bt...@linagora.com>
Committed: Tue Jan 10 18:14:17 2017 +0700
----------------------------------------------------------------------
.../org/apache/mailet/base/test/FakeMail.java | 18 +++++++---
.../james/transport/mailets/RemoteDelivery.java | 38 ++++++++++----------
.../remoteDelivery/DeliveryRunnable.java | 6 ++--
.../mailets/remoteDelivery/MailDelivrer.java | 8 ++++-
.../remoteDelivery/MailDelivrerTest.java | 24 ++++++++++++-
.../remoteDelivery/RemoteDeliveryTest.java | 5 ++-
6 files changed, 67 insertions(+), 32 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/james-project/blob/96465710/mailet/base/src/test/java/org/apache/mailet/base/test/FakeMail.java
----------------------------------------------------------------------
diff --git a/mailet/base/src/test/java/org/apache/mailet/base/test/FakeMail.java b/mailet/base/src/test/java/org/apache/mailet/base/test/FakeMail.java
index 661882a..59a3b89 100644
--- a/mailet/base/src/test/java/org/apache/mailet/base/test/FakeMail.java
+++ b/mailet/base/src/test/java/org/apache/mailet/base/test/FakeMail.java
@@ -58,6 +58,19 @@ public class FakeMail implements Mail {
new ByteArrayInputStream(text.getBytes(javaEncodingCharset))))
.build();
}
+
+ public static FakeMail fromMail(Mail mail) throws MessagingException {
+ return new FakeMail(mail.getMessage(),
+ Lists.newArrayList(mail.getRecipients()),
+ mail.getName(),
+ mail.getSender(),
+ mail.getState(),
+ mail.getErrorMessage(),
+ mail.getLastUpdated(),
+ attributes(mail),
+ mail.getMessageSize(),
+ mail.getRemoteAddr());
+ }
public static Builder builder() {
return new Builder();
@@ -212,11 +225,6 @@ public class FakeMail implements Mail {
this.remoteAddr = remoteAddr;
}
- public FakeMail(Mail mail) throws MessagingException {
- this(mail.getMessage(), Lists.newArrayList(mail.getRecipients()), mail.getName(), mail.getSender(), mail.getState(), mail.getErrorMessage(),
- mail.getLastUpdated(), attributes(mail), mail.getMessageSize(), mail.getRemoteAddr());
- }
-
@Override
public String getName() {
return name;
http://git-wip-us.apache.org/repos/asf/james-project/blob/96465710/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/RemoteDelivery.java
----------------------------------------------------------------------
diff --git a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/RemoteDelivery.java b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/RemoteDelivery.java
index 8a40298..3a1f17d 100644
--- a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/RemoteDelivery.java
+++ b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/RemoteDelivery.java
@@ -23,7 +23,8 @@ import java.net.UnknownHostException;
import java.util.Collection;
import java.util.Locale;
import java.util.Map;
-import java.util.Vector;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
import javax.inject.Inject;
import javax.mail.MessagingException;
@@ -36,6 +37,7 @@ import org.apache.james.queue.api.MailPrioritySupport;
import org.apache.james.queue.api.MailQueue;
import org.apache.james.queue.api.MailQueue.MailQueueException;
import org.apache.james.queue.api.MailQueueFactory;
+import org.apache.james.transport.mailets.remoteDelivery.Bouncer;
import org.apache.james.transport.mailets.remoteDelivery.DeliveryRunnable;
import org.apache.james.transport.mailets.remoteDelivery.RemoteDeliveryConfiguration;
import org.apache.james.transport.mailets.remoteDelivery.RemoteDeliverySocketFactory;
@@ -119,34 +121,37 @@ import com.google.common.collect.HashMultimap;
*/
public class RemoteDelivery extends GenericMailet {
+ public enum THREAD_STATE {
+ START_THREADS,
+ DO_NOT_START_THREADS
+ }
+
private static final String OUTGOING_MAILS = "outgoingMails";
- private static final boolean DEFAULT_START_THREADS = true;
public static final String NAME_JUNCTION = "-to-";
private final DNSService dnsServer;
private final DomainList domainList;
private final MailQueueFactory queueFactory;
private final Metric outgoingMailsMetric;
- private final Collection<Thread> workersThreads;
private final VolatileIsDestroyed volatileIsDestroyed;
- private final boolean startThreads;
+ private final THREAD_STATE startThreads;
private MailQueue queue;
private Logger logger;
private RemoteDeliveryConfiguration configuration;
+ private ExecutorService executor;
@Inject
public RemoteDelivery(DNSService dnsServer, DomainList domainList, MailQueueFactory queueFactory, MetricFactory metricFactory) {
- this(dnsServer, domainList, queueFactory, metricFactory, DEFAULT_START_THREADS);
+ this(dnsServer, domainList, queueFactory, metricFactory, THREAD_STATE.START_THREADS);
}
- public RemoteDelivery(DNSService dnsServer, DomainList domainList, MailQueueFactory queueFactory, MetricFactory metricFactory, boolean startThreads) {
+ public RemoteDelivery(DNSService dnsServer, DomainList domainList, MailQueueFactory queueFactory, MetricFactory metricFactory, THREAD_STATE startThreads) {
this.dnsServer = dnsServer;
this.domainList = domainList;
this.queueFactory = queueFactory;
this.outgoingMailsMetric = metricFactory.generate(OUTGOING_MAILS);
this.volatileIsDestroyed = new VolatileIsDestroyed();
- this.workersThreads = new Vector<Thread>();
this.startThreads = startThreads;
}
@@ -160,25 +165,23 @@ public class RemoteDelivery extends GenericMailet {
} catch (UnknownHostException e) {
log("Invalid bind setting (" + configuration.getBindAddress() + "): " + e.toString());
}
- if (startThreads) {
+ if (startThreads == THREAD_STATE.START_THREADS) {
initDeliveryThreads();
}
}
private void initDeliveryThreads() {
+ executor = Executors.newFixedThreadPool(configuration.getWorkersThreadCount());
for (int a = 0; a < configuration.getWorkersThreadCount(); a++) {
- String threadName = "Remote delivery thread (" + a + ")";
- Thread t = new Thread(
+ executor.execute(
new DeliveryRunnable(queue,
configuration,
dnsServer,
outgoingMailsMetric,
logger,
getMailetContext(),
- volatileIsDestroyed),
- threadName);
- t.start();
- workersThreads.add(t);
+ new Bouncer(configuration, getMailetContext(), logger),
+ volatileIsDestroyed));
}
}
@@ -255,12 +258,9 @@ public class RemoteDelivery extends GenericMailet {
*/
@Override
public synchronized void destroy() {
- if (startThreads) {
+ if (startThreads == THREAD_STATE.START_THREADS) {
volatileIsDestroyed.markAsDestroyed();
- // Wake up all threads from waiting for an accept
- for (Thread t : workersThreads) {
- t.interrupt();
- }
+ executor.shutdown();
notifyAll();
}
}
http://git-wip-us.apache.org/repos/asf/james-project/blob/96465710/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/remoteDelivery/DeliveryRunnable.java
----------------------------------------------------------------------
diff --git a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/remoteDelivery/DeliveryRunnable.java b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/remoteDelivery/DeliveryRunnable.java
index bc01245..7af269b 100644
--- a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/remoteDelivery/DeliveryRunnable.java
+++ b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/remoteDelivery/DeliveryRunnable.java
@@ -54,9 +54,9 @@ public class DeliveryRunnable implements Runnable {
private final Supplier<Date> dateSupplier;
public DeliveryRunnable(MailQueue queue, RemoteDeliveryConfiguration configuration, DNSService dnsServer, Metric outgoingMailsMetric,
- Logger logger, MailetContext mailetContext, VolatileIsDestroyed volatileIsDestroyed) {
- this(queue, configuration, outgoingMailsMetric, logger, new Bouncer(configuration, mailetContext, logger),
- new MailDelivrer(configuration, new MailDelivrerToHost(configuration, mailetContext, logger), dnsServer, logger),
+ Logger logger, MailetContext mailetContext, Bouncer bouncer, VolatileIsDestroyed volatileIsDestroyed) {
+ this(queue, configuration, outgoingMailsMetric, logger, bouncer,
+ new MailDelivrer(configuration, new MailDelivrerToHost(configuration, mailetContext, logger), dnsServer, bouncer, logger),
volatileIsDestroyed, CURRENT_DATE_SUPPLIER);
}
http://git-wip-us.apache.org/repos/asf/james-project/blob/96465710/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/remoteDelivery/MailDelivrer.java
----------------------------------------------------------------------
diff --git a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/remoteDelivery/MailDelivrer.java b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/remoteDelivery/MailDelivrer.java
index c89a2a0..bb03b62 100644
--- a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/remoteDelivery/MailDelivrer.java
+++ b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/remoteDelivery/MailDelivrer.java
@@ -45,11 +45,13 @@ public class MailDelivrer {
private final MailDelivrerToHost mailDelivrerToHost;
private final DnsHelper dnsHelper;
private final MessageComposer messageComposer;
+ private final Bouncer bouncer;
private final Logger logger;
- public MailDelivrer(RemoteDeliveryConfiguration configuration, MailDelivrerToHost mailDelivrerToHost, DNSService dnsServer, Logger logger) {
+ public MailDelivrer(RemoteDeliveryConfiguration configuration, MailDelivrerToHost mailDelivrerToHost, DNSService dnsServer, Bouncer bouncer, Logger logger) {
this.configuration = configuration;
this.mailDelivrerToHost = mailDelivrerToHost;
+ this.bouncer = bouncer;
this.dnsHelper = new DnsHelper(dnsServer, configuration, logger);
this.messageComposer = new MessageComposer(configuration);
this.logger = logger;
@@ -191,6 +193,10 @@ public class MailDelivrer {
}
}
if (!validUnsentAddresses.isEmpty()) {
+ if (!invalidAddresses.isEmpty()) {
+ mail.setRecipients(invalidAddresses);
+ bouncer.bounce(mail, sfe);
+ }
mail.setRecipients(validUnsentAddresses);
if (enhancedMessagingException.hasReturnCode()) {
boolean isPermanent = enhancedMessagingException.isServerError();
http://git-wip-us.apache.org/repos/asf/james-project/blob/96465710/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/remoteDelivery/MailDelivrerTest.java
----------------------------------------------------------------------
diff --git a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/remoteDelivery/MailDelivrerTest.java b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/remoteDelivery/MailDelivrerTest.java
index 9c5fe69..c96e9a1 100644
--- a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/remoteDelivery/MailDelivrerTest.java
+++ b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/remoteDelivery/MailDelivrerTest.java
@@ -21,6 +21,8 @@ package org.apache.james.transport.mailets.remoteDelivery;
import static org.mockito.Mockito.mock;
import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
import javax.mail.Address;
import javax.mail.SendFailedException;
@@ -42,10 +44,12 @@ public class MailDelivrerTest {
private static final Logger LOGGER = LoggerFactory.getLogger(MailDelivrerTest.class);
private MailDelivrer testee;
+ private Bouncer bouncer;
@Before
public void setUp() {
- testee = new MailDelivrer(mock(RemoteDeliveryConfiguration.class), mock(MailDelivrerToHost.class), mock(DNSService.class), LOGGER);
+ bouncer = mock(Bouncer.class);
+ testee = new MailDelivrer(mock(RemoteDeliveryConfiguration.class), mock(MailDelivrerToHost.class), mock(DNSService.class), bouncer, LOGGER);
}
@Test
@@ -180,4 +184,22 @@ public class MailDelivrerTest {
assertThat(mail.getRecipients()).containsOnly(MailAddressFixture.OTHER_AT_JAMES);
}
+
+ @Test
+ public void handleSenderFailedExceptionShouldBounceInvalidAddressesOnBothInvalidAndValidUnsent() throws Exception {
+ Mail mail = FakeMail.builder().recipients(MailAddressFixture.ANY_AT_JAMES, MailAddressFixture.OTHER_AT_JAMES).build();
+
+ Address[] validSent = {};
+ Address[] validUnsent = {new InternetAddress(MailAddressFixture.OTHER_AT_JAMES.asString())};
+ Address[] invalid = {new InternetAddress(MailAddressFixture.ANY_AT_JAMES.asString())};
+ SendFailedException sfe = new SendFailedException("Message",
+ new Exception(),
+ validSent,
+ validUnsent,
+ invalid);
+ testee.handleSenderFailedException(mail, sfe);
+
+ verify(bouncer).bounce(mail, sfe);
+ verifyNoMoreInteractions(bouncer);
+ }
}
http://git-wip-us.apache.org/repos/asf/james-project/blob/96465710/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/remoteDelivery/RemoteDeliveryTest.java
----------------------------------------------------------------------
diff --git a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/remoteDelivery/RemoteDeliveryTest.java b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/remoteDelivery/RemoteDeliveryTest.java
index 2012a2e..6e944e3 100644
--- a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/remoteDelivery/RemoteDeliveryTest.java
+++ b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/remoteDelivery/RemoteDeliveryTest.java
@@ -66,7 +66,7 @@ public class RemoteDeliveryTest {
@Override
public void enQueue(Mail mail) throws MailQueueException {
try {
- enqueuedMail.add(new FakeMail(mail));
+ enqueuedMail.add(FakeMail.fromMail(mail));
} catch (MessagingException e) {
throw Throwables.propagate(e);
}
@@ -82,7 +82,6 @@ public class RemoteDeliveryTest {
}
}
- public static final boolean DONT_START_THREADS = false;
private RemoteDelivery remoteDelivery;
private FakeMailQueue mailQueue;
@@ -91,7 +90,7 @@ public class RemoteDeliveryTest {
MailQueueFactory queueFactory = mock(MailQueueFactory.class);
mailQueue = new FakeMailQueue();
when(queueFactory.getQueue(RemoteDeliveryConfiguration.OUTGOING)).thenReturn(mailQueue);
- remoteDelivery = new RemoteDelivery(mock(DNSService.class), mock(DomainList.class), queueFactory, mock(MetricFactory.class), DONT_START_THREADS);
+ remoteDelivery = new RemoteDelivery(mock(DNSService.class), mock(DomainList.class), queueFactory, mock(MetricFactory.class), RemoteDelivery.THREAD_STATE.DO_NOT_START_THREADS);
}
@Test
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org