sub hook_rcpt { my ($self, $transaction, $rcpt) = @_; return DECLINED unless $rcpt->notes('evil_space'); if (my $co = $self->qp->connection->notes('client_options')) { if ($co->{evil_space}{skip}) { $self->log(LOGINFO, "client is whitelisted, skipping evil_space checks"); return DECLINED } } if (my $cmd = $self->connection->notes('original_string')) { $self->log(LOGINFO, "cmd = <$cmd>"); if ($cmd =~ /^RCPT TO:\s/i) { $self->log(LOGINFO, "evil space found"); return DENY, "evil space found"; } elsif ($cmd =~ /^RCPT TO:[^<]/) { $self->log(LOGINFO, "< missing"); return DENY, "< missing"; } else { return DECLINED; } } else { $self->log(LOGERROR, "original_string missing."); return DECLINED; } }