http://git-wip-us.apache.org/repos/asf/james-project/blob/8ce35148/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/jsieve/SieveMailAdapter.java
----------------------------------------------------------------------
diff --git 
a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/jsieve/SieveMailAdapter.java
 
b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/jsieve/SieveMailAdapter.java
index ed0feba..fa6d851 100644
--- 
a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/jsieve/SieveMailAdapter.java
+++ 
b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/jsieve/SieveMailAdapter.java
@@ -260,8 +260,7 @@ public class SieveMailAdapter implements MailAdapter, 
EnvelopeAccessors, ActionC
      * @return String
      */
     public String getEnvelopeFrom() {
-        MailAddress sender = getMail().getSender(); 
-        return (null == sender ? "" : sender.toString());
+        return getMail().getMaybeSender().asString("");
     }
     
     /**

http://git-wip-us.apache.org/repos/asf/james-project/blob/8ce35148/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/jsieve/VacationReply.java
----------------------------------------------------------------------
diff --git 
a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/jsieve/VacationReply.java
 
b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/jsieve/VacationReply.java
index 516aeb2..bbff1be 100644
--- 
a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/jsieve/VacationReply.java
+++ 
b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/jsieve/VacationReply.java
@@ -38,7 +38,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import com.google.common.base.Preconditions;
-import com.google.common.collect.Lists;
+import com.google.common.collect.ImmutableList;
 
 public class VacationReply {
     private static final Logger LOGGER = 
LoggerFactory.getLogger(VacationReply.class);
@@ -53,6 +53,8 @@ public class VacationReply {
         private String subject;
 
         public Builder(Mail originalMail, ActionContext context) {
+            Preconditions.checkArgument(originalMail.hasSender());
+
             this.originalMail = originalMail;
             this.context = context;
         }
@@ -85,7 +87,7 @@ public class VacationReply {
             reply.setSubject(generateNotificationSubject());
             reply.setContent(generateNotificationContent());
 
-            return new VacationReply(retrieveOriginalSender(), 
Lists.newArrayList(originalMail.getSender()), reply);
+            return new VacationReply(retrieveOriginalSender(), 
ImmutableList.of(originalMail.getMaybeSender().get()), reply);
         }
 
         private boolean eitherReasonOrMime() {
@@ -126,18 +128,18 @@ public class VacationReply {
             return multipart;
         }
 
-        private MailAddress retrieveOriginalSender() throws AddressException {
+        private MailAddress retrieveOriginalSender() {
             return Optional.ofNullable(from)
-                .map(address -> retrieveAddressFromString(address, context))
+                .flatMap(this::retrieveAddressFromString)
                 .orElse(context.getRecipient());
         }
 
-        private MailAddress retrieveAddressFromString(String address, 
ActionContext context) {
+        private Optional<MailAddress> retrieveAddressFromString(String 
address) {
             try {
-                return new MailAddress(address);
+                return Optional.of(new MailAddress(address));
             } catch (AddressException e) {
                 LOGGER.warn("Mail address {} was not well formatted : {}", 
address, e.getLocalizedMessage());
-                return null;
+                return Optional.empty();
             }
         }
     }

http://git-wip-us.apache.org/repos/asf/james-project/blob/8ce35148/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/managesieve/ManageSieveMailet.java
----------------------------------------------------------------------
diff --git 
a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/managesieve/ManageSieveMailet.java
 
b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/managesieve/ManageSieveMailet.java
index ba2f23f..6fb60b7 100644
--- 
a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/managesieve/ManageSieveMailet.java
+++ 
b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/managesieve/ManageSieveMailet.java
@@ -45,7 +45,6 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import com.google.common.annotations.VisibleForTesting;
-import com.google.common.collect.Lists;
 
 /**
  * <code>ManageSieveMailet</code> interprets mail from a local sender as
@@ -122,11 +121,11 @@ public class ManageSieveMailet extends GenericMailet 
implements MessageToCoreToM
     @Override
     public void service(Mail mail) throws MessagingException {
         // Sanity checks
-        if (mail.getSender() == null || mail.getSender().isNullSender()) {
+        if (!mail.hasSender()) {
             LOGGER.error("Sender is null");
             return;
         }
-        if (!getMailetContext().isLocalServer(mail.getSender().getDomain())) {
+        if 
(!getMailetContext().isLocalServer(mail.getMaybeSender().get().getDomain())) {
             LOGGER.error("Sender not local");
             return;
         }
@@ -138,8 +137,11 @@ public class ManageSieveMailet extends GenericMailet 
implements MessageToCoreToM
         } else {
             session.setState(Session.State.UNAUTHENTICATED);
         }
-        session.setUser(mail.getSender().asString());
-        getMailetContext().sendMail(mail.getRecipients().iterator().next(), 
Lists.newArrayList(mail.getSender()),transcoder.execute(session, 
mail.getMessage()));
+        session.setUser(mail.getMaybeSender().get().asString());
+        getMailetContext().sendMail(
+            mail.getRecipients().iterator().next(),
+            mail.getMaybeSender().asList(),
+            transcoder.execute(session, mail.getMessage()));
         mail.setState(Mail.GHOST);
         
         // And tidy up

http://git-wip-us.apache.org/repos/asf/james-project/blob/8ce35148/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/redirect/NotifyMailetsMessage.java
----------------------------------------------------------------------
diff --git 
a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/redirect/NotifyMailetsMessage.java
 
b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/redirect/NotifyMailetsMessage.java
index 1a7e1ee..a6b2192 100644
--- 
a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/redirect/NotifyMailetsMessage.java
+++ 
b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/redirect/NotifyMailetsMessage.java
@@ -69,7 +69,7 @@ public class NotifyMailetsMessage {
             builder.append("  Sent date: " + message.getSentDate())
                 .append(LINE_BREAK);
         }
-        builder.append("  MAIL FROM: " + originalMail.getSender())
+        builder.append("  MAIL FROM: " + 
originalMail.getMaybeSender().asString())
             .append(LINE_BREAK);
 
         boolean firstRecipient = true;

http://git-wip-us.apache.org/repos/asf/james-project/blob/8ce35148/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/redirect/ProcessRedirectNotify.java
----------------------------------------------------------------------
diff --git 
a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/redirect/ProcessRedirectNotify.java
 
b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/redirect/ProcessRedirectNotify.java
index c66881f..145b68e 100644
--- 
a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/redirect/ProcessRedirectNotify.java
+++ 
b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/redirect/ProcessRedirectNotify.java
@@ -58,7 +58,7 @@ public class ProcessRedirectNotify {
 
             if (mailet.getInitParameters().isDebug()) {
                 LOGGER.debug("New mail - sender: {}, recipients: {}, name: {}, 
remoteHost: {}, remoteAddr: {}, state: {}, lastUpdated: {}, errorMessage: {}",
-                        newMail.getSender(), newMail.getRecipients(), 
newMail.getName(), newMail.getRemoteHost(), newMail.getRemoteAddr(), 
newMail.getState(), newMail.getLastUpdated(), newMail.getErrorMessage());
+                        newMail.getMaybeSender(), newMail.getRecipients(), 
newMail.getName(), newMail.getRemoteHost(), newMail.getRemoteAddr(), 
newMail.getState(), newMail.getLastUpdated(), newMail.getErrorMessage());
             }
 
             // Create the message
@@ -92,7 +92,7 @@ public class ProcessRedirectNotify {
                 }
             } else {
                 throw new MessagingException(mailet.getMailetName() + " mailet 
cannot forward " + originalMail.getName() + ". " +
-                        "Invalid sender domain for " + newMail.getSender() + 
". " +
+                        "Invalid sender domain for " + 
newMail.getMaybeSender().asString() + ". " +
                         "Consider using the Resend mailet " + "using a 
different sender.");
             }
 
@@ -177,9 +177,9 @@ public class ProcessRedirectNotify {
     @SuppressWarnings("deprecation")
     private boolean senderDomainIsValid(Mail mail) throws MessagingException {
         return !mailet.getInitParameters().getFakeDomainCheck()
-                || mail.getSender() == null
+                || !mail.hasSender()
                 || !mailet.getMailetContext()
-            .getMailServers(mail.getSender()
+            .getMailServers(mail.getMaybeSender().get()
                 .getDomain())
             .isEmpty();
     }

http://git-wip-us.apache.org/repos/asf/james-project/blob/8ce35148/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/remote/delivery/Bouncer.java
----------------------------------------------------------------------
diff --git 
a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/remote/delivery/Bouncer.java
 
b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/remote/delivery/Bouncer.java
index 0cff3cb..43cfce3 100644
--- 
a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/remote/delivery/Bouncer.java
+++ 
b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/remote/delivery/Bouncer.java
@@ -47,7 +47,7 @@ public class Bouncer {
     }
 
     public void bounce(Mail mail, Exception ex) {
-        if (mail.getSender() == null) {
+        if (!mail.hasSender()) {
             LOGGER.debug("Null Sender: no bounce will be generated for {}", 
mail.getName());
         } else {
             if (configuration.getBounceProcessor() != null) {

http://git-wip-us.apache.org/repos/asf/james-project/blob/8ce35148/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/remote/delivery/MailDelivrer.java
----------------------------------------------------------------------
diff --git 
a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/remote/delivery/MailDelivrer.java
 
b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/remote/delivery/MailDelivrer.java
index 2999338..64ca447 100644
--- 
a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/remote/delivery/MailDelivrer.java
+++ 
b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/remote/delivery/MailDelivrer.java
@@ -91,7 +91,7 @@ public class MailDelivrer {
     private ExecutionResult tryDeliver(Mail mail) throws MessagingException {
         if (mail.getRecipients().isEmpty()) {
             LOGGER.info("No recipients specified... not sure how this could 
have happened.");
-            return ExecutionResult.permanentFailure(new Exception("No 
recipients specified for " + mail.getName() + " sent by " + mail.getSender()));
+            return ExecutionResult.permanentFailure(new Exception("No 
recipients specified for " + mail.getName() + " sent by " + 
mail.getMaybeSender().asString()));
         }
         if (configuration.isDebug()) {
             LOGGER.debug("Attempting to deliver {}", mail.getName());

http://git-wip-us.apache.org/repos/asf/james-project/blob/8ce35148/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/remote/delivery/MailDelivrerToHost.java
----------------------------------------------------------------------
diff --git 
a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/remote/delivery/MailDelivrerToHost.java
 
b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/remote/delivery/MailDelivrerToHost.java
index 5be0f62..d8a3b91 100644
--- 
a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/remote/delivery/MailDelivrerToHost.java
+++ 
b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/remote/delivery/MailDelivrerToHost.java
@@ -77,12 +77,7 @@ public class MailDelivrerToHost {
 
     private Properties getPropertiesForMail(Mail mail) {
         Properties props = session.getProperties();
-        if (mail.getSender() == null) {
-            props.put("mail.smtp.from", "<>");
-        } else {
-            String sender = mail.getSender().toString();
-            props.put("mail.smtp.from", sender);
-        }
+        props.put("mail.smtp.from", mail.getMaybeSender().asString());
         return props;
     }
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/8ce35148/server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/AbstractSQLWhitelistMatcher.java
----------------------------------------------------------------------
diff --git 
a/server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/AbstractSQLWhitelistMatcher.java
 
b/server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/AbstractSQLWhitelistMatcher.java
index c35812d..6186d11 100644
--- 
a/server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/AbstractSQLWhitelistMatcher.java
+++ 
b/server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/AbstractSQLWhitelistMatcher.java
@@ -135,10 +135,10 @@ public abstract class AbstractSQLWhitelistMatcher extends 
GenericMatcher {
     @Override
     public Collection<MailAddress> match(Mail mail) throws MessagingException {
         // check if it's a local sender
-        MailAddress senderMailAddress = mail.getSender();
-        if (senderMailAddress == null) {
+        if (!mail.hasSender()) {
             return null;
         }
+        MailAddress senderMailAddress = mail.getMaybeSender().get();
         if (getMailetContext().isLocalEmail(senderMailAddress)) {
             // is a local sender, so return
             return null;

http://git-wip-us.apache.org/repos/asf/james-project/blob/8ce35148/server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/IsInWhiteList.java
----------------------------------------------------------------------
diff --git 
a/server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/IsInWhiteList.java
 
b/server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/IsInWhiteList.java
index ba2f413..59c7cc3 100644
--- 
a/server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/IsInWhiteList.java
+++ 
b/server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/IsInWhiteList.java
@@ -79,7 +79,10 @@ public class IsInWhiteList extends 
AbstractSQLWhitelistMatcher {
 
     @Override
     protected boolean matchedWhitelist(MailAddress recipientMailAddress, Mail 
mail) throws MessagingException {
-        MailAddress senderMailAddress = mail.getSender();
+        if (!mail.hasSender()) {
+            return true;
+        }
+        MailAddress senderMailAddress = mail.getMaybeSender().get();
         String senderUser = 
senderMailAddress.getLocalPart().toLowerCase(Locale.US);
         Domain senderHost = senderMailAddress.getDomain();
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/8ce35148/server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/IsSenderInRRTLoop.java
----------------------------------------------------------------------
diff --git 
a/server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/IsSenderInRRTLoop.java
 
b/server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/IsSenderInRRTLoop.java
index 1366b30..e368104 100644
--- 
a/server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/IsSenderInRRTLoop.java
+++ 
b/server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/IsSenderInRRTLoop.java
@@ -56,7 +56,9 @@ public class IsSenderInRRTLoop extends GenericMatcher {
     @Override
     public Collection<MailAddress> match(Mail mail) {
         try {
-            recipientRewriteTable.getMappings(mail.getSender().getLocalPart(), 
mail.getSender().getDomain());
+            if (mail.hasSender()) {
+                
recipientRewriteTable.getMappings(mail.getMaybeSender().get().getLocalPart(), 
mail.getMaybeSender().get().getDomain());
+            }
         } catch (RecipientRewriteTable.TooManyMappingException e) {
             return mail.getRecipients();
         } catch (Exception e) {

http://git-wip-us.apache.org/repos/asf/james-project/blob/8ce35148/server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/SenderInFakeDomain.java
----------------------------------------------------------------------
diff --git 
a/server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/SenderInFakeDomain.java
 
b/server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/SenderInFakeDomain.java
index e9468b2..8fa52cd 100644
--- 
a/server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/SenderInFakeDomain.java
+++ 
b/server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/SenderInFakeDomain.java
@@ -38,10 +38,10 @@ public class SenderInFakeDomain extends 
AbstractNetworkMatcher {
 
     @Override
     public Collection<MailAddress> match(Mail mail) {
-        if (mail.getSender() == null) {
+        if (!mail.hasSender()) {
             return null;
         }
-        Domain domain = mail.getSender().getDomain();
+        Domain domain = mail.getMaybeSender().get().getDomain();
         // DNS Lookup for this domain
         @SuppressWarnings("deprecation")
         Collection<String> servers = getMailetContext().getMailServers(domain);

http://git-wip-us.apache.org/repos/asf/james-project/blob/8ce35148/server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/dlp/Dlp.java
----------------------------------------------------------------------
diff --git 
a/server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/dlp/Dlp.java
 
b/server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/dlp/Dlp.java
index a82dc06..4257c3b 100644
--- 
a/server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/dlp/Dlp.java
+++ 
b/server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/dlp/Dlp.java
@@ -66,9 +66,8 @@ public class Dlp extends GenericMatcher {
     }
 
     private Optional<DLPConfigurationItem.Id> findFirstMatchingRule(Mail mail) 
{
-        return Optional
-                .ofNullable(mail.getSender())
-                .filter(sender -> !sender.isNullSender())
+        return mail.getMaybeSender()
+                .asOptional()
                 .flatMap(sender -> matchingRule(sender, mail));
     }
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/8ce35148/server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/dlp/DlpDomainRules.java
----------------------------------------------------------------------
diff --git 
a/server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/dlp/DlpDomainRules.java
 
b/server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/dlp/DlpDomainRules.java
index 031f306..3fbf59a 100644
--- 
a/server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/dlp/DlpDomainRules.java
+++ 
b/server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/dlp/DlpDomainRules.java
@@ -39,7 +39,6 @@ import org.apache.james.dlp.api.DLPConfigurationItem.Targets;
 import org.apache.james.javax.AddressHelper;
 import org.apache.james.javax.MultipartUtil;
 import org.apache.james.util.OptionalUtils;
-import org.apache.james.util.StreamUtils;
 import org.apache.mailet.Mail;
 
 import com.github.fge.lambdas.Throwing;
@@ -169,8 +168,7 @@ public class DlpDomainRules {
             }
 
             private Stream<String> listEnvelopSender(Mail mail) {
-                return StreamUtils.ofNullables(mail.getSender())
-                    .filter(sender -> !sender.isNullSender())
+                return mail.getMaybeSender().asStream()
                     .map(MailAddress::asString);
             }
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/8ce35148/server/mailet/mailets/src/main/java/org/apache/james/transport/util/ReplyToUtils.java
----------------------------------------------------------------------
diff --git 
a/server/mailet/mailets/src/main/java/org/apache/james/transport/util/ReplyToUtils.java
 
b/server/mailet/mailets/src/main/java/org/apache/james/transport/util/ReplyToUtils.java
index a9ea05d..ab44bc7 100644
--- 
a/server/mailet/mailets/src/main/java/org/apache/james/transport/util/ReplyToUtils.java
+++ 
b/server/mailet/mailets/src/main/java/org/apache/james/transport/util/ReplyToUtils.java
@@ -20,8 +20,6 @@ package org.apache.james.transport.util;
 
 import java.util.Optional;
 
-import javax.mail.MessagingException;
-
 import org.apache.james.core.MailAddress;
 import org.apache.james.transport.mailets.redirect.SpecialAddress;
 import org.apache.mailet.Mail;
@@ -42,12 +40,12 @@ public class ReplyToUtils {
         this.replyTo = replyTo;
     }
 
-    public Optional<MailAddress> getReplyTo(Mail originalMail) throws 
MessagingException {
+    public Optional<MailAddress> getReplyTo(Mail originalMail) {
         if (replyTo.isPresent()) {
             if (replyTo.get().equals(SpecialAddress.UNALTERED)) {
                 return Optional.empty();
             }
-            return Optional.ofNullable(originalMail.getSender());
+            return originalMail.getMaybeSender().asOptional();
         }
         return Optional.empty();
     }

http://git-wip-us.apache.org/repos/asf/james-project/blob/8ce35148/server/mailet/mailets/src/main/java/org/apache/james/transport/util/SpecialAddressesUtils.java
----------------------------------------------------------------------
diff --git 
a/server/mailet/mailets/src/main/java/org/apache/james/transport/util/SpecialAddressesUtils.java
 
b/server/mailet/mailets/src/main/java/org/apache/james/transport/util/SpecialAddressesUtils.java
index e80f8b6..f95175f 100644
--- 
a/server/mailet/mailets/src/main/java/org/apache/james/transport/util/SpecialAddressesUtils.java
+++ 
b/server/mailet/mailets/src/main/java/org/apache/james/transport/util/SpecialAddressesUtils.java
@@ -33,6 +33,7 @@ import 
org.apache.james.transport.mailets.redirect.AddressExtractor;
 import org.apache.james.transport.mailets.redirect.RedirectNotify;
 import org.apache.james.transport.mailets.redirect.SpecialAddress;
 import org.apache.james.transport.mailets.redirect.SpecialAddressKind;
+import org.apache.james.util.OptionalUtils;
 import org.apache.mailet.Mail;
 import org.apache.mailet.base.RFC2822Headers;
 import org.slf4j.Logger;
@@ -98,7 +99,7 @@ public class SpecialAddressesUtils {
             case SENDER:
             case FROM:
             case REVERSE_PATH:
-                return Optional.ofNullable(mail.getSender())
+                return mail.getMaybeSender().asOptional()
                     .map(ImmutableSet::of)
                     .orElse(ImmutableSet.of());
             case REPLY_TO:
@@ -129,11 +130,7 @@ public class SpecialAddressesUtils {
     }
 
     private Set<MailAddress> getSender(Mail mail) {
-        MailAddress sender = mail.getSender();
-        if (sender != null) {
-            return ImmutableSet.of(sender);
-        }
-        return ImmutableSet.of();
+        return OptionalUtils.toSet(mail.getMaybeSender().asOptional());
     }
 
     private Set<MailAddress> getReplyTos(InternetAddress[] replyToArray) {
@@ -189,10 +186,7 @@ public class SpecialAddressesUtils {
         switch (specialAddressKind) {
             case SENDER:
             case REVERSE_PATH:
-                return Optional.ofNullable(mail.getSender())
-                    .filter(address -> !address.isNullSender())
-                    .map(ImmutableSet::of)
-                    .orElse(ImmutableSet.of());
+                return getSender(mail);
             case FROM:
                 try {
                     InternetAddress[] fromArray = (InternetAddress[]) 
mail.getMessage().getFrom();
@@ -225,12 +219,8 @@ public class SpecialAddressesUtils {
         if (addresses != null) {
             return MailAddressUtils.from(addresses);
         } else {
-            MailAddress reversePath = mail.getSender();
-            if (reversePath != null) {
-                return ImmutableList.of(reversePath);
-            }
+            return mail.getMaybeSender().asList();
         }
-        return ImmutableList.of();
     }
 
     private List<MailAddress> toHeaders(Mail mail) {

http://git-wip-us.apache.org/repos/asf/james-project/blob/8ce35148/server/mailet/mailets/src/test/java/org/apache/james/samples/mailets/HelloWorldMailet.java
----------------------------------------------------------------------
diff --git 
a/server/mailet/mailets/src/test/java/org/apache/james/samples/mailets/HelloWorldMailet.java
 
b/server/mailet/mailets/src/test/java/org/apache/james/samples/mailets/HelloWorldMailet.java
index baaf24c..186d087 100644
--- 
a/server/mailet/mailets/src/test/java/org/apache/james/samples/mailets/HelloWorldMailet.java
+++ 
b/server/mailet/mailets/src/test/java/org/apache/james/samples/mailets/HelloWorldMailet.java
@@ -18,8 +18,7 @@
  ****************************************************************/
 package org.apache.james.samples.mailets;
 
