Mail-DMARC

 view release on metacpan or  search on metacpan

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

    if (! scalar @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' );
        };
    }

    $imap->quit;
    return 1;
}

sub from_file {
    my ( $self, $file ) = @_;
    croak "missing message" if !$file;
    croak "No such file $file: $!" if !-f $file;

    my $contents = $self->slurp($file);

    # Detect gzip by magic bytes \x1f\x8b
    if ( substr($contents, 0, 2) eq "\x1f\x8b" ) {
        my $xml;
        IO::Uncompress::Gunzip::gunzip( \$contents, \$xml )
            or croak "gunzip failed: $IO::Uncompress::Gunzip::GunzipError";
        $self->_init_for_file($file);
        return $self->handle_body($xml) ? 'aggregate' : undef;
    }

    # Detect zip by magic bytes PK\x03\x04
    if ( substr($contents, 0, 4) eq "PK\x03\x04" ) {
        my $xml;
        IO::Uncompress::Unzip::unzip( \$contents, \$xml )
            or croak "unzip failed: $IO::Uncompress::Unzip::UnzipError";
        $self->_init_for_file($file);
        return $self->handle_body($xml) ? 'aggregate' : undef;
    }

    # Detect XML by content (starts with optional BOM/whitespace then '<')
    if ( $contents =~ /\A(?:\xef\xbb\xbf)?\s*</ ) {
        $self->_init_for_file($file);
        return $self->handle_body($contents) ? 'aggregate' : undef;
    }

    return $self->from_email_simple(Email::Simple->new($contents));
}

sub _init_for_file {
    my ( $self, $file ) = @_;
    $self->report->init();
    $self->{_envelope_to} = undef;
    $self->{_header_from} = undef;
    $self->get_submitter_from_filename( File::Basename::basename($file) );
    return;
}

sub from_mbox {
    my ( $self, $file_name ) = @_;
    croak "missing mbox file" if !$file_name;

    # TODO: replace this module
    # commented out due to build test failures
    #   load "Mail::Mbox::MessageParser";
    #   croak "is Mail::Mbox::MessageParser installed?" if $@;

    #   my $file_handle = FileHandle->new($file_name);

    my $folder_reader; #  = Mail::Mbox::MessageParser->new(
    #       {   'file_name'    => $file_name,
    #           'file_handle'  => $file_handle,
    #           'enable_cache' => 1,
    #           'enable_grep'  => 1,
    #       }
    #   );

    croak $folder_reader unless ref $folder_reader;

    my $prologue = $folder_reader->prologue;
    print $prologue;

    while ( !$folder_reader->end_of_file() ) {
        $self->from_email_simple(
            Email::Simple->new( $folder_reader->read_next_email() ) );
    }
    return 1;
}

sub from_email_simple {
    my ( $self, $email ) = @_;

    $self->report->init();
    $self->{_envelope_to} = undef;
    $self->{_header_from} = undef;
    $self->get_submitter_from_subject( $email->header('Subject') );

    my $unzipper = {
        gz  => \&IO::Uncompress::Gunzip::gunzip,    # 2013 draft
        zip => \&IO::Uncompress::Unzip::unzip,      # legacy format
    };



( run in 0.724 second using v1.01-cache-2.11-cpan-39bf76dae61 )