This is a great idea. This is a spam filter that is integrated into a
CRM system, so I needed to parse and dump the information so it could be
sucked up later.

Here's what I ultimately created. It still needs some work (mainly
because it re-reads the whole file every time, and I should use
timestamps and a half-interval search algorithm to find the
last-processed time stamp. I am relying on log rotate to make it
not-too-terribly-big).

https://github.com/mjmunger/postfix-log-parser


Michael Munger, dCAP, MCPS, MCNPS, MBSS
High Powered Help, Inc.
Microsoft Certified Professional
Microsoft Certified Small Business Specialist
Digium Certified Asterisk Professional
mich...@highpoweredhelp.com
On 12/02/2016 01:30 AM, @ wrote:
> On 11/30/16 2:35 PM, Michael Munger wrote:
>
>> I am writing a log parser so that when users complain "so and so sent me
>> an email and I didn't get it" I can query the logs and find this with
>> ease. Ultimately, I want ot make this self service through a web page.
> I went a different way. Users can chose to receive a "DMR" (Daily Mail
> Report) and that report can contain either all the rejected email
> addresses that were not accepted for their account (or domain), all
> the accepted emails they got, or both.
>
> I have a bash script that does it, and when a user wants this, I
> simply set up a crontab for them. Usually after a week or so they want
> it turned off. The script sends them a lightly styled HTML table in
> the email.
>
> The heart of the script is:
>
>  if [ "$REJECT" = 1 ]; then
>   echo '<tr><th>&nbsp;</th><th>IP address</th><th>Claimed
> address</th></tr>'
>     bzgrep "$MATCHPAT" $LOGF | grep -i reject | egrep 'from=<[^>]+>' |
> grep -v "Protocol error" | \
>      grep -v "$EXCLUDE" | sort -u | sed 's/from=<//' | tr -d '>,[]:' |
> grep -v rejected | \
>      awk '{print "<tr><td class=\"rej\">REJECTED</td><td
> class=\"right\">"$16"</td><td>"$20"</td></tr>"}'
>   fi
>
>   if [ "$ACCEPT" = 1 ]; then
>     echo '<tr><th style="width:8em;">Accepted ID</th><th
> style="width:6em;">Time</th><th>From</th></tr>'
>      bzgrep -E 'DATA|\"from=\"' $LOGF | grep -v "<>"| \
>         awk '{print $6"\t"$3"\t"$17"\t"$16}' | grep -v ESMTP | \
>         grep -v "to=<backup" | column -t | sort -k 2 | grep
> "to=<.*$MATCHPAT" | \
>         grep -v "$EXCLUDE" | sed 's/from//g' | sed 's/://' | tr -d
> '=><' |
>         awk '{print "<tr><td class=\"right qid\">"$1"</td><td
> class=\"right\">"$2"</td><td>"$4"</td></tr>"}'
>    fi
>
> For this to work
>
> smtpd_log_access_permit_actions = static:all
>
> must be set in main.cf. This makes your logs chattier, but provides me
> with the line in the logs that I need to get this working.
>
> One user, in particular, was calling several times a week looking for
> an email and now never calls.
>
>
>

Reply via email to