@Override public LmtpReply getAddressStatus(LmtpAddress address) { String addr = address.getEmailAddress(); try { Provisioning prov = Provisioning.getInstance(); Account acct = prov.get(AccountBy.name, addr); if (acct == null) { ZimbraLog.lmtp.info("rejecting address " + addr + ": no account"); return LmtpReply.NO_SUCH_USER; } String acctStatus = acct.getAccountStatus(prov); if (acctStatus == null) { ZimbraLog.lmtp.warn("rejecting address " + addr + ": no account status"); return LmtpReply.NO_SUCH_USER; } if (acctStatus.equals(Provisioning.ACCOUNT_STATUS_MAINTENANCE)) { ZimbraLog.lmtp.info("try again for address " + addr + ": account status maintenance"); return LmtpReply.MAILBOX_DISABLED; } if (Provisioning.onLocalServer(acct)) { address.setOnLocalServer(true); } else if (Provisioning.getInstance().getServer(acct) != null) { address.setOnLocalServer(false); address.setRemoteServer(acct.getMailHost()); } else { ZimbraLog.lmtp.warn("try again for address " + addr + ": mailbox is not on this server"); return LmtpReply.MAILBOX_NOT_ON_THIS_SERVER; } if (acctStatus.equals(Provisioning.ACCOUNT_STATUS_PENDING)) { ZimbraLog.lmtp.info("rejecting address " + addr + ": account status pending"); return LmtpReply.NO_SUCH_USER; } if (acctStatus.equals(Provisioning.ACCOUNT_STATUS_CLOSED)) { ZimbraLog.lmtp.info("rejecting address " + addr + ": account status closed"); return LmtpReply.NO_SUCH_USER; } if (acctStatus.equals(Provisioning.ACCOUNT_STATUS_ACTIVE) || acctStatus.equals(Provisioning.ACCOUNT_STATUS_LOCKOUT) || acctStatus.equals(Provisioning.ACCOUNT_STATUS_LOCKED)) { return LmtpReply.RECIPIENT_OK; } ZimbraLog.lmtp.info("rejecting address " + addr + ": unknown account status " + acctStatus); return LmtpReply.NO_SUCH_USER; } catch (ServiceException e) { if (e.isReceiversFault()) { ZimbraLog.lmtp.warn("try again for address " + addr + ": exception occurred", e); return LmtpReply.MAILBOX_DISABLED; } else { ZimbraLog.lmtp.warn("rejecting address " + addr + ": exception occurred", e); return LmtpReply.NO_SUCH_USER; } } }