On Mon, Aug 19, 2019 at 01:48:05PM -0500, Edgar Pettijohn wrote:
> Nothing urgent here. Probably can wait for filter documentation. However,
> I've been
> playing with filters off and on with limited success. It seems like data-line
> will
> be the most useful to filter on so thats been my focus lately. I have the
> following
> script:
>
> #!/usr/bin/perl
>
> use strict;
> use warnings;
> use diagnostics;
>
> open(my $fh, '>', '/tmp/log.txt') or die $!;
>
> # remove line buffering
> select(STDOUT);
> $|++;
> select($fh);
> $|++;
>
> print STDOUT "register|filter|smtp-in|data-line\n";
> print STDOUT "register|ready\n";
>
> while ( <> ) {
> chomp; # get rid of newline
>
> my @report = split /\|/;
>
> next if $report[0] eq 'config';
>
> foreach (@report) {
> print $fh "$_\|"; # just to see whats there
> }
> print $fh "\n";
>
> my $inbody = 0;
> my ($sid, $token, $line);
> $sid = $report[5];
> $token = $report[6];
> $line = $report[$#report];
> if ($report[0] eq 'filter' and $report[3] eq 'smtp-in' and $report[4]
> eq 'data-line') {
> die "invalid filter command" if (scalar @report < 7);
> if ($line eq '') { print $fh "end of headers\n"; $inbody++; }
> if ($line eq '.') { print $fh "end of message\n"; $inbody--; }
> print $fh "filter-dataline|$token|$sid|$line\n";
> print STDOUT "filter-dataline|$token|$sid|$line\n";
> }
> }
>
> close $fh;
>
> 0;
>
> It prints the following in /tmp/log.txt after a
> $ echo "HI" | mail edgar
>
> filter|0|1566239933.835511|smtp-in|data-line|c0002b41f6bd164d|ef8747a12860387a|Received:
> from localhost (deathstar.my.domain [local])|
> filter-dataline|ef8747a12860387a|c0002b41f6bd164d|Received: from localhost
> (deathstar.my.domain [local])
> filter|0|1566239933.835523|smtp-in|data-line|c0002b41f6bd164d|ef8747a12860387a|
> by deathstar.my.domain (OpenSMTPD) with ESMTPA id 7052ea5a|
> filter-dataline|ef8747a12860387a|c0002b41f6bd164d| by
> deathstar.my.domain (OpenSMTPD) with ESMTPA id 7052ea5a
> filter|0|1566239933.835529|smtp-in|data-line|c0002b41f6bd164d|ef8747a12860387a|
> for <[email protected]>;|
> filter-dataline|ef8747a12860387a|c0002b41f6bd164d| for
> <[email protected]>;
> filter|0|1566239933.835533|smtp-in|data-line|c0002b41f6bd164d|ef8747a12860387a|
> Mon, 19 Aug 2019 13:38:53 -0500 (CDT)|
> filter-dataline|ef8747a12860387a|c0002b41f6bd164d| Mon, 19 Aug 2019
> 13:38:53 -0500 (CDT)
> filter|0|1566239933.836673|smtp-in|data-line|c0002b41f6bd164d|ef8747a12860387a|From:
> Edgar Pettijohn <[email protected]>|
> filter-dataline|ef8747a12860387a|c0002b41f6bd164d|From: Edgar Pettijohn
> <[email protected]>
> filter|0|1566239933.836681|smtp-in|data-line|c0002b41f6bd164d|ef8747a12860387a|Date:
> Mon, 19 Aug 2019 13:38:53 -0500 (CDT)|
> filter-dataline|ef8747a12860387a|c0002b41f6bd164d|Date: Mon, 19 Aug 2019
> 13:38:53 -0500 (CDT)
> filter|0|1566239933.836685|smtp-in|data-line|c0002b41f6bd164d|ef8747a12860387a|To:
> edgar|
> filter-dataline|ef8747a12860387a|c0002b41f6bd164d|To: edgar
> filter|0|1566239933.836688|smtp-in|data-line|c0002b41f6bd164d|ef8747a12860387a|
> filter-dataline|ef8747a12860387a|c0002b41f6bd164d|ef8747a12860387a
> filter|0|1566239933.836692|smtp-in|data-line|c0002b41f6bd164d|ef8747a12860387a|HI|
> filter-dataline|ef8747a12860387a|c0002b41f6bd164d|HI
> filter|0|1566239933.836695|smtp-in|data-line|c0002b41f6bd164d|ef8747a12860387a|.|
> end of message
> filter-dataline|ef8747a12860387a|c0002b41f6bd164d|.
>
> I get the following response:
> deathstar$ sendmail: command failed: 550 5.7.1 Delivery not authorized,
> message refused: Message is not RFC 2822 compliant
>
> I see the same from a telnet session as well.
>
> So there are 2 problems. First my script doesn't appear to acurately
> determine that the headers are finished. Second mail
> doesn't go through. Any suggestions are appreciated.
>
This error occurs when you don't have at least an empty line to separate
headers from the body.
Based on your output, it seems that you are generating a bad line:
> filter|0|1566239933.836688|smtp-in|data-line|c0002b41f6bd164d|ef8747a12860387a|
> filter-dataline|ef8747a12860387a|c0002b41f6bd164d|ef8747a12860387a
There should be a | at the end of your filter-dataline because it is not
valid as is, I'll check why smtpd did not hit a fatal.
--
Gilles Chehade @poolpOrg
https://www.poolp.org patreon: https://www.patreon.com/gilles