Mail-DMARC

 view release on metacpan or  search on metacpan

lib/Mail/DMARC/Report/Receive.pm  view on Meta::CPAN

package Mail::DMARC::Report::Receive;
use strict;
use warnings;
use feature 'signatures';
no warnings 'experimental::signatures';    ## no critic (ProhibitNoWarnings)
use feature 'try';
no warnings 'experimental::try';    ## no critic (ProhibitNoWarnings)

our $VERSION = '2.20260621';

use Carp;
use Data::Dumper;
use Email::MIME;
use Email::Simple;
use Encode;
use File::Basename;
use IO::Uncompress::Unzip;
use IO::Uncompress::Gunzip;
use Module::Load;
use XML::LibXML;

use parent 'Mail::DMARC::Base';
require Mail::DMARC::Policy;
require Mail::DMARC::Report;
require Mail::DMARC::Report::Aggregate::Record;

sub from_imap($self) {
    try {
        load "Net::IMAP::Simple";
    }
    catch ($error) {
        croak "Net::IMAP::Simple seems to not work, is it installed? $error";
    }

    my $server = $self->config->{imap}{server} or croak "no imap server conf";
    my $folder = $self->config->{imap}{folder} or croak "no imap folder conf";
    my $a_done = $self->config->{imap}{a_done};
    my $f_done = $self->config->{imap}{f_done};
    my $port   = $self->config->{imap}{port} // 993;

    if ( $port != 143 ) {
        try {
            require IO::Socket::SSL;
        }
        catch ($error) {
            croak "Can't load IO::Socket::SSL: $error\n";
        }

        if ( defined $self->config->{imap}{SSL_verify_mode} ) {
            IO::Socket::SSL::set_ctx_defaults(
                SSL_verifycn_scheme => 'imap',
                SSL_verify_mode     => $self->config->{imap}{SSL_verify_mode},
            );
        }
    }

    no warnings qw(once);    ## no critic (Warn)
    my $imap = Net::IMAP::Simple->new(
        $server,
        port    => $port,
        use_ssl => $port != 143,
        )
        or do {
        ## no critic (PackageVar)
        my $err
            = $port == 143
            ? $Net::IMAP::Simple::errstr
            : $Net::IMAP::Simple::SSL::errstr;
        croak "Unable to connect to IMAP: $err\n";
        };

    print "connected to IMAP server $server:$port\n" if $self->verbose;

    $imap->login( $self->config->{imap}{user}, $self->config->{imap}{pass} )
        or croak "Login failed: " . $imap->errstr . "\n";

    print "\tlogged in\n" if $self->verbose;

    my $nm = $imap->select( $self->config->{imap}{folder} );
    $imap->expunge_mailbox( $self->config->{imap}{folder} );
    my @mess = $imap->search( 'UNSEEN', 'DATE' );
    if ( !@mess ) {

        # imap server might not support SORT extension *Gmail*
        @mess = $imap->search('UNSEEN');
    }

    print "\tfound " . scalar @mess . " messages\n" if $self->verbose;

    foreach my $i (@mess) {
        print $imap->seen($i) ? '*' : ' ';
        printf "[%03d] ", $i;
        my $message = $imap->get($i) or do {
            carp "unable to get message $i\n";
            next;
        };
        my $type = $self->from_email_simple( Email::Simple->new("$message") );
        next if !$type;
        my $done_box
            = $type eq 'aggregate' ? $a_done
            : $type eq 'forensic'  ? $f_done
            :                        croak "unknown type!";

        $imap->add_flags( $i, '\Seen' );
        if ($done_box) {
            $imap->copy( $i, $done_box ) or do {
                carp $imap->errstr;
                next;
            };
            $imap->add_flags( $i, '\Deleted' );



( run in 0.632 second using v1.01-cache-2.11-cpan-6aa56a78535 )