in server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/SendMailHandler.java [83:152]
public HookResult onMessage(SMTPSession session, Mail mail) {
LOGGER.debug("sending mail");
try (Closeable closeable = MDCBuilder.ofValue("messageId", mail.getMessage().getMessageID()).build()) {
Optional<FutureReleaseParameters.HoldFor> delays = session.getAttachment(FUTURERELEASE_HOLDFOR, ProtocolSession.State.Transaction);
delays.ifPresentOrElse(Throwing.consumer(holdFor -> {
queue.enQueue(mail, holdFor.value());
LOGGER.info("Successfully spooled mail {} with messageId {} from {} on {} for {} with delay {}", mail.getName(),
mail.getMessage().getMessageID(),
mail.getMaybeSender().asString(),
session.getRemoteAddress().getAddress(),
mail.getRecipients(),
holdFor.value());
AuditTrail.entry()
.username(() -> Optional.ofNullable(session.getUsername())
.map(Username::asString)
.orElse(""))
.remoteIP(() -> Optional.ofNullable(session.getRemoteAddress()))
.sessionId(session::getSessionID)
.protocol("SMTP")
.action("SPOOL")
.parameters(Throwing.supplier(() -> ImmutableMap.of("mailId", mail.getName(),
"mimeMessageId", Optional.ofNullable(mail.getMessage())
.map(Throwing.function(MimeMessage::getMessageID))
.orElse(""),
"sender", mail.getMaybeSender().asString(),
"size", Long.toString(mail.getMessageSize()),
"recipients", StringUtils.join(mail.getRecipients()),
"holdFor", holdFor.value().toString())))
.log("SMTP mail spooled.");
}),
Throwing.runnable(() -> {
queue.enQueue(mail);
LOGGER.info("Successfully spooled mail {} with messageId {} from {} on {} for {}", mail.getName(),
mail.getMessage().getMessageID(),
mail.getMaybeSender().asString(),
session.getRemoteAddress().getAddress(),
mail.getRecipients());
AuditTrail.entry()
.username(() -> Optional.ofNullable(session.getUsername())
.map(Username::asString)
.orElse(""))
.remoteIP(() -> Optional.ofNullable(session.getRemoteAddress()))
.sessionId(session::getSessionID)
.protocol("SMTP")
.action("SPOOL")
.parameters(Throwing.supplier(() -> ImmutableMap.of("mailId", mail.getName(),
"mimeMessageId", Optional.ofNullable(mail.getMessage())
.map(Throwing.function(MimeMessage::getMessageID))
.orElse(""),
"sender", mail.getMaybeSender().asString(),
"size", Long.toString(mail.getMessageSize()),
"recipients", StringUtils.join(mail.getRecipients()))))
.log("SMTP mail spooled.");
}));
} catch (Exception me) {
LOGGER.error("Unknown error occurred while processing DATA.", me);
return HookResult.builder()
.hookReturnCode(HookReturnCode.denySoft())
.smtpDescription(DSNStatus.getStatus(DSNStatus.TRANSIENT, DSNStatus.UNDEFINED_STATUS) + " Error processing message.")
.build();
}
return HookResult.builder()
.hookReturnCode(HookReturnCode.ok())
.smtpDescription(DSNStatus.getStatus(DSNStatus.SUCCESS, DSNStatus.CONTENT_OTHER) + " Message received")
.build();
}