Skip to content

Commit

Permalink
Merge pull request #66 from fenugeek/master
Browse files Browse the repository at this point in the history
Move failed dmarc msgs to a different IMAP folder than the successfully processed ones
  • Loading branch information
techsneeze committed Aug 8, 2019
2 parents 9e96012 + 96f28fb commit bb5dd8b
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 20 deletions.
4 changes: 4 additions & 0 deletions dmarcts-report-parser.conf.sample
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,10 @@ $imapreadfolder = 'dmarc';
# the --delete option!)
$imapmovefolder = 'dmarc/processed';

# If $imapmovefoldererr is set, IMAP messages that fail will be moved. If unset, failed messages
# will move to $imapmovefolder (if it is set). Overruled by the --delete option!
$imapmovefoldererr = 'Inbox.notProcessed';

# maximum size of XML files to store in database, long files can cause transaction aborts
$maxsize_xml = 50000;
# store XML as base64 encopded gzip in database (save space, harder usable)
Expand Down
58 changes: 38 additions & 20 deletions dmarcts-report-parser.pl
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,8 @@ sub show_usage {
# Define all possible configuration options.
our ($debug, $delete_reports, $delete_failed, $reports_replace, $maxsize_xml, $compress_xml,
$dbname, $dbuser, $dbpass, $dbhost, $dbport,
$imapserver, $imapport, $imapuser, $imappass, $imapignoreerror, $imapssl, $imaptls, $imapmovefolder, $imapreadfolder, $imapopt, $tlsverify, $processInfo);
$imapserver, $imapport, $imapuser, $imappass, $imapignoreerror, $imapssl, $imaptls, $imapmovefolder,
$imapmovefoldererr, $imapreadfolder, $imapopt, $tlsverify, $processInfo);

# defaults
$maxsize_xml = 50000;
Expand Down Expand Up @@ -296,26 +297,16 @@ sub show_usage {
$imap->delete_message($msg)
or print "Could not delete IMAP message. [$@]\n";
} elsif ($imapmovefolder) {
print "Moving (copy and delete) processed IMAP message file to IMAP folder: $imapmovefolder\n" if $debug;

# Try to create $imapmovefolder, if it does not exist.
if (!$imap->exists($imapmovefolder)) {
$imap->create($imapmovefolder)
or print "Could not create IMAP folder: $imapmovefolder.\n";
}

# Try to move the message to $imapmovefolder.
my $newid = $imap->copy($imapmovefolder, [ $msg ]);
if (!$newid) {
print "Error on moving (copy and delete) processed IMAP message: Could not COPY message to IMAP folder: <$imapmovefolder>!\n";
print "Messsage will not be moved/deleted. [$@]\n";
} else {
$imap->delete_message($msg)
or do {
print "Error on moving (copy and delete) processed IMAP message: Could not DELETE message\n";
print "after copying it to <$imapmovefolder>. [$@]\n";
}
if ($processResult & 1 || !$imapmovefoldererr) {
# processXML processed the XML OK, or it failed and there is no error imap folder
moveToImapFolder($imap, $msg, $imapmovefolder);
} elsif ($imapmovefoldererr) {
# processXML failed and error folder set
moveToImapFolder($imap, $msg, $imapmovefoldererr);
}
} elsif ($imapmovefoldererr && !($processResult & 1)) {
# processXML failed, error imap folder set, but imapmovefolder unset. An unlikely setup, but still...
moveToImapFolder($imap, $msg, $imapmovefoldererr);
}
}

Expand Down Expand Up @@ -406,6 +397,33 @@ sub show_usage {
### subroutines ################################################################
################################################################################

sub moveToImapFolder {
my $imap = $_[0];
my $msg = $_[1];
my $imapfolder = $_[2];

print "Moving (copy and delete) IMAP message file to IMAP folder: $imapfolder\n" if $debug;

# Try to create $imapfolder, if it does not exist.
if (!$imap->exists($imapfolder)) {
$imap->create($imapfolder)
or print "Could not create IMAP folder: $imapfolder.\n";
}

# Try to move the message to $imapfolder.
my $newid = $imap->copy($imapfolder, [ $msg ]);
if (!$newid) {
print "Error on moving (copy and delete) processed IMAP message: Could not COPY message to IMAP folder: <$imapfolder>!\n";
print "Messsage will not be moved/deleted. [$@]\n";
} else {
$imap->delete_message($msg)
or do {
print "Error on moving (copy and delete) processed IMAP message: Could not DELETE message\n";
print "after copying it to <$imapfolder>. [$@]\n";
}
}
}

sub processXML {
my ($type, $filecontent, $f) = (@_);

Expand Down

0 comments on commit bb5dd8b

Please sign in to comment.