X-Git-Url: http://www.git.stargrave.org/?a=blobdiff_plain;f=public-inbox-mda;h=50805da2e6ecc99b679cc69dacfea1caa6e37e21;hb=e022d3377fd2c50fd9931bf96394728958a90bf3;hp=1f4d339f63eaa1e561586cae84ed9334634d9d90;hpb=6dfb9311700d09fb019bee74d2b420c6cdea8b8f;p=public-inbox.git diff --git a/public-inbox-mda b/public-inbox-mda index 1f4d339f..50805da2 100755 --- a/public-inbox-mda +++ b/public-inbox-mda @@ -6,13 +6,11 @@ use warnings; my $usage = 'public-inbox-mda < rfc2822_message'; use Email::Filter; +use Email::MIME; use Email::Address; -use Encode qw/decode encode/; -use Encode::MIME::Header; use File::Path::Expand qw/expand_filename/; use IPC::Run qw(run); -use constant MDA => 'ssoma-mda'; -use PublicInbox; +use PublicInbox::MDA; use PublicInbox::Filter; use PublicInbox::Config; @@ -26,41 +24,36 @@ $emergency = expand_filename($emergency); my $filter = Email::Filter->new(emergency => $emergency); my $config = PublicInbox::Config->new; -my $recipient = $ENV{RECIPIENT}; -defined $recipient or die "RECIPIENT not defined in ENV\n"; +my $recipient = $ENV{ORIGINAL_RECIPIENT}; +defined $recipient or die "ORIGINAL_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 -if (PublicInbox->precheck($filter, $recipient) && +if (PublicInbox::MDA->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); + my $msg = Email::Simple->new($filtered); $filtered = undef; - $filter->simple($simple); + $filter->simple($msg); - if (PublicInbox::Filter->run($simple)) { + if (PublicInbox::Filter->run($msg)) { # run spamc again on the HTML-free message - if (do_spamc($simple, \$filtered)) { - $simple = Email::Simple->new($filtered); - set_list_headers($simple, $dst); - $filter->simple($simple); + if (do_spamc($msg, \$filtered)) { + $msg = Email::MIME->new($filtered); + PublicInbox::MDA->set_list_headers($msg, $dst); + $filter->simple($msg); - my $from = decode('MIME-Header', $filter->from); - $from = encode("utf8", $from); - my @from = Email::Address->parse($from); - my $name = $from[0]->name; - defined $name or $name = ""; - my $email = $from[0]->address; - defined $email or $email = ""; + my ($name, $email, $date) = + PublicInbox::MDA->author_info($msg); local $ENV{GIT_AUTHOR_NAME} = $name; local $ENV{GIT_AUTHOR_EMAIL} = $email; - local $ENV{GIT_AUTHOR_DATE} = $simple->header("Date"); + local $ENV{GIT_AUTHOR_DATE} = $date; local $ENV{GIT_COMMITTER_EMAIL} = $recipient; local $ENV{GIT_COMMITTER_NAME} = $dst->{listname}; - $filter->pipe(MDA, '-1', $main_repo); + $filter->pipe(PublicInbox::MDA->cmd, $main_repo); } } } @@ -70,25 +63,11 @@ exit 0; # goes to emergency # not using Email::Filter->pipe here since we want the stdout of # the command even on failure (spamc will set $? on error). sub do_spamc { - my ($simple, $out) = @_; + my ($msg, $out) = @_; eval { - my $orig = $simple->as_string; + my $orig = $msg->as_string; run([qw/spamc -E --headers/], \$orig, $out); }; return ($@ || $? || !defined($$out) || length($$out) == 0) ? 0 : 1; } - -# RFC2919 and RFC2369 -sub set_list_headers { - my ($simple, $dst) = @_; - my $pa = "<$dst->{-primary_address}>"; - $simple->header_set("List-Id", $pa); - $simple->header_set("List-Post", $pa); - - my $url = $dst->{url}; - if (defined $url) { - $simple->header_set("List-Archive", "<$url>"); - $simple->header_set("List-Help", "<${url}help>"); - } -}