package Feed::MailDir; use Moose::Role; use 5.016; use namespace::autoclean; use Encode; use Encode::IMAPUTF7; use MooseX::Types::Path::Class 'Dir'; use Maildir::Lite; with 'Feed::Mail'; requires 'extract_entries'; has maildir_base => ( is => 'ro', isa => Dir, coerce => 1, required => 1, ); has maildir_folder => ( is => 'ro', isa => 'Maildir::Lite', lazy_build => 1, ); sub _build_maildir_folder { my ($self) = @_; my $feed = $self->feed; my $folder = encode('IMAP-UTF-7',$self->maildir_folder_for($feed)); $self->maildir_base->mkpath; return Maildir::Lite->new( dir => $self->maildir_base->subdir($folder)->stringify, ); } sub process_entry { my ($self,$entry) = @_; my ($msg) = $self->entry_to_mime($entry); $self->store_into_maildir($msg); return; } sub _clean_folder_part { return map { s{\W+}{-}gr } @_; } sub maildir_folder_for { my ($self,$feed) = @_; my (@comps) = _clean_folder_part($self->mail_folders,$self->title); return join '.','',@comps; } sub store_into_maildir { my ($self,$msg) = @_; my ($fh,$stat) = $self->maildir_folder->creat_message(); die "maildir create message failed ($stat)" if $stat; binmode($fh); $msg->print($fh) or die "print to maildir failed: $!"; $self->maildir_folder->deliver_message($fh) and die "maildir write failed"; } 1;