@Override protected HookResult callHook(HeloHook rawHook, SMTPSession session, String parameters) { return rawHook.doHelo(session, parameters); }
@Override protected HookResult callHook(QuitHook rawHook, SMTPSession session, String parameters) { return rawHook.doQuit(session); }
public static HookReturnCode ok() { return connected(Action.OK); }
public HookResult reject(MailAddress rcpt) { LOGGER.info("Rejected message. Unknown user: {}", rcpt); return HookResult.builder() .hookReturnCode(HookReturnCode.deny()) .smtpReturnCode(SMTPRetCode.MAILBOX_PERM_UNAVAILABLE) .smtpDescription(DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.ADDRESS_MAILBOX) + " Unknown user: " + rcpt.asString()) .build(); }
@Override public HookResult doUnknown(SMTPSession session, String command) { Integer count = (Integer) session.getAttachment(UNKOWN_COMMAND_COUNT, State.Transaction); if (count == null) { count = 1; } else { count++; } session.setAttachment(UNKOWN_COMMAND_COUNT, count, State.Transaction); if (count > maxUnknown) { return HookResult.builder() .hookReturnCode(HookReturnCode.disconnected(HookReturnCode.Action.DENY)) .smtpReturnCode("521") .smtpDescription("Closing connection as too many unknown commands received") .build(); } else { return HookResult.DECLINED; } }
@Override public HookResult doAuth(SMTPSession session, String username, String password) { try { if (users.test(username, password)) { session.setUser(username); session.setRelayingAllowed(true); return HookResult.builder() .hookReturnCode(HookReturnCode.ok()) .smtpDescription("Authentication Successful") .build(); } } catch (UsersRepositoryException e) { LOGGER.info("Unable to access UsersRepository", e); } return HookResult.DECLINED; }
@Override public HookResult deliver(SMTPSession session, MailAddress recipient, MailEnvelope envelope) { if (result == null) { result = hook.onMessage(session, envelope); } return result; }
public static HookReturnCode connected(Action action) { return new HookReturnCode(action, ConnectionStatus.Connected); }
private Optional<String> retrieveDefaultSmtpDescription(HookReturnCode returnCode) { switch (returnCode.getAction()) { case DENY: return Optional.of("Authentication Failed"); case DENYSOFT: return Optional.of("Temporary problem. Please try again later"); case OK: return Optional.of("Authentication Succesfull"); case DECLINED: case NONE: break; } return Optional.empty(); }
/** * @see org.apache.james.protocols.smtp.hook.MailHook#doMail(org.apache.james.protocols.smtp.SMTPSession, org.apache.mailet.MailAddress) */ public HookResult doMail(SMTPSession session, MailAddress sender) { doSPFCheck(session,sender); return new HookResult(HookReturnCode.DECLINED); }
public static Builder builder() { return new Builder(); }
@Override protected HookResult callHook(MailHook rawHook, SMTPSession session, String parameters) { MaybeSender sender = (MaybeSender) session.getAttachment(SMTPSession.SENDER, State.Transaction); return rawHook.doMail(session, sender); }
@Override protected HookResult callHook(RcptHook rawHook, SMTPSession session, String parameters) { MaybeSender sender = (MaybeSender) session.getAttachment(SMTPSession.SENDER, State.Transaction); return rawHook.doRcpt(session, sender, (MailAddress) session.getAttachment(CURRENT_RECIPIENT, State.Transaction)); }
@Override public HookResult doRcpt(SMTPSession session, MaybeSender sender, MailAddress rcpt) { if (check(session,rcpt)) { return HookResult.builder() .hookReturnCode(HookReturnCode.deny()) .smtpReturnCode(SMTPRetCode.SYNTAX_ERROR_ARGUMENTS) .smtpDescription(DSNStatus.getStatus(DSNStatus.PERMANENT, DSNStatus.DELIVERY_INVALID_ARG) + " Provided EHLO/HELO " + session.getAttachment(SMTPSession.CURRENT_HELO_NAME, State.Connection) + " can not resolved.") .build(); } else { return HookResult.DECLINED; } }
public static HookReturnCode disconnected(Action action) { return new HookReturnCode(action, ConnectionStatus.Disconnected); }
public static HookReturnCode declined() { return connected(Action.DECLINED); }
@Override protected HookResult callHook(HeloHook rawHook, SMTPSession session, String parameters) { return rawHook.doHelo(session, parameters); }
@Override public HookResult doMail(SMTPSession session, MaybeSender sender) { if (!sender.isNullSender() && !hasMXRecord(session,sender.get().getDomain().name())) { return HookResult.builder() .hookReturnCode(HookReturnCode.deny()) .smtpReturnCode(SMTPRetCode.SYNTAX_ERROR_ARGUMENTS) .smtpDescription(DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.ADDRESS_SYNTAX_SENDER) + " sender " + sender + " contains a domain with no valid MX records") .build(); } else { return HookResult.DECLINED; } }
public static HookReturnCode deny() { return connected(Action.DENY); }
public static HookReturnCode denySoft() { return connected(Action.DENYSOFT); }