The Perl Advent Calendar needs more articles for 2022. Submit your idea today!
use strict;
use warnings;

use Data::Dumper;
use Getopt::Long;
use Pod::Usage;

use lib 'lib';
use Mail::DMARC::Report::Receive;


my %command_line_options = (
    'file:s'    => \my $file,
    'imap'      => \my $imap,
    'mbox'      => \my $mbox,
    'verbose+'  => \my $verbose,
GetOptions (%command_line_options);

pod2usage(0) if ! $imap && ! $mbox && ! $file;

## no critic (Carp)
my $recv = Mail::DMARC::Report::Receive->new() or die;
$recv->verbose($verbose) if $verbose;
$recv->from_imap         if $imap;
$recv->from_mbox($mbox)  if $mbox;
$recv->from_file($file)  if $file;



=head1 NAME

dmarc_receive: receive aggregate reports via IMAP, mbox, or message file(s)

=head1 USAGE

 dmarc_receive [ --imap | --mbox | --file ]


This script processes incoming DMARC reports from IMAP, files, or a mbox formatted file.

=head2 IMAP

To process reports with IMAP, you must configure the [imap] settings in mail-dmarc.ini. This program will:

 * log into the IMAP account
 * select the specified folder (INBOX, dmarc, etc)
 * for every unread (Unseen) message, search for DMARC reports

=head3 IMAP Aggregate report

IMAP aggregate reports are detected by the presence of zip or gzip attachments. When an aggregate report is detected:

 * the attachment is decompressed
 * the XML is parsed
 * the report is saved to the report store
 * the message is marked as read/seen
 * move message to [imap][a_done] folder (if defined)

=head3 IMAP Forensic report

IMAP forensic reports are detected by the presence of the content-types message/feedback-report and text/rfc822-headers. When a forensic report is detected it is moved to the [imap][f_done] IMAP folder.

=head2 File as message

Accepts the filename of a file containing a mail message. The message is parsed and stored.

=head2 Mbox

Accepts the filename of a mbox format file containing mail messages. The messages are parsed and stored.