You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@james.apache.org by bt...@apache.org on 2021/02/23 03:45:15 UTC
[james-project] 02/14: JAMES-3431 DSNBounce should position
Arrival-Date header
This is an automated email from the ASF dual-hosted git repository.
btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git
commit 75f4b0b79d8a45e11d75853bed191e50d22c5d2a
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Wed Feb 17 11:53:33 2021 +0700
JAMES-3431 DSNBounce should position Arrival-Date header
---
.../apache/james/transport/mailets/DSNBounce.java | 11 +++++
.../james/transport/mailets/DSNBounceTest.java | 47 ++++++++++++++++++++++
.../james/smtpserver/dsn/DSNMessageHook.java | 5 +++
3 files changed, 63 insertions(+)
diff --git a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/DSNBounce.java b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/DSNBounce.java
index 271b0c8..b37e206 100755
--- a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/DSNBounce.java
+++ b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/DSNBounce.java
@@ -64,7 +64,10 @@ import org.apache.james.transport.util.ReplyToUtils;
import org.apache.james.transport.util.SenderUtils;
import org.apache.james.transport.util.SpecialAddressesUtils;
import org.apache.james.transport.util.TosUtils;
+import org.apache.mailet.Attribute;
+import org.apache.mailet.AttributeName;
import org.apache.mailet.AttributeUtils;
+import org.apache.mailet.AttributeValue;
import org.apache.mailet.DsnParameters;
import org.apache.mailet.Mail;
import org.apache.mailet.base.DateFormats;
@@ -470,6 +473,14 @@ public class DSNBounce extends GenericMailet implements RedirectNotify {
.ifPresent(envId -> buffer.append("Original-Envelope-Id: ")
.append(envId.asString())
.append(LINE_BREAK));
+ originalMail.getAttribute(AttributeName.of("dsn-arrival-date"))
+ .map(Attribute::getValue)
+ .map(AttributeValue::value)
+ .filter(ZonedDateTime.class::isInstance)
+ .map(ZonedDateTime.class::cast)
+ .ifPresent(arrivalDate -> buffer.append("Arrival-Date: ")
+ .append(arrivalDate.format(dateFormatter))
+ .append(LINE_BREAK));
for (MailAddress rec : originalMail.getRecipients()) {
appendRecipient(buffer, rec, getDeliveryError(originalMail), originalMail.getLastUpdated());
diff --git a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/DSNBounceTest.java b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/DSNBounceTest.java
index c06f0ba..a2936bf 100644
--- a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/DSNBounceTest.java
+++ b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/DSNBounceTest.java
@@ -29,6 +29,7 @@ import java.net.InetAddress;
import java.nio.charset.StandardCharsets;
import java.time.Instant;
import java.time.ZoneId;
+import java.time.ZonedDateTime;
import java.util.Date;
import java.util.List;
@@ -45,6 +46,8 @@ import org.apache.james.dnsservice.api.DNSService;
import org.apache.james.transport.mailets.redirect.SpecialAddress;
import org.apache.james.util.MimeMessageUtil;
import org.apache.mailet.Attribute;
+import org.apache.mailet.AttributeName;
+import org.apache.mailet.AttributeValue;
import org.apache.mailet.DsnParameters;
import org.apache.mailet.Mail;
import org.apache.mailet.base.DateFormats;
@@ -1277,6 +1280,50 @@ public class DSNBounceTest {
}
@Test
+ void arrivalDateShouldBePositioned() throws Exception {
+ FakeMailetConfig mailetConfig = FakeMailetConfig.builder()
+ .mailetName(MAILET_NAME)
+ .mailetContext(fakeMailContext)
+ .build();
+ dsnBounce.init(mailetConfig);
+
+ MailAddress senderMailAddress = new MailAddress("sender@domain.com");
+ FakeMail mail = FakeMail.builder()
+ .name(MAILET_NAME)
+ .sender(senderMailAddress)
+ .attribute(DELIVERY_ERROR_ATTRIBUTE)
+ .attribute(new Attribute(AttributeName.of("dsn-arrival-date"), AttributeValue.of(ZonedDateTime.parse("2015-10-30T16:12:00Z"))))
+ .mimeMessage(MimeMessageBuilder.mimeMessageBuilder()
+ .setText("My content"))
+ .recipient("recipient@domain.com")
+ .lastUpdated(Date.from(Instant.parse("2016-09-08T14:25:52.000Z")))
+ .remoteAddr("remoteHost")
+ .build();
+ mail.setDsnParameters(DsnParameters.builder().envId(DsnParameters.EnvId.of("xyz")).build().get());
+
+ dsnBounce.service(mail);
+
+ String expectedContent = "Reporting-MTA: dns; myhost\n" +
+ "Received-From-MTA: dns; 111.222.333.444\n" +
+ "Original-Envelope-Id: xyz\n" +
+ "Arrival-Date: Fri, 30 Oct 2015 16:12:00 XXXXX (UTC)\n" +
+ "\n" +
+ "Final-Recipient: rfc822; recipient@domain.com\n" +
+ "Action: failed\n" +
+ "Status: Delivery error\n" +
+ "Diagnostic-Code: X-James; Delivery error\n" +
+ "Last-Attempt-Date: Thu, 8 Sep 2016 14:25:52 XXXXX (UTC)\n";
+
+ List<SentMail> sentMails = fakeMailContext.getSentMails();
+ assertThat(sentMails).hasSize(1);
+ SentMail sentMail = sentMails.get(0);
+ MimeMessage sentMessage = sentMail.getMsg();
+ MimeMultipart content = (MimeMultipart) sentMessage.getContent();
+ SharedByteArrayInputStream actualContent = (SharedByteArrayInputStream) content.getBodyPart(1).getContent();
+ assertThat(IOUtils.toString(actualContent, StandardCharsets.UTF_8)).isEqualTo(expectedContent);
+ }
+
+ @Test
void defaultStatusShouldBeUsedWhenNone() throws Exception {
FakeMailetConfig mailetConfig = FakeMailetConfig.builder()
.mailetName(MAILET_NAME)
diff --git a/server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/dsn/DSNMessageHook.java b/server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/dsn/DSNMessageHook.java
index b9060a3..db3b266 100644
--- a/server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/dsn/DSNMessageHook.java
+++ b/server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/dsn/DSNMessageHook.java
@@ -23,6 +23,7 @@ import static org.apache.james.smtpserver.dsn.DSNMailParameterHook.DSN_ENVID;
import static org.apache.james.smtpserver.dsn.DSNMailParameterHook.DSN_RET;
import static org.apache.james.smtpserver.dsn.DSNRcptParameterHook.DSN_RCPT_PARAMETERS;
+import java.time.ZonedDateTime;
import java.util.Optional;
import org.apache.james.core.MailAddress;
@@ -30,6 +31,9 @@ import org.apache.james.protocols.api.ProtocolSession;
import org.apache.james.protocols.smtp.SMTPSession;
import org.apache.james.protocols.smtp.hook.HookResult;
import org.apache.james.smtpserver.JamesMessageHook;
+import org.apache.mailet.Attribute;
+import org.apache.mailet.AttributeName;
+import org.apache.mailet.AttributeValue;
import org.apache.mailet.DsnParameters;
import org.apache.mailet.Mail;
@@ -47,6 +51,7 @@ public class DSNMessageHook implements JamesMessageHook {
DsnParameters.of(envId, ret, rcptParameters)
.ifPresent(mail::setDsnParameters);
+ mail.setAttribute(new Attribute(AttributeName.of("dsn-arrival-date"), AttributeValue.of(ZonedDateTime.now())));
return HookResult.DECLINED;
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@james.apache.org
For additional commands, e-mail: notifications-help@james.apache.org