-import javax.mail.MessagingException;
-
+import org.apache.james.core.MailAddress;
 import org.apache.mailet.Mail;
 import org.apache.mailet.Mailet;
 import org.apache.mailet.MailetConfig;
@@ -49,13 +48,13 @@ public class HelloWorldMailet implements Mailet {
     }
 
     @Override
-    public void init(MailetConfig config) throws MessagingException {
+    public void init(MailetConfig config) {
         this.config = config;
     }
 
     @Override
-    public void service(Mail mail) throws MessagingException {
+    public void service(Mail mail) {
         LOGGER.info("Hello, World!");
-        LOGGER.info("You have mail from {}", mail.getSender().getLocalPart());
+        LOGGER.info("You have mail from {}", 
mail.getMaybeSender().asOptional().map(MailAddress::getLocalPart));
     }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/8ce35148/server/mailet/mailets/src/test/java/org/apache/james/samples/mailets/InstrumentationMailet.java
----------------------------------------------------------------------
diff --git 
a/server/mailet/mailets/src/test/java/org/apache/james/samples/mailets/InstrumentationMailet.java
 
b/server/mailet/mailets/src/test/java/org/apache/james/samples/mailets/InstrumentationMailet.java
index eee8fd2..05aa60f 100644
--- 
a/server/mailet/mailets/src/test/java/org/apache/james/samples/mailets/InstrumentationMailet.java
+++ 
b/server/mailet/mailets/src/test/java/org/apache/james/samples/mailets/InstrumentationMailet.java
@@ -88,8 +88,8 @@ public class InstrumentationMailet implements Mailet {
             LOGGER.info("Remote Address: " + mail.getRemoteAddr());
             LOGGER.info("Remote Host: " + mail.getRemoteHost());
             LOGGER.info("State: " + mail.getState());
-            LOGGER.info("Sender host: " + mail.getSender().getDomain().name());
-            LOGGER.info("Sender user: " + mail.getSender().getLocalPart());
+            LOGGER.info("Sender host: " + 
mail.getMaybeSender().asOptional().map(mailAddress -> 
mailAddress.getDomain().name()));
+            LOGGER.info("Sender user: " + 
mail.getMaybeSender().asOptional().map(MailAddress::getLocalPart));
             Collection<MailAddress> recipients = mail.getRecipients();
             for (MailAddress address : recipients) {
                 LOGGER.info("Recipient: " + address.getLocalPart() + "@" + 
address.getDomain().name());

http://git-wip-us.apache.org/repos/asf/james-project/blob/8ce35148/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/RecipientRewriteTableProcessorTest.java
----------------------------------------------------------------------
diff --git 
a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/RecipientRewriteTableProcessorTest.java
 
b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/RecipientRewriteTableProcessorTest.java
index f0f36ae..06bbad7 100644
--- 
a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/RecipientRewriteTableProcessorTest.java
+++ 
b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/RecipientRewriteTableProcessorTest.java
@@ -68,7 +68,7 @@ public class RecipientRewriteTableProcessorTest {
         MockitoAnnotations.initMocks(this);
         mailetContext = FakeMailContext.defaultContext();
         processor = new RecipientRewriteTableProcessor(virtualTableStore, 
domainList, mailetContext);
-        mail = FakeMail.builder().build();
+        mail = 
FakeMail.builder().sender(MailAddressFixture.ANY_AT_JAMES).build();
         mappings = MappingsImpl.builder()
                 .add(MailAddressFixture.ANY_AT_JAMES.toString())
                 .build();
@@ -86,7 +86,7 @@ public class RecipientRewriteTableProcessorTest {
                 .add(MailAddressFixture.OTHER_AT_JAMES.toString())
                 .build();
 
-        processor.handleMappings(mappings, MailAddressFixture.ANY_AT_JAMES, 
MailAddressFixture.OTHER_AT_JAMES, message);
+        processor.handleMappings(mappings, 
FakeMail.builder().sender(MailAddressFixture.ANY_AT_JAMES).build(), 
MailAddressFixture.OTHER_AT_JAMES, message);
     }
 
     @Test
@@ -97,7 +97,7 @@ public class RecipientRewriteTableProcessorTest {
                 .add(MailAddressFixture.OTHER_AT_JAMES.toString())
                 .build();
 
-        processor.handleMappings(mappings, MailAddressFixture.ANY_AT_JAMES, 
MailAddressFixture.OTHER_AT_JAMES, message);
+        processor.handleMappings(mappings, mail, 
MailAddressFixture.OTHER_AT_JAMES, message);
     }
 
     @Test
@@ -109,7 +109,7 @@ public class RecipientRewriteTableProcessorTest {
                 .add(MailAddressFixture.OTHER_AT_JAMES.toString())
                 .build();
 
-        Collection<MailAddress> result = processor.handleMappings(mappings, 
MailAddressFixture.ANY_AT_JAMES, MailAddressFixture.OTHER_AT_JAMES, message);
+        Collection<MailAddress> result = processor.handleMappings(mappings, 
mail, MailAddressFixture.OTHER_AT_JAMES, message);
 
         assertThat(result).containsOnly(nonDomainWithDefaultLocal);
     }
@@ -125,7 +125,7 @@ public class RecipientRewriteTableProcessorTest {
                 .add(MailAddressFixture.OTHER_AT_JAMES.toString())
                 .build();
 
-        Collection<MailAddress> result = processor.handleMappings(mappings, 
MailAddressFixture.ANY_AT_JAMES, MailAddressFixture.OTHER_AT_JAMES, message);
+        Collection<MailAddress> result = processor.handleMappings(mappings, 
mail, MailAddressFixture.OTHER_AT_JAMES, message);
 
         assertThat(result).containsOnly(MailAddressFixture.ANY_AT_LOCAL);
     }
@@ -140,7 +140,7 @@ public class RecipientRewriteTableProcessorTest {
                 .add(MailAddressFixture.OTHER_AT_JAMES.toString())
                 .build();
 
-        Collection<MailAddress> result = processor.handleMappings(mappings, 
MailAddressFixture.ANY_AT_JAMES, MailAddressFixture.OTHER_AT_JAMES, message);
+        Collection<MailAddress> result = processor.handleMappings(mappings, 
mail, MailAddressFixture.OTHER_AT_JAMES, message);
 
         assertThat(result).containsOnly(nonDomainWithDefaultLocal);
     }
@@ -156,7 +156,7 @@ public class RecipientRewriteTableProcessorTest {
                 .add(MailAddressFixture.OTHER_AT_JAMES.toString())
                 .build();
 
-        processor.handleMappings(mappings, MailAddressFixture.ANY_AT_JAMES, 
MailAddressFixture.OTHER_AT_JAMES, message);
+        processor.handleMappings(mappings, mail, 
MailAddressFixture.OTHER_AT_JAMES, message);
 
         FakeMailContext.SentMail expected = FakeMailContext.sentMailBuilder()
                 .sender(MailAddressFixture.ANY_AT_JAMES)
@@ -177,7 +177,7 @@ public class RecipientRewriteTableProcessorTest {
                 .add(INVALID_MAIL_ADDRESS)
                 .build();
 
-        processor.handleMappings(mappings, MailAddressFixture.ANY_AT_JAMES, 
MailAddressFixture.OTHER_AT_JAMES, message);
+        processor.handleMappings(mappings, mail, 
MailAddressFixture.OTHER_AT_JAMES, message);
 
         assertThat(mailetContext.getSentMails()).isEmpty();
     }
@@ -192,7 +192,7 @@ public class RecipientRewriteTableProcessorTest {
                 .add(MailAddressFixture.ANY_AT_LOCAL.toString())
                 .build();
 
-        Collection<MailAddress> result = processor.handleMappings(mappings, 
MailAddressFixture.ANY_AT_JAMES, MailAddressFixture.OTHER_AT_JAMES, message);
+        Collection<MailAddress> result = processor.handleMappings(mappings, 
mail, MailAddressFixture.OTHER_AT_JAMES, message);
 
         assertThat(result).containsOnly(nonDomainWithDefaultLocal, 
MailAddressFixture.ANY_AT_LOCAL);
     }
@@ -206,7 +206,7 @@ public class RecipientRewriteTableProcessorTest {
                 .add(MailAddressFixture.OTHER_AT_JAMES.toString())
                 .build();
 
-        Collection<MailAddress> result = processor.handleMappings(mappings, 
MailAddressFixture.ANY_AT_JAMES, MailAddressFixture.OTHER_AT_JAMES, message);
+        Collection<MailAddress> result = processor.handleMappings(mappings, 
mail, MailAddressFixture.OTHER_AT_JAMES, message);
 
         FakeMailContext.SentMail expected = FakeMailContext.sentMailBuilder()
                 .sender(MailAddressFixture.ANY_AT_JAMES)

http://git-wip-us.apache.org/repos/asf/james-project/blob/8ce35148/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/DeliveryUtilsTest.java
----------------------------------------------------------------------
diff --git 
a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/DeliveryUtilsTest.java
 
b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/DeliveryUtilsTest.java
deleted file mode 100644
index 287f771..0000000
--- 
a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/DeliveryUtilsTest.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one   *
- * or more contributor license agreements.  See the NOTICE file *
- * distributed with this work for additional information        *
- * regarding copyright ownership.  The ASF licenses this file   *
- * to you under the Apache License, Version 2.0 (the            *
- * "License"); you may not use this file except in compliance   *
- * with the License.  You may obtain a copy of the License at   *
- *                                                              *
- *   http://www.apache.org/licenses/LICENSE-2.0                 *
- *                                                              *
- * Unless required by applicable law or agreed to in writing,   *
- * software distributed under the License is distributed on an  *
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
- * KIND, either express or implied.  See the License for the    *
- * specific language governing permissions and limitations      *
- * under the License.                                           *
- ****************************************************************/
-
-package org.apache.james.transport.mailets.delivery;
-
-import static org.assertj.core.api.Assertions.assertThat;
-
-import org.apache.mailet.base.MailAddressFixture;
-import org.junit.Test;
-
-public class DeliveryUtilsTest {
-
-    @Test
-    public void prettyPrintShouldDisplayNullAddresses() {
-        assertThat(DeliveryUtils.prettyPrint(null)).isEqualTo("<>");
-    }
-
-    @Test
-    public void prettyPrintShouldDisplayAddresses() {
-        assertThat(DeliveryUtils.prettyPrint(MailAddressFixture.ANY_AT_JAMES))
-            .isEqualTo("<" + MailAddressFixture.ANY_AT_JAMES + ">");
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/james-project/blob/8ce35148/server/mailrepository/mailrepository-api/src/test/java/org/apache/james/mailrepository/MailRepositoryContract.java
----------------------------------------------------------------------
diff --git 
a/server/mailrepository/mailrepository-api/src/test/java/org/apache/james/mailrepository/MailRepositoryContract.java
 
b/server/mailrepository/mailrepository-api/src/test/java/org/apache/james/mailrepository/MailRepositoryContract.java
index 1cdc218..d923050 100644
--- 
a/server/mailrepository/mailrepository-api/src/test/java/org/apache/james/mailrepository/MailRepositoryContract.java
+++ 
b/server/mailrepository/mailrepository-api/src/test/java/org/apache/james/mailrepository/MailRepositoryContract.java
@@ -34,6 +34,7 @@ import javax.mail.MessagingException;
 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.mailrepository.api.MailKey;
 import org.apache.james.mailrepository.api.MailRepository;
@@ -150,7 +151,7 @@ public interface MailRepositoryContract {
 
         testee.store(mail);
 
-        
assertThat(testee.retrieve(MAIL_1).getSender()).isEqualTo(MailAddress.nullSender());
+        
assertThat(testee.retrieve(MAIL_1).getMaybeSender()).isEqualTo(MaybeSender.nullSender());
     }
 
     @Test

http://git-wip-us.apache.org/repos/asf/james-project/blob/8ce35148/server/mailrepository/mailrepository-cassandra/src/main/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryMailDAO.java
----------------------------------------------------------------------
diff --git 
a/server/mailrepository/mailrepository-cassandra/src/main/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryMailDAO.java
 
b/server/mailrepository/mailrepository-cassandra/src/main/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryMailDAO.java
index 7c4ffcc..5645a59 100644
--- 
a/server/mailrepository/mailrepository-cassandra/src/main/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryMailDAO.java
+++ 
b/server/mailrepository/mailrepository-cassandra/src/main/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryMailDAO.java
@@ -145,9 +145,7 @@ public class CassandraMailRepositoryMailDAO {
             .setString(HEADER_BLOB_ID, headerId.asString())
             .setString(BODY_BLOB_ID, bodyId.asString())
             .setString(STATE, mail.getState())
-            .setString(SENDER, Optional.ofNullable(mail.getSender())
-                .map(MailAddress::asString)
-                .orElse(null))
+            .setString(SENDER, mail.getMaybeSender().asString(null))
             .setList(RECIPIENTS, asStringList(mail.getRecipients()))
             .setString(ERROR_MESSAGE, mail.getErrorMessage())
             .setString(REMOTE_ADDR, mail.getRemoteAddr())

http://git-wip-us.apache.org/repos/asf/james-project/blob/8ce35148/server/mailrepository/mailrepository-cassandra/src/test/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryMailDAOTest.java
----------------------------------------------------------------------
diff --git 
a/server/mailrepository/mailrepository-cassandra/src/test/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryMailDAOTest.java
 
b/server/mailrepository/mailrepository-cassandra/src/test/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryMailDAOTest.java
index 7d62d4c..de19dee 100644
--- 
a/server/mailrepository/mailrepository-cassandra/src/test/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryMailDAOTest.java
+++ 
b/server/mailrepository/mailrepository-cassandra/src/test/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryMailDAOTest.java
@@ -104,7 +104,7 @@ class CassandraMailRepositoryMailDAOTest {
                     .containsOnly(MailAddressFixture.RECIPIENT1);
             
softly.assertThat(partialMail.getPerRecipientSpecificHeaders().getHeadersForRecipient(MailAddressFixture.RECIPIENT1))
                     .containsOnly(header);
-            
softly.assertThat(partialMail.getSender()).isEqualTo(MailAddressFixture.SENDER);
+            
softly.assertThat(partialMail.getMaybeSender().asOptional()).contains(MailAddressFixture.SENDER);
             
softly.assertThat(partialMail.getRecipients()).containsOnly(MailAddressFixture.RECIPIENT1,
 MailAddressFixture.RECIPIENT2);
         });
     }

http://git-wip-us.apache.org/repos/asf/james-project/blob/8ce35148/server/protocols/fetchmail/src/main/java/org/apache/james/fetchmail/MessageProcessor.java
----------------------------------------------------------------------
diff --git 
a/server/protocols/fetchmail/src/main/java/org/apache/james/fetchmail/MessageProcessor.java
 
b/server/protocols/fetchmail/src/main/java/org/apache/james/fetchmail/MessageProcessor.java
index 313b9d6..4d21c7a 100644
--- 
a/server/protocols/fetchmail/src/main/java/org/apache/james/fetchmail/MessageProcessor.java
+++ 
b/server/protocols/fetchmail/src/main/java/org/apache/james/fetchmail/MessageProcessor.java
@@ -628,7 +628,7 @@ public class MessageProcessor extends ProcessorAbstract {
             StringBuilder messageBuffer = new StringBuilder("Created mail with 
name: ");
             messageBuffer.append(mail.getName());
             messageBuffer.append(", sender: ");
-            messageBuffer.append(mail.getSender());
+            messageBuffer.append(mail.getMaybeSender());
             messageBuffer.append(", recipients: ");
             for (Object o : mail.getRecipients()) {
                 messageBuffer.append(o);

http://git-wip-us.apache.org/repos/asf/james-project/blob/8ce35148/server/protocols/jmap/src/main/java/org/apache/james/jmap/mailet/VacationMailet.java
----------------------------------------------------------------------
diff --git 
a/server/protocols/jmap/src/main/java/org/apache/james/jmap/mailet/VacationMailet.java
 
b/server/protocols/jmap/src/main/java/org/apache/james/jmap/mailet/VacationMailet.java
index f8a6253..c4ac14f 100644
--- 
a/server/protocols/jmap/src/main/java/org/apache/james/jmap/mailet/VacationMailet.java
+++ 
b/server/protocols/jmap/src/main/java/org/apache/james/jmap/mailet/VacationMailet.java
@@ -65,6 +65,9 @@ public class VacationMailet extends GenericMailet {
     @Override
     public void service(Mail mail) {
         try {
+            if (!mail.hasSender()) {
+                return;
+            }
             if (! automaticallySentMailDetector.isAutomaticallySent(mail)) {
                 ZonedDateTime processingDate = zonedDateTimeProvider.get();
                 mail.getRecipients()
@@ -84,7 +87,7 @@ public class VacationMailet extends GenericMailet {
                 vacationRepository.retrieveVacation(accountId),
                 notificationRegistry.isRegistered(
                     AccountId.fromString(recipient.toString()),
-                    RecipientId.fromMailAddress(processedMail.getSender())),
+                    
RecipientId.fromMailAddress(processedMail.getMaybeSender().get())),
                 (vacation, alreadySent) ->
                     sendNotificationIfRequired(recipient, processedMail, 
processingDate, vacation, alreadySent))
             .thenCompose(Function.identity());
@@ -110,10 +113,10 @@ public class VacationMailet extends GenericMailet {
                 .build(mimeMessageBodyGenerator);
             sendNotification(vacationReply);
             return 
notificationRegistry.register(AccountId.fromString(recipient.toString()),
-                RecipientId.fromMailAddress(processedMail.getSender()),
+                
RecipientId.fromMailAddress(processedMail.getMaybeSender().get()),
                 vacation.getToDate());
         } catch (MessagingException e) {
-            LOGGER.warn("Failed to send JMAP vacation notification from {} to 
{}", recipient, processedMail.getSender(), e);
+            LOGGER.warn("Failed to send JMAP vacation notification from {} to 
{}", recipient, processedMail.getMaybeSender(), e);
             return CompletableFuture.completedFuture(null);
         }
     }

http://git-wip-us.apache.org/repos/asf/james-project/blob/8ce35148/server/protocols/jmap/src/main/java/org/apache/james/jmap/mailet/VacationReply.java
----------------------------------------------------------------------
diff --git 
a/server/protocols/jmap/src/main/java/org/apache/james/jmap/mailet/VacationReply.java
 
b/server/protocols/jmap/src/main/java/org/apache/james/jmap/mailet/VacationReply.java
index ae5c4cc..b98b16f 100644
--- 
a/server/protocols/jmap/src/main/java/org/apache/james/jmap/mailet/VacationReply.java
+++ 
b/server/protocols/jmap/src/main/java/org/apache/james/jmap/mailet/VacationReply.java
@@ -27,12 +27,12 @@ import javax.mail.internet.MimeMessage;
 import org.apache.james.core.MailAddress;
 import org.apache.james.jmap.api.vacation.Vacation;
 import org.apache.james.jmap.utils.MimeMessageBodyGenerator;
+import org.apache.james.util.OptionalUtils;
 import org.apache.mailet.Mail;
 import org.apache.mailet.base.AutomaticallySentMailDetector;
 
 import com.github.fge.lambdas.Throwing;
 import com.google.common.base.Preconditions;
-import com.google.common.collect.ImmutableList;
 
 public class VacationReply {
 
@@ -68,16 +68,16 @@ public class VacationReply {
 
         public VacationReply build(MimeMessageBodyGenerator 
mimeMessageBodyGenerator) throws MessagingException {
             Preconditions.checkState(mailRecipient != null, "Original 
recipient address should not be null");
-            Preconditions.checkState(originalMail.getSender() != null, 
"Original sender address should not be null");
+            Preconditions.checkState(originalMail.hasSender(), "Original 
sender address should not be null");
 
-            return new VacationReply(mailRecipient, 
ImmutableList.of(originalMail.getSender()), 
generateMimeMessage(mimeMessageBodyGenerator));
+            return new VacationReply(mailRecipient, 
OptionalUtils.toList(originalMail.getMaybeSender().asOptional()), 
generateMimeMessage(mimeMessageBodyGenerator));
         }
 
         private MimeMessage generateMimeMessage(MimeMessageBodyGenerator 
mimeMessageBodyGenerator) throws MessagingException {
             MimeMessage reply = (MimeMessage) 
originalMail.getMessage().reply(NOT_REPLY_TO_ALL);
             vacation.getSubject().ifPresent(Throwing.consumer(subjectString -> 
reply.setHeader("subject", subjectString)));
             reply.setHeader(FROM_HEADER, mailRecipient.toString());
-            reply.setHeader(TO_HEADER, originalMail.getSender().toString());
+            reply.setHeader(TO_HEADER, 
originalMail.getMaybeSender().get().asString());
             
reply.setHeader(AutomaticallySentMailDetector.AUTO_SUBMITTED_HEADER, 
AutomaticallySentMailDetector.AUTO_REPLIED_VALUE);
 
             return mimeMessageBodyGenerator.from(reply, 
vacation.getTextBody(), vacation.getHtmlBody());

http://git-wip-us.apache.org/repos/asf/james-project/blob/8ce35148/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/SetMessagesUpdateProcessor.java
----------------------------------------------------------------------
diff --git 
a/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/SetMessagesUpdateProcessor.java
 
b/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/SetMessagesUpdateProcessor.java
index a13be0b..3e75d30 100644
--- 
a/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/SetMessagesUpdateProcessor.java
+++ 
b/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/SetMessagesUpdateProcessor.java
@@ -180,7 +180,7 @@ public class SetMessagesUpdateProcessor implements 
SetMessagesProcessor {
             if (maybeMessageToSend.isPresent()) {
                 MessageResult messageToSend = maybeMessageToSend.get();
                 MailImpl mail = buildMailFromMessage(messageToSend);
-                assertUserIsSender(mailboxSession, mail.getSender());
+                assertUserIsSender(mailboxSession, 
mail.getMaybeSender().asOptional());
                 messageSender.sendMessage(messageId, mail, mailboxSession);
                 referenceUpdater.updateReferences(messageToSend.getHeaders(), 
mailboxSession);
             } else {
@@ -189,8 +189,11 @@ public class SetMessagesUpdateProcessor implements 
SetMessagesProcessor {
         }
     }
 
-    private void assertUserIsSender(MailboxSession session, MailAddress 
sender) throws MailboxSendingNotAllowedException {
-        if (!session.getUser().isSameUser(sender.asString())) {
+    private void assertUserIsSender(MailboxSession session, 
Optional<MailAddress> sender) throws MailboxSendingNotAllowedException {
+        boolean userIsSender = sender.map(address -> 
session.getUser().isSameUser(address.asString()))
+            .orElse(false);
+
+        if (!userIsSender) {
             String allowedSender = session.getUser().getUserName();
             throw new MailboxSendingNotAllowedException(allowedSender);
         }

http://git-wip-us.apache.org/repos/asf/james-project/blob/8ce35148/server/protocols/jmap/src/test/java/org/apache/james/jmap/send/MailFactoryTest.java
----------------------------------------------------------------------
diff --git 
a/server/protocols/jmap/src/test/java/org/apache/james/jmap/send/MailFactoryTest.java
 
b/server/protocols/jmap/src/test/java/org/apache/james/jmap/send/MailFactoryTest.java
index 5b1f468..6c6b3db 100644
--- 
a/server/protocols/jmap/src/test/java/org/apache/james/jmap/send/MailFactoryTest.java
+++ 
b/server/protocols/jmap/src/test/java/org/apache/james/jmap/send/MailFactoryTest.java
@@ -30,6 +30,7 @@ import java.util.Collection;
 import javax.mail.util.SharedByteArrayInputStream;
 
 import org.apache.james.core.MailAddress;
+import org.apache.james.core.MaybeSender;
 import org.apache.james.jmap.model.Envelope;
 import org.apache.james.jmap.model.Keyword;
 import org.apache.james.jmap.model.Keywords;
@@ -116,7 +117,7 @@ public class MailFactoryTest {
         Mail actual = testee.build(message, envelope);
         
         assertThat(actual.getName()).isEqualTo(expectedName);
-        assertThat(actual.getSender()).isEqualTo(expectedSender);
+        
assertThat(actual.getMaybeSender()).isEqualTo(MaybeSender.of(expectedSender));
         assertThat(actual.getRecipients()).containsAll(expectedRecipients);
     }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/8ce35148/server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/SendMailHandler.java
----------------------------------------------------------------------
diff --git 
a/server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/SendMailHandler.java
 
b/server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/SendMailHandler.java
index da14ed3..b9627d6 100644
--- 
a/server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/SendMailHandler.java
+++ 
b/server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/SendMailHandler.java
@@ -68,7 +68,7 @@ public class SendMailHandler implements JamesMessageHook {
 
         try {
             queue.enQueue(mail);
-            LOGGER.info("Successfully spooled mail {} from {} on {} for {}", 
mail.getName(), mail.getSender(), session.getRemoteAddress().getAddress(), 
mail.getRecipients());
+            LOGGER.info("Successfully spooled mail {} from {} on {} for {}", 
mail.getName(), mail.getMaybeSender(), session.getRemoteAddress().getAddress(), 
mail.getRecipients());
         } catch (MessagingException me) {
             LOGGER.error("Unknown error occurred while processing DATA.", me);
             return HookResult.builder()

http://git-wip-us.apache.org/repos/asf/james-project/blob/8ce35148/server/protocols/protocols-smtp/src/test/java/org/apache/james/smtpserver/SMTPServerTest.java
----------------------------------------------------------------------
diff --git 
a/server/protocols/protocols-smtp/src/test/java/org/apache/james/smtpserver/SMTPServerTest.java
 
b/server/protocols/protocols-smtp/src/test/java/org/apache/james/smtpserver/SMTPServerTest.java
index 171e49d..2b6587e 100644
--- 
a/server/protocols/protocols-smtp/src/test/java/org/apache/james/smtpserver/SMTPServerTest.java
+++ 
b/server/protocols/protocols-smtp/src/test/java/org/apache/james/smtpserver/SMTPServerTest.java
@@ -344,7 +344,7 @@ public class SMTPServerTest {
         }
 
         if (sender != null) {
-            assertThat(mailData.getSender().toString())
+            assertThat(mailData.getMaybeSender().asString())
                 .as("sender verfication")
                 .isEqualTo(sender);
         }

http://git-wip-us.apache.org/repos/asf/james-project/blob/8ce35148/server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/dto/MailQueueItemDTO.java
----------------------------------------------------------------------
diff --git 
a/server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/dto/MailQueueItemDTO.java
 
b/server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/dto/MailQueueItemDTO.java
index fb01f71..a6b1c75 100644
--- 
a/server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/dto/MailQueueItemDTO.java
+++ 
b/server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/dto/MailQueueItemDTO.java
@@ -25,7 +25,6 @@ import java.util.List;
 import java.util.Optional;
 
 import org.apache.james.core.MailAddress;
-import org.apache.james.queue.api.MailQueue.MailQueueException;
 import org.apache.james.queue.api.ManageableMailQueue;
 
 import com.github.steveash.guavate.Guavate;
@@ -38,10 +37,10 @@ public class MailQueueItemDTO {
         return new Builder();
     }
 
-    public static MailQueueItemDTO from(ManageableMailQueue.MailQueueItemView 
mailQueueItemView) throws MailQueueException {
+    public static MailQueueItemDTO from(ManageableMailQueue.MailQueueItemView 
mailQueueItemView) {
         return builder()
                 .name(mailQueueItemView.getMail().getName())
-                .sender(mailQueueItemView.getMail().getSender())
+                
.sender(mailQueueItemView.getMail().getMaybeSender().asOptional())
                 .recipients(mailQueueItemView.getMail().getRecipients())
                 .nextDelivery(mailQueueItemView.getNextDelivery())
                 .build();
@@ -67,6 +66,11 @@ public class MailQueueItemDTO {
             return this;
         }
 
+        public Builder sender(Optional<MailAddress> sender) {
+            sender.ifPresent(this::sender);
+            return this;
+        }
+
         public Builder recipients(Collection<MailAddress> recipients) {
             this.recipients = recipients.stream()
                     .map(MailAddress::asString)

http://git-wip-us.apache.org/repos/asf/james-project/blob/8ce35148/server/protocols/webadmin/webadmin-mailqueue/src/test/java/org/apache/james/webadmin/dto/MailQueueItemDTOTest.java
----------------------------------------------------------------------
diff --git 
a/server/protocols/webadmin/webadmin-mailqueue/src/test/java/org/apache/james/webadmin/dto/MailQueueItemDTOTest.java
 
b/server/protocols/webadmin/webadmin-mailqueue/src/test/java/org/apache/james/webadmin/dto/MailQueueItemDTOTest.java
index bb3c7bc..2a7dffd 100644
--- 
a/server/protocols/webadmin/webadmin-mailqueue/src/test/java/org/apache/james/webadmin/dto/MailQueueItemDTOTest.java
+++ 
b/server/protocols/webadmin/webadmin-mailqueue/src/test/java/org/apache/james/webadmin/dto/MailQueueItemDTOTest.java
@@ -61,7 +61,7 @@ public class MailQueueItemDTOTest {
                 .collect(Guavate.toImmutableList());
 
         
softly.assertThat(mailQueueItemDTO.getName()).isEqualTo(mail.getName());
-        
softly.assertThat(mailQueueItemDTO.getSender()).isEqualTo(mail.getSender().asString());
+        
softly.assertThat(mailQueueItemDTO.getSender()).isEqualTo(mail.getMaybeSender().get().asString());
         
softly.assertThat(mailQueueItemDTO.getRecipients()).isEqualTo(expectedRecipients);
         softly.assertThat(mailQueueItemDTO.getNextDelivery()).contains(date);
     }

http://git-wip-us.apache.org/repos/asf/james-project/blob/8ce35148/server/protocols/webadmin/webadmin-mailqueue/src/test/java/org/apache/james/webadmin/routes/MailQueueRoutesTest.java
----------------------------------------------------------------------
diff --git 
a/server/protocols/webadmin/webadmin-mailqueue/src/test/java/org/apache/james/webadmin/routes/MailQueueRoutesTest.java
 
b/server/protocols/webadmin/webadmin-mailqueue/src/test/java/org/apache/james/webadmin/routes/MailQueueRoutesTest.java
index 5e0fc82..6e8e801 100644
--- 
a/server/protocols/webadmin/webadmin-mailqueue/src/test/java/org/apache/james/webadmin/routes/MailQueueRoutesTest.java
+++ 
b/server/protocols/webadmin/webadmin-mailqueue/src/test/java/org/apache/james/webadmin/routes/MailQueueRoutesTest.java
@@ -25,6 +25,7 @@ import static io.restassured.RestAssured.with;
 import static io.restassured.config.EncoderConfig.encoderConfig;
 import static io.restassured.config.RestAssuredConfig.newConfig;
 import static org.apache.james.webadmin.WebAdminServer.NO_CONFIGURATION;
+import static org.apache.mailet.base.MailAddressFixture.SENDER;
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.hamcrest.Matchers.empty;
 import static org.hamcrest.Matchers.equalTo;
@@ -262,7 +263,7 @@ public class MailQueueRoutesTest {
                     .contentType(ContentType.JSON)
                     .body(".", hasSize(1))
                     .body(firstMail + ".name", equalTo(mail.getName()))
-                    .body(firstMail + ".sender", 
equalTo(mail.getSender().asString()))
+                    .body(firstMail + ".sender", equalTo(SENDER.asString()))
                     .body(firstMail + ".recipients", 
equalTo(expectedRecipients));
             }
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/8ce35148/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/dto/MailDto.java
----------------------------------------------------------------------
diff --git 
a/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/dto/MailDto.java
 
b/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/dto/MailDto.java
index defbcbc..053a2bc 100644
--- 
a/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/dto/MailDto.java
+++ 
b/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/dto/MailDto.java
@@ -54,7 +54,7 @@ public class MailDto {
     public static MailDto fromMail(Mail mail, Set<AdditionalField> 
additionalFields) throws MessagingException, InaccessibleFieldException {
         Optional<MessageContent> messageContent = 
fetchMessage(additionalFields, mail);
         return new MailDto(mail.getName(),
-            Optional.ofNullable(mail.getSender()).map(MailAddress::asString),
+            mail.getMaybeSender().asOptional().map(MailAddress::asString),
             
mail.getRecipients().stream().map(MailAddress::asString).collect(Guavate.toImmutableList()),
             Optional.ofNullable(mail.getErrorMessage()),
             Optional.ofNullable(mail.getState()),

http://git-wip-us.apache.org/repos/asf/james-project/blob/8ce35148/server/queue/queue-api/src/test/java/org/apache/james/queue/api/MailQueueContract.java
----------------------------------------------------------------------
diff --git 
a/server/queue/queue-api/src/test/java/org/apache/james/queue/api/MailQueueContract.java
 
b/server/queue/queue-api/src/test/java/org/apache/james/queue/api/MailQueueContract.java
index b54983a..b5d8b3e 100644
--- 
a/server/queue/queue-api/src/test/java/org/apache/james/queue/api/MailQueueContract.java
+++ 
b/server/queue/queue-api/src/test/java/org/apache/james/queue/api/MailQueueContract.java
@@ -41,6 +41,7 @@ import java.util.concurrent.TimeoutException;
 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.junit.ExecutorExtension;
 import org.apache.james.util.concurrency.ConcurrentTestRunner;
@@ -92,7 +93,7 @@ public interface MailQueueContract {
     }
 
     @Test
-    default void queueShouldPreserveNullSender() throws Exception {
+    default void queueShouldHandleSender() throws Exception {
         enQueue(FakeMail.builder()
             .name("name")
             .mimeMessage(createMimeMessage())
@@ -102,8 +103,22 @@ public interface MailQueueContract {
             .build());
 
         MailQueue.MailQueueItem mailQueueItem = getMailQueue().deQueue();
-        assertThat(mailQueueItem.getMail().getSender())
-            .isEqualTo(MailAddress.nullSender());
+        assertThat(mailQueueItem.getMail().getMaybeSender())
+            .isEqualTo(MaybeSender.nullSender());
+    }
+
+    @Test
+    default void queueShouldHandleNoSender() throws Exception {
+        enQueue(FakeMail.builder()
+            .name("name")
+            .mimeMessage(createMimeMessage())
+            .recipients(RECIPIENT1, RECIPIENT2)
+            .lastUpdated(new Date())
+            .build());
+
+        MailQueue.MailQueueItem mailQueueItem = getMailQueue().deQueue();
+        assertThat(mailQueueItem.getMail().getMaybeSender())
+            .isEqualTo(MaybeSender.nullSender());
     }
 
     @Test
@@ -113,8 +128,8 @@ public interface MailQueueContract {
             .build());
 
         MailQueue.MailQueueItem mailQueueItem = getMailQueue().deQueue();
-        assertThat(mailQueueItem.getMail().getSender())
-            .isEqualTo(SENDER);
+        assertThat(mailQueueItem.getMail().getMaybeSender())
+            .isEqualTo(MaybeSender.of(SENDER));
     }
 
     @Test

http://git-wip-us.apache.org/repos/asf/james-project/blob/8ce35148/server/queue/queue-jms/src/main/java/org/apache/james/queue/jms/JMSMailQueue.java
----------------------------------------------------------------------
diff --git 
a/server/queue/queue-jms/src/main/java/org/apache/james/queue/jms/JMSMailQueue.java
 
b/server/queue/queue-jms/src/main/java/org/apache/james/queue/jms/JMSMailQueue.java
index 9795896..0684d45 100644
--- 
a/server/queue/queue-jms/src/main/java/org/apache/james/queue/jms/JMSMailQueue.java
+++ 
b/server/queue/queue-jms/src/main/java/org/apache/james/queue/jms/JMSMailQueue.java
@@ -333,7 +333,7 @@ public class JMSMailQueue implements ManageableMailQueue, 
JMSSupport, MailPriori
         props.put(JAMES_MAIL_REMOTEADDR, mail.getRemoteAddr());
         props.put(JAMES_MAIL_REMOTEHOST, mail.getRemoteHost());
 
-        String sender = 
Optional.ofNullable(mail.getSender()).map(MailAddress::asString).orElse("");
+        String sender = mail.getMaybeSender().asString("");
 
         
org.apache.james.util.streams.Iterators.toStream(mail.getAttributeNames())
                 .forEach(attrName -> props.put(attrName, 
SerializationUtil.serialize(mail.getAttribute(attrName))));

http://git-wip-us.apache.org/repos/asf/james-project/blob/8ce35148/server/queue/queue-jms/src/main/java/org/apache/james/queue/library/MailQueueManagement.java
----------------------------------------------------------------------
diff --git 
a/server/queue/queue-jms/src/main/java/org/apache/james/queue/library/MailQueueManagement.java
 
b/server/queue/queue-jms/src/main/java/org/apache/james/queue/library/MailQueueManagement.java
index b846f33..3d32cd6 100644
--- 
a/server/queue/queue-jms/src/main/java/org/apache/james/queue/library/MailQueueManagement.java
+++ 
b/server/queue/queue-jms/src/main/java/org/apache/james/queue/library/MailQueueManagement.java
@@ -127,11 +127,7 @@ public class MailQueueManagement extends StandardMBean 
implements MailQueueManag
             Optional<ZonedDateTime> nextDelivery = mView.getNextDelivery();
             Map<String, Object> map = new HashMap<>();
             map.put(names[0], m.getName());
-            String sender = null;
-            MailAddress senderAddress = m.getSender();
-            if (senderAddress != null) {
-                sender = senderAddress.toString();
-            }
+            String sender = m.getMaybeSender().asString(null);
             map.put(names[1], sender);
             map.put(names[2], m.getState());
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/8ce35148/server/queue/queue-memory/src/main/java/org/apache/james/queue/memory/MemoryMailQueueFactory.java
----------------------------------------------------------------------
diff --git 
a/server/queue/queue-memory/src/main/java/org/apache/james/queue/memory/MemoryMailQueueFactory.java
 
b/server/queue/queue-memory/src/main/java/org/apache/james/queue/memory/MemoryMailQueueFactory.java
index 6120272..9704906 100644
--- 
a/server/queue/queue-memory/src/main/java/org/apache/james/queue/memory/MemoryMailQueueFactory.java
+++ 
b/server/queue/queue-memory/src/main/java/org/apache/james/queue/memory/MemoryMailQueueFactory.java
@@ -192,7 +192,7 @@ public class MemoryMailQueueFactory implements 
MailQueueFactory<ManageableMailQu
                         .map(MailAddress::asString)
                         .anyMatch(value::equals);
                 case Sender:
-                    return item.getMail().getSender()
+                    return item.getMail().getMaybeSender()
                         .asString()
                         .equals(value);
                 default:

http://git-wip-us.apache.org/repos/asf/james-project/blob/8ce35148/server/queue/queue-rabbitmq/src/main/java/org/apache/james/queue/rabbitmq/MailReferenceDTO.java
----------------------------------------------------------------------
diff --git 
a/server/queue/queue-rabbitmq/src/main/java/org/apache/james/queue/rabbitmq/MailReferenceDTO.java
 
b/server/queue/queue-rabbitmq/src/main/java/org/apache/james/queue/rabbitmq/MailReferenceDTO.java
index 1c25f09..e93394d 100644
--- 
a/server/queue/queue-rabbitmq/src/main/java/org/apache/james/queue/rabbitmq/MailReferenceDTO.java
+++ 
b/server/queue/queue-rabbitmq/src/main/java/org/apache/james/queue/rabbitmq/MailReferenceDTO.java
@@ -56,7 +56,7 @@ class MailReferenceDTO {
                 .map(MailAddress::asString)
                 .collect(Guavate.toImmutableList()),
             mail.getName(),
-            Optional.ofNullable(mail.getSender()).map(MailAddress::asString),
+            mail.getMaybeSender().asOptional().map(MailAddress::asString),
             mail.getState(),
             mail.getErrorMessage(),
             Optional.ofNullable(mail.getLastUpdated()).map(Date::toInstant),

http://git-wip-us.apache.org/repos/asf/james-project/blob/8ce35148/server/queue/queue-rabbitmq/src/main/java/org/apache/james/queue/rabbitmq/view/api/DeleteCondition.java
----------------------------------------------------------------------
diff --git 
a/server/queue/queue-rabbitmq/src/main/java/org/apache/james/queue/rabbitmq/view/api/DeleteCondition.java
 
b/server/queue/queue-rabbitmq/src/main/java/org/apache/james/queue/rabbitmq/view/api/DeleteCondition.java
index 33ad227..4424750 100644
--- 
a/server/queue/queue-rabbitmq/src/main/java/org/apache/james/queue/rabbitmq/view/api/DeleteCondition.java
+++ 
b/server/queue/queue-rabbitmq/src/main/java/org/apache/james/queue/rabbitmq/view/api/DeleteCondition.java
@@ -58,7 +58,9 @@ public interface DeleteCondition {
         @Override
         public boolean shouldBeDeleted(Mail mail) {
             Preconditions.checkNotNull(mail);
-            return mail.getSender().asString().equals(senderAsString);
+            return mail.getMaybeSender()
+                .asString()
+                .equals(senderAsString);
         }
 
         @Override

http://git-wip-us.apache.org/repos/asf/james-project/blob/8ce35148/server/queue/queue-rabbitmq/src/main/java/org/apache/james/queue/rabbitmq/view/cassandra/EnqueuedMailsDAO.java
----------------------------------------------------------------------
diff --git 
a/server/queue/queue-rabbitmq/src/main/java/org/apache/james/queue/rabbitmq/view/cassandra/EnqueuedMailsDAO.java
 
b/server/queue/queue-rabbitmq/src/main/java/org/apache/james/queue/rabbitmq/view/cassandra/EnqueuedMailsDAO.java
index 6c3318b..aada3b9 100644
--- 
a/server/queue/queue-rabbitmq/src/main/java/org/apache/james/queue/rabbitmq/view/cassandra/EnqueuedMailsDAO.java
+++ 
b/server/queue/queue-rabbitmq/src/main/java/org/apache/james/queue/rabbitmq/view/cassandra/EnqueuedMailsDAO.java
@@ -47,7 +47,6 @@ import static 
org.apache.james.queue.rabbitmq.view.cassandra.model.BucketedSlice
 import static 
org.apache.james.queue.rabbitmq.view.cassandra.model.BucketedSlices.Slice;
 
 import java.util.Date;
-import java.util.Optional;
 import java.util.concurrent.CompletableFuture;
 import java.util.stream.Stream;
 
@@ -58,7 +57,6 @@ import 
org.apache.james.backends.cassandra.utils.CassandraAsyncExecutor;
 import org.apache.james.backends.cassandra.utils.CassandraUtils;
 import org.apache.james.blob.api.BlobId;
 import org.apache.james.blob.mail.MimeMessagePartsId;
-import org.apache.james.core.MailAddress;
 import org.apache.james.queue.rabbitmq.EnqueuedItem;
 import org.apache.james.queue.rabbitmq.MailQueueName;
 import 
org.apache.james.queue.rabbitmq.view.cassandra.model.EnqueuedItemWithSlicingContext;
@@ -131,9 +129,7 @@ class EnqueuedMailsDAO {
             .setString(HEADER_BLOB_ID, 
mimeMessagePartsId.getHeaderBlobId().asString())
             .setString(BODY_BLOB_ID, 
mimeMessagePartsId.getBodyBlobId().asString())
             .setString(STATE, mail.getState())
-            .setString(SENDER, Optional.ofNullable(mail.getSender())
-                .map(MailAddress::asString)
-                .orElse(null))
+            .setString(SENDER, mail.getMaybeSender().asString(null))
             .setList(RECIPIENTS, asStringList(mail.getRecipients()))
             .setString(ERROR_MESSAGE, mail.getErrorMessage())
             .setString(REMOTE_ADDR, mail.getRemoteAddr())

http://git-wip-us.apache.org/repos/asf/james-project/blob/8ce35148/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 0ae1930..e3dbe7c 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
@@ -113,7 +113,7 @@ public class SMTPMessageSender extends ExternalResource 
implements Closeable {
     }
 
     public SMTPMessageSender sendMessage(Mail mail) throws MessagingException, 
IOException {
-        String from = mail.getSender().asString();
+        String from = mail.getMaybeSender().asString();
         doHelo();
         doSetSender(from);
         mail.getRecipients().stream()


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

Reply via email to