Пример #1
0
  @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;
      }
    }
  }