[Mimedefang] Change subject according to string match in body

Johan Lundberg lundberg at nordu.net
Wed Jan 20 08:44:04 EST 2010


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

On 20/01/10 09:29, Steffen Kaiser wrote:
> On Tue, 19 Jan 2010, Johan Lundberg wrote:
> 
> Primary, follow the advice of Dave and move your check into filter().
> During this phase the module variables (globally defined varables
> in mimedefang-filter) are shared, hence, you can prepare the check in
> filter_begin(), e.g. open log file, prepare the condition when to search
> for the pattern, do the subject check etc, and end it in filter_end(),
> e.g close the log file.
> 
> If you read INPUTMSG directly, you have to deal with MIME encoding etc,
> hence, I would go the filter() route.
> 
> BTW: because multiple MIMEDefang processes may run simultaneously,
> you might loose log info. You should use Syslog.
> 
>> sub filter_end {
>> *snip* *snip*
>>    # Search for "pattern" in the mail body
>>    # and prepend subject with [See Me].
>>    my $sender = $entity->head->get('From',0);
> 
> Well, there is $Sender, which is the envelope MAIL FROM, which probably
> differs from the header. BTW: There is probably no From header.
> 
>>    if ($sender =~ /example\@example\.com/) {
> 
> I guess, you want to check anchored regex:
>     if ($sender =~ /\A(example\@example\.com|..)\z/) {
> 
>>        my $subject = $entity->head->get('Subject',0);
> 
> Already in $Subject
> 
>>        if ($subject =~ /pattern/i) {
>>            print INFO "Subject hit: Subject changed!\n";
>>            action_change_header('Subject', "[See Me]$subject");
>>        } else {
>>            my $body = $entity->bodyhandle;
> 
> I'm not sure, if this works with multipart MIME messages, at least you
> would need some checks.
> 
>>            my $IO = $body->open("r");
>>            while (defined($_ = $IO->getline)) {
>>                if (/pattern/i) {
>>                    print INFO "Body hit: Subject changed!\n";
>>                    print INFO "Body line: $_\n";
>>                    action_change_header('Subject', "[See Me]$subject");
>>                    last;
>>                }
> 
> 
> BTW: If you use SpamAssassin, you can create your own rule, score it with
> "0.0" - so the SPAM score is not changed - and check the matched rules
> for your one.

Thank you, both Dave and Steffen, for your great suggestions and pointers.

One of the problems with the e-mails I am looking for is that they are
encoded with base64 encoding (gaah!), so no go with the raw message
directly in Mimedefang. Before our mail setup was changed I had a little
python script together with procmail for decoding, matching and
manipulating. So my first idea was to use the raw message or the
action_external_filter() function and my python script but I think this
little snippet is better, don't you agree?

I have revised my code and moved it in to the filter subroutine as
suggested. Everything seems to work as intended. Time to test it on the
production system :)

sub filter {
*snip*
    if ($Sender =~ /\A(\<example\@example\.com\>)\z/) {
        if ($Subject =~ /pattern/i) {
            action_change_header('Subject', "[See Me]$Subject");
        }
        else {
            my $io;
            if ($io = $entity->open("r")) {
                while (defined($_ = $io->getline)) {
                    if (/pattern/i) {
                        action_change_header('Subject',"[See Me]$Subject");
                        last;
                    }
                }
            $io->close;
            }
        }
    }
}

Best regards,
- -- 
Johan Lundberg
NORDUnet NUNOC
lundberg at nordu.net
+46(0)8 207860
Tulegatan 11
113 53 Stockholm
Sweden
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.9 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/

iEYEARECAAYFAktXCKQACgkQkGqFZ2SyTVPGugCeLKFHtvFSoSrBfcpVdortTjs2
kZwAoJfvcTYOx/C34mNJwIYF+zbKWFtd
=hRSD
-----END PGP SIGNATURE-----



More information about the MIMEDefang mailing list