-my $usage = "public-inbox-mda main_repo fail_repo < rfc2822_message";
-my $filter = Email::Filter->new(emergency => "~/emergency.mbox");
-my $main_repo = shift @ARGV or die "Usage: $usage\n";
-my $fail_repo = shift @ARGV or die "Usage: $usage\n";
-my $max = 1024 * 500; # same as spamc
-
-my $filtered;
-if ($filter->simple->header("From")
- && length($filter->simple->as_string) <= $max
- && PublicInbox->recipient_specified($filter)
- && do_spamc($filter->simple, \$filtered)) {
+use PublicInbox::MDA;
+use PublicInbox::Filter;
+use PublicInbox::Config;
+
+# n.b: hopefully we can setup the emergency path without bailing due to
+# user error, we really want to setup the emergency destination ASAP
+# in case there's bugs in our code or user error.
+my $emergency = $ENV{PI_EMERGENCY} || '~/.public-inbox/emergency/';
+$emergency = expand_filename($emergency);
+
+# this reads the message from stdin
+my $filter = Email::Filter->new(emergency => $emergency);
+my $config = PublicInbox::Config->new;
+
+my $recipient = $ENV{ORIGINAL_RECIPIENT};
+defined $recipient or die "ORIGINAL_RECIPIENT not defined in ENV\n";
+my $dst = $config->lookup($recipient); # first check
+defined $dst or exit(1);
+my $main_repo = $dst->{mainrepo} or exit(1);
+my $filtered; # string dest
+
+if (PublicInbox::MDA->precheck($filter, $dst->{address}) &&
+ do_spamc($filter->simple, \$filtered)) {