diff options
Diffstat (limited to 'lib/Feed/Role/MailDir.pm')
-rw-r--r-- | lib/Feed/Role/MailDir.pm | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/lib/Feed/Role/MailDir.pm b/lib/Feed/Role/MailDir.pm new file mode 100644 index 0000000..f7cfc20 --- /dev/null +++ b/lib/Feed/Role/MailDir.pm @@ -0,0 +1,76 @@ +package Feed::Role::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::HelperRole::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; |