Email::Store::Pristine - keep a pristine copy of the mail


Email-Store-Pristine documentation Contained in the Email-Store-Pristine distribution.

Index


Code Index:

NAME

Top

Email::Store::Pristine - keep a pristine copy of the mail

DESCRIPTION

Top

Many Email::Store plugins will munge the underlying rfc2822 representation of the message, which in some cases is undesirable.

When in use Email::Store::Pristine stores a copy of the original message in a pristine_copies relationship. This is a one-to-many relationship as in the case of a cross-posted mail you may recieve many subtly different versions of the same mail, for which there will be only one Email::Store::Mail message due to the unchanging Message-ID.

A pristine_copies accessor is added to the Email::Store::Mail object, which returns Email::Store::Pristine copies which encapsulate the original message.

METHODS

Top

->message

The pristine rfc2822 message. A readonly accessor.

->simple

The message represented as an Email::Simple object.

AUTHOR

Top

Richard Clamp <richardc@unixbeard.net>

COPYRIGHT

Top

SEE ALSO

Top

Email::Store


Email-Store-Pristine documentation Contained in the Email-Store-Pristine distribution.


package Email::Store::Pristine;
use strict;
use warnings;
our $VERSION = '1.21';
use base 'Email::Store::DBI';
__PACKAGE__->table("pristine");
__PACKAGE__->columns(All  => qw/id mail message/);
__PACKAGE__->columns(TEMP => qw/simple/);
__PACKAGE__->has_a(mail => 'Email::Store::Mail');
Email::Store::Mail->has_many( pristine_copies => __PACKAGE__ );

# I damn well want to be first
sub on_store_order { -20000 }
sub on_seen_duplicate_order { -20000 }

sub _store {
    my ($self, $mail, $message) = @_;
    $mail->add_to_pristine_copies({
        mail    => $mail,
        message => $message,
    });
}

sub on_store {
    my ($self, $mail) = @_;
    $self->_store( $mail, $mail->simple->as_string );
}

# don't store all duplicates, only the ones we've not got the exact
# same rfc2822 body for
sub on_seen_duplicate {
    my ($self, $mail, $simple)  = @_;
    my $message = $simple->as_string;
    for my $check ($mail->pristine_copies) {
        return if $check->message eq $message;
    }
    $self->_store( $mail, $message );
}

sub message {
    my $self = shift;
    if (@_) {
        die "which part of pristine didn't you get?"
    }
    $self->get('message');
}

# hmm, is there a way to make this Email::Simple object readonly too?
sub simple {
    my $self = shift;
    return $self->{simple} ||= Email::Simple->new( $self->message );
}

1;
__DATA__

CREATE TABLE IF NOT EXISTS pristine (
    id integer NOT NULL auto_increment primary key,
    mail varchar(255) NOT NULL,
    message text
);