public HookResult onMessage()

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();
    }