X-Git-Url: http://www.git.stargrave.org/?a=blobdiff_plain;f=public-inbox-mda;h=aabc37ebf3c4b0a2c6ba3ed090c49c775406551b;hb=aca047222a47e8d5277466d2dcc0618f12bdf8de;hp=291b55748a70fdd306eaa713e621d09a3cee2188;hpb=858f0a2960123d6d2cbced1bb18e4e5e524df21e;p=public-inbox.git diff --git a/public-inbox-mda b/public-inbox-mda index 291b5574..aabc37eb 100755 --- a/public-inbox-mda +++ b/public-inbox-mda @@ -3,17 +3,36 @@ # License: AGPLv3 or later (https://www.gnu.org/licenses/agpl-3.0.txt) use strict; use warnings; +my $usage = 'public-inbox-mda < rfc2822_message'; + use Email::Filter; use Email::Address; -use PublicInbox::Filter; +use File::Path::Expand qw/expand_filename/; use IPC::Run qw(run); -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"; +use constant MDA => 'ssoma-mda'; +use PublicInbox; +use PublicInbox::Filter; +use PublicInbox::Config; + +# n.b: hopefully we can setup the failbox 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 $failbox = $ENV{PI_FAILBOX} || '~/public-inbox-fail.mbox'; +$failbox = expand_filename($failbox); + +# this reads the message from stdin +my $filter = Email::Filter->new(emergency => $failbox); +my $config = PublicInbox::Config->new; + +my $recipient = $ENV{RECIPIENT}; +defined $recipient or die "RECIPIENT not defined in ENV\n"; +my $dst = $config->lookup($recipient); +defined $dst or exit(1); +my $main_repo = $dst->{mainrepo} or exit(1); +my $filtered; # string dest -my $filtered; -if (PublicInbox->precheck($filter) && do_spamc($filter->simple, \$filtered)) { +if (PublicInbox->precheck($filter, $recipient) && + do_spamc($filter->simple, \$filtered)) { # update our message with SA headers (in case our filter rejects it) my $simple = Email::Simple->new($filtered); $filtered = undef; @@ -23,20 +42,11 @@ if (PublicInbox->precheck($filter) && do_spamc($filter->simple, \$filtered)) { # run spamc again on the HTML-free message if (do_spamc($simple, \$filtered)) { $filter->simple(Email::Simple->new($filtered)); - $filter->pipe("ssoma-mda", $main_repo); - } else { - $filter->pipe("ssoma-mda", $fail_repo); + $filter->pipe(MDA, $main_repo); } - } else { - # PublicInbox::Filter nuked everything, oops :x - $filter->pipe("ssoma-mda", $fail_repo); } -} else { - # if SA thinks it's spam or there's an error: - # don't bother with our own filtering - $filter->pipe("ssoma-mda", $fail_repo); } -die "Email::Filter failed to exit\n"; +exit 0; # goes to failbox # we depend on "report_safe 0" in /etc/spamassassin/*.cf with --headers # not using Email::Filter->pipe here since we want the stdout of