X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FCatalyst%2FView%2FEmail.pm;h=dbcf82e503711328c0b478ca3bbc4f441402d080;hb=b15e8ad4cf352b3beba1571e9e05c2c4951e2f4a;hp=cf78af0c2beb83f4a81dc982ddafee924270317f;hpb=4e8cf755420e9d1bb46f67650274bbfdc729a646;p=catagits%2FCatalyst-View-Email.git diff --git a/lib/Catalyst/View/Email.pm b/lib/Catalyst/View/Email.pm index cf78af0..dbcf82e 100644 --- a/lib/Catalyst/View/Email.pm +++ b/lib/Catalyst/View/Email.pm @@ -5,40 +5,44 @@ use Carp; use Encode qw(encode decode); use Email::Sender::Simple qw/ sendmail /; -use Email::Simple; -use Email::Simple::Creator; - +use Email::MIME::Creator; extends 'Catalyst::View'; -our $VERSION = '0.13'; +our $VERSION = '0.16'; + +has 'mailer' => ( + is => 'rw', + isa => 'Str', + lazy => 1, + default => sub { "sendmail" } +); has 'stash_key' => ( is => 'rw', - isa => 'Str', - lazy => 1, + isa => 'Str', + lazy => 1, default => sub { "email" } ); has 'default' => ( is => 'rw', - isa => 'HashRef', - default => sub { { content_type => 'text/plain' } }, + isa => 'HashRef', + default => sub { { content_type => 'text/plain' } }, lazy => 1, ); - has 'sender' => ( is => 'rw', - isa => 'HashRef', - lazy => 1, - default => sub { { mailer => 'sendmail' } } + isa => 'HashRef', + lazy => 1, + default => sub { { mailer => shift->mailer } } ); has 'content_type' => ( is => 'rw', isa => 'Str', + default => sub { shift->default->{content_type} }, lazy => 1, - default => sub { shift->default->{'content_type'} } ); =head1 NAME @@ -100,7 +104,6 @@ not be delivered. =cut - =head1 SENDING EMAIL Sending email is just filling the stash and forwarding to the view: @@ -179,12 +182,13 @@ Validates the base config and creates the L object for later use by process. =cut + sub BUILD { my $self = shift; my $stash_key = $self->stash_key; - croak "$self stash_key isn't defined!" - if ($stash_key eq ''); + croak "$self stash_key isn't defined!" + if ( $stash_key eq '' ); } @@ -201,27 +205,35 @@ sub process { my ( $self, $c ) = @_; croak "Unable to send mail, bad mail configuration" - unless $self->mailer; + unless $self->mailer; - my $email = $c->stash->{$self->{stash_key}}; + my $email = $c->stash->{ $self->stash_key }; croak "Can't send email without a valid email structure" - unless $email; - - my $header = $email->{header} || []; - push @$header, ('To' => delete $email->{to}) - if $email->{to}; - push @$header, ('Cc' => delete $email->{cc}) - if $email->{cc}; - push @$header, ('Bcc' => delete $email->{bcc}) - if $email->{bcc}; - push @$header, ('From' => delete $email->{from}) - if $email->{from}; - push @$header, ('Subject' => Encode::encode('MIME-Header', delete $email->{subject})) - if $email->{subject}; + unless $email; + + # Default content type + if ( $self->content_type and not $email->{content_type} ) { + $email->{content_type} = $self->content_type; + } + + my $header = $email->{header} || []; + push @$header, ( 'To' => delete $email->{to} ) + if $email->{to}; + push @$header, ( 'Cc' => delete $email->{cc} ) + if $email->{cc}; + push @$header, ( 'Bcc' => delete $email->{bcc} ) + if $email->{bcc}; + push @$header, ( 'From' => delete $email->{from} ) + if $email->{from}; + push @$header, + ( 'Subject' => Encode::encode( 'MIME-Header', delete $email->{subject} ) ) + if $email->{subject}; + push @$header, ( 'Content-type' => $email->{content_type} ) + if $email->{content_type}; my $parts = $email->{parts}; my $body = $email->{body}; - + unless ( $parts or $body ) { croak "Can't send email without parts or body, check stash"; } @@ -230,18 +242,30 @@ sub process { if ( $parts and ref $parts eq 'ARRAY' ) { $mime{parts} = $parts; - } else { + } + else { $mime{body} = $body; } + $mime{attributes}->{content_type} = $email->{content_type} + if $email->{content_type}; + if ( $mime{attributes} + and not $mime{attributes}->{charset} + and $self->{default}->{charset} ) + { + $mime{attributes}->{charset} = $self->{default}->{charset}; + } + my $message = $self->generate_message( $c, \%mime ); - if ( $message ) { - my $return = sendmail($message); + if ($message) { + my $return = sendmail( $message, { transport => $self->mailer } ); + # return is a Return::Value object, so this will stringify as the error - # in the case of a failure. + # in the case of a failure. croak "$return" if !$return; - } else { + } + else { croak "Unable to create message"; } } @@ -255,6 +279,44 @@ C key. =cut +sub setup_attributes { + my ( $self, $c, $attrs ) = @_; + + my $default_content_type = $self->default->{content_type}; + my $default_charset = $self->default->{charset}; + + my $e_m_attrs = {}; + + if ( exists $attrs->{content_type} + && defined $attrs->{content_type} + && $attrs->{content_type} ne '' ) + { + $c->log->debug( 'C::V::Email uses specified content_type ' + . $attrs->{content_type} + . '.' ) + if $c->debug; + $e_m_attrs->{content_type} = $attrs->{content_type}; + } + elsif ( defined $default_content_type && $default_content_type ne '' ) { + $c->log->debug( + "C::V::Email uses default content_type $default_content_type.") + if $c->debug; + $e_m_attrs->{content_type} = $default_content_type; + } + + if ( exists $attrs->{charset} + && defined $attrs->{charset} + && $attrs->{charset} ne '' ) + { + $e_m_attrs->{charset} = $attrs->{charset}; + } + elsif ( defined $default_charset && $default_charset ne '' ) { + $e_m_attrs->{charset} = $default_charset; + } + + return $e_m_attrs; +} + =item generate_message($c, $attr) Generate a message part, which should be an L object and return it. @@ -267,10 +329,10 @@ message object. sub generate_message { my ( $self, $c, $attr ) = @_; - # setup the attributes (merge with defaults) - return Email::Simple->create( - header => $attr->{header}, - body => $attr->{body} + # setup the attributes (merge with defaultis) + $attr->{attributes} = $self->setup_attributes($c, $attr->{attributes}); + Email::MIME->create( + %$attr ); } @@ -322,6 +384,8 @@ Roman Filippov Lance Brown +Devin Austin + =head1 COPYRIGHT Copyright (c) 2007 - 2009