filtering on two headers at once / blocking out-of-office replies to a list

Mark Martinec Mark.Martinec+amavis at
Wed Dec 14 19:43:38 CET 2011


> We have a departmental mail server set up with a postfix/amavisd-new mail
> gateway.
> The problem I'm having is that out-of-office replies from some members of
> one of our mailing lists are being sent to the list itself rather than the
> sender of a specific message.
> I don't want to block all out-of-office messages from coming in, only those
> addressed to the mailing list itself. I also don't want to block all
> messages to the list address, as that would prevent some members from
> sending messages to the list.
> What I've come up with so far is that the while the out-of-office messages
> ostensibly come from the user, the Return-Path header is set to <>:
> Return-Path: <>
> I'd like to set up a filter that says:
> if Return-Path: = <> and To: = the_list_address
> then DISCARD
> Unfortunately, postfix header_checks only operate on one header at a time.
> Is there some way I could set up a custom filter in amavisd that would do
> what I want? I've been digging through the documentation, and while it
> *seems* possible I'm still not seeing what path I should investigate.

Yes, a custom hook could do the trick:


/etc/amavisd-custom.conf :

package Amavis::Custom;
use strict;
  import Amavis::Conf qw(:platform c cr ca);
  import Amavis::Util qw(do_log);

sub new {
  my($class,$conn,$msginfo) = @_;
  bless {}, $class;

sub checks {
  my($self,$conn,$msginfo) = @_;
  my(@rfc2822_to) = do { my $f = $msginfo->rfc2822_to; ref $f ? @$f : $f };
  if ($msginfo->is_auto &&
      grep(lc($_) eq lc('a.mailing.list at'), @rfc2822_to)) {
    do_log(5, "custom checks: blocking an autoresponse");
    for my $r (@{$msginfo->per_recip_data}) {  # for each recipient
      next  if $r->recip_done;  # already dealt with
      $r->recip_smtp_response('554 5.7.0 Auto-responses to a mailing list '.
                              'are rejected');
      $r->spam_tests([])  if !defined $r->spam_tests;
      unshift(@{$r->spam_tests}, \'AM.AUTORESP');

1;  # insure a defined return

If using SpamAssassin, using a meta rule would be more straightforward.


More information about the amavis-users mailing list