JAMES-2557 Solve generic mail sending with a duplicate method We need a generic way to duplicate an email. This allows then to mutate the duplicated and sends arbitrary emails from the generic mailet context.
This is compulsory to allow UseRecipientHeaders to work when no sender is specified, which is not handled with other APIs. Project: http://git-wip-us.apache.org/repos/asf/james-project/repo Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/4caac5f1 Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/4caac5f1 Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/4caac5f1 Branch: refs/heads/master Commit: 4caac5f104f59a80b2a884e3f7effa46ee7190a0 Parents: dbb6074 Author: Benoit Tellier <[email protected]> Authored: Fri Oct 19 11:13:25 2018 +0700 Committer: Benoit Tellier <[email protected]> Committed: Tue Oct 30 09:39:30 2018 +0700 ---------------------------------------------------------------------- .../src/main/java/org/apache/mailet/Mail.java | 6 +++ .../transport/mailets/UseHeaderRecipients.java | 2 +- .../org/apache/mailet/base/test/FakeMail.java | 53 ++++++++++++++++++-- .../org/apache/james/server/core/MailImpl.java | 5 ++ 4 files changed, 60 insertions(+), 6 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/james-project/blob/4caac5f1/mailet/api/src/main/java/org/apache/mailet/Mail.java ---------------------------------------------------------------------- diff --git a/mailet/api/src/main/java/org/apache/mailet/Mail.java b/mailet/api/src/main/java/org/apache/mailet/Mail.java index 4b98f30..c1bccd0 100644 --- a/mailet/api/src/main/java/org/apache/mailet/Mail.java +++ b/mailet/api/src/main/java/org/apache/mailet/Mail.java @@ -157,6 +157,12 @@ public interface Mail extends Serializable, Cloneable { default boolean hasSender() { return !getMaybeSender().isNullSender(); } + + /** + * @since Mailet API v3.2.0 + * @return A copy of this email. Implementation can affect a variation of the initial mail name property. + */ + Mail duplicate() throws MessagingException; /** * Returns the current state of the message, such as GHOST, ERROR or DEFAULT. http://git-wip-us.apache.org/repos/asf/james-project/blob/4caac5f1/mailet/standard/src/main/java/org/apache/james/transport/mailets/UseHeaderRecipients.java ---------------------------------------------------------------------- diff --git a/mailet/standard/src/main/java/org/apache/james/transport/mailets/UseHeaderRecipients.java b/mailet/standard/src/main/java/org/apache/james/transport/mailets/UseHeaderRecipients.java index 85c6887..82a469d 100644 --- a/mailet/standard/src/main/java/org/apache/james/transport/mailets/UseHeaderRecipients.java +++ b/mailet/standard/src/main/java/org/apache/james/transport/mailets/UseHeaderRecipients.java @@ -106,7 +106,7 @@ public class UseHeaderRecipients extends GenericMailet { } // Return email to the "root" process. - getMailetContext().sendMail(mail.getSender(), mail.getRecipients(), mail.getMessage()); + getMailetContext().sendMail(mail.duplicate()); mail.setState(Mail.GHOST); } http://git-wip-us.apache.org/repos/asf/james-project/blob/4caac5f1/mailet/test/src/main/java/org/apache/mailet/base/test/FakeMail.java ---------------------------------------------------------------------- diff --git a/mailet/test/src/main/java/org/apache/mailet/base/test/FakeMail.java b/mailet/test/src/main/java/org/apache/mailet/base/test/FakeMail.java index 43281a8..02cb868 100644 --- a/mailet/test/src/main/java/org/apache/mailet/base/test/FakeMail.java +++ b/mailet/test/src/main/java/org/apache/mailet/base/test/FakeMail.java @@ -37,6 +37,7 @@ import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; import org.apache.james.core.MailAddress; +import org.apache.james.core.MaybeSender; import org.apache.james.core.builder.MimeMessageBuilder; import org.apache.james.util.MimeMessageUtil; import org.apache.mailet.Mail; @@ -171,13 +172,23 @@ public class FakeMail implements Mail, Serializable { public Builder name(String name) { Preconditions.checkNotNull(name, "'name' can not be null"); - this.name = Optional.of(name); + name(Optional.of(name)); + return this; + } + + public Builder name(Optional<String> name) { + this.name = name; return this; } public Builder sender(MailAddress sender) { Preconditions.checkNotNull(sender, "'sender' can not be null"); - this.sender = Optional.of(sender); + sender(MaybeSender.of(sender)); + return this; + } + + public Builder sender(MaybeSender sender) { + this.sender = sender.asOptional(); return this; } @@ -187,19 +198,34 @@ public class FakeMail implements Mail, Serializable { public Builder state(String state) { Preconditions.checkNotNull(state, "'state' can not be null"); - this.state = Optional.of(state); + state(Optional.of(state)); + return this; + } + + public Builder state(Optional<String> state) { + this.state = state; return this; } public Builder errorMessage(String errorMessage) { Preconditions.checkNotNull(errorMessage, "'errorMessage' can not be null"); - this.errorMessage = Optional.of(errorMessage); + errorMessage(Optional.of(errorMessage)); + return this; + } + + public Builder errorMessage(Optional<String> errorMessage) { + this.errorMessage = errorMessage; return this; } public Builder lastUpdated(Date lastUpdated) { Preconditions.checkNotNull(lastUpdated, "'lastUpdated' can not be null"); - this.lastUpdated = Optional.of(lastUpdated); + lastUpdated(Optional.of(lastUpdated)); + return this; + } + + public Builder lastUpdated(Optional<Date> lastUpdated) { + this.lastUpdated = lastUpdated; return this; } @@ -284,6 +310,23 @@ public class FakeMail implements Mail, Serializable { } @Override + public Mail duplicate() throws MessagingException { + return builder() + .mimeMessage(msg) + .recipients(ImmutableList.copyOf(recipients)) + .name(Optional.ofNullable(name)) + .sender(MaybeSender.of(sender)) + .state(Optional.ofNullable(state)) + .errorMessage(Optional.ofNullable(errorMessage)) + .lastUpdated(Optional.ofNullable(lastUpdated)) + .attributes(attributes) + .size(size) + .remoteAddr(remoteAddr) + .remoteHost(remoteHost) + .build(); + } + + @Override public String getName() { return name; } http://git-wip-us.apache.org/repos/asf/james-project/blob/4caac5f1/server/container/core/src/main/java/org/apache/james/server/core/MailImpl.java ---------------------------------------------------------------------- diff --git a/server/container/core/src/main/java/org/apache/james/server/core/MailImpl.java b/server/container/core/src/main/java/org/apache/james/server/core/MailImpl.java index ae9c853..cd0fc57 100644 --- a/server/container/core/src/main/java/org/apache/james/server/core/MailImpl.java +++ b/server/container/core/src/main/java/org/apache/james/server/core/MailImpl.java @@ -797,4 +797,9 @@ public class MailImpl implements Disposable, Mail { public void addAllSpecificHeaderForRecipient(PerRecipientHeaders perRecipientHeaders) { perRecipientSpecificHeaders.addAll(perRecipientHeaders); } + + @Override + public Mail duplicate() throws MessagingException { + return MailImpl.duplicate(this); + } } --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
