[cgiapp] Best email module?

Octavian Rasnita orasnita at gmail.com
Sun Feb 1 09:19:08 EST 2009


Hi,

That long code also uses XS and you could do it shorter using something 
like:

use Mail::Builder::Simple;
use File::Spec::Functions qw/catdir/;

my $mail = Mail::Builder::Simple->new(
  from => ['do-not-reply at example.com', 'example.com'],
  reply => 'reply-to at example.com',
  subject => 'The subject',
  htmltext => ['template.tmpl', ':TT'],
  plaintext => ['text_template.tmpl', ':TT'],
  sender => 'WordPine::Email',
  template_args => {
    COMPILE_DIR => catdir($ENV{APP_ROOT}, 'tmp'),
    INCLUDE_PATH => catdir($ENV{APP_ROOT}, 'templates'),
    COMPILE_EXT => '.ttc',
  },
);

foreach my $email(@emails) {
  $mail->send(to => $email);
}

The headers and the body are automaticly encoded to UTF-8, you can also add 
attachments and inline images easy and you can also use other templating 
systems than Template-Toolkit, like HTML::Template for creating the body 
parts or the attachments.

Octavian

----- Original Message ----- 
From: "James.Q.L" <shijialeee at yahoo.com>
To: "CGI Application" <cgiapp at lists.openlib.org>
Sent: Sunday, February 01, 2009 8:22 AM
Subject: Re: [cgiapp] Best email module?


> --- Lyle <webmaster at cosmicperl.com> wrote:
>
>> Michael Peters wrote:
>> > Stewart Heckenberg wrote:
>> >> I like MIME::Lite -- has a very simple attachment interface :)
>> >
>> > MIME::Lite is what I've used in the past, although the Perl Email
>> > folks don't recommend it. Apparently it's very crufty on the insides.
>> > I think they recommend Email::MIME instead.
>>
>> Email::MIME looks good, but Email::Stuff seems like an easier interface
>> to it.
>>
>> I notice that Email::Send now says to use Email::Sender instead. Anyone
>> got any experience with this?
>>
>
> I used it a while ago. It did took me some time and some sample codes to 
> figure out how to use
> bunch of Email::* modules to do what I want. I hope the code speak for 
> itself. :)
>
> use Email::Address;
> use Email::MessageID;
> use Email::Send;
> use Email::Simple;
> #use Email::MIME::CreateHTML;
> use Email::MIME::Creator;
> use Encode qw( encode );
> use Template;
> use HTML::FormatText::WithLinks;
> use File::Spec::Functions qw/catdir/;
> use Carp;
>
>
> $Email::Send::Sendmail::SENDMAIL = '/usr/sbin/sendmail';
> my $Sender = Email::Send->new( { mailer => 'Sendmail' } );
> my $from_address = Email::Address->new( 'example.com', 
> 'do-not-reply at example.com' )->format();
>
> our $TEMPLATE = Template->new(
>    COMPILE_DIR  => catdir( $ENV{APP_ROOT}, 'tmp' ),
>    INCLUDE_PATH => catdir( $ENV{APP_ROOT}, 'templates' ),
>    COMPILE_EXT  => '.ttc',
> );
>
> sub send_email {
>    my $class = shift;
>    my $p     = shift;
>
> die unless defined $p->{to};
> die unless defined $p->{subject};
> die unless defined $p->{template};
> die unless defined $p->{params};
>
>    my $html_body = _htmlBody( $p );
>    my $text_body = _textBody( $html_body );
>
>    # multipart message
>    # put the best alternative at the last.
>    my @parts = (
>      Email::MIME->create(
>          attributes => {
>              content_type => "text/plain",
> #              disposition  => "attachment",
>              charset      => "UTF-8",
>          },
>          body => encode( 'utf8', $text_body ),
>      ),
>      Email::MIME->create(
>          attributes => {
>              content_type => "text/html",
> #              disposition  => "attachment",
>              charset      => "UTF-8",
>          },
>          body => encode( 'utf8', $html_body ),
>      ),
>    );
>
>    my %headers =
>            ( From         => $p->{from} || $from_address,
>              'Reply-To'   => $p->{from} || $from_address,
>              To           => $p->{to},
>              Subject      => $p->{subject},
>              'Message-ID' => q{<} . Email::MessageID->new() . q{>},
>              'Content-Transfer-Encoding' => '7bit',
>              'X-Sender'                  => 'WordPine::Email',
>    );
>    # for sending html/plain alternatives email:
>    #    need three Email::MIME objects.
>    #    One is the top-level multi/aalt part.
>    #    the other two are the html/plain alternatives
>    my $email = Email::MIME->create(
>      header => [ %headers ],
>      parts  => [ @parts ],
>      attributes => { content_type => 'multipart/alternative', },
>    );
>
>    my $rv = $Sender->send( $email );
>    warn $rv unless $rv;
> }
>
> sub _htmlBody {
>    my $p = shift;
>    my $tmpl_file = "Email/".  $p->{template} . ".tmpl";
>    my $html;
>    $TEMPLATE->process( $tmpl_file, $p->{params}, \$html ) || croak 
> $TEMPLATE->error();
>    return $html;
> }
>
> sub _textBody {
>    my $html = shift;
>    return HTML::FormatText::WithLinks->new()->parse($html);
> }
>
> 1;
>
>
> Qiang(James)
>
>
>
>
> #####  CGI::Application community mailing list  ################
> ##                                                            ##
> ##  To unsubscribe, or change your message delivery options,  ##
> ##  visit:  http://lists.openlib.org/mailman/listinfo/cgiapp    ##
> ##                                                            ##
> ##  Web archive:   http://lists.openlib.org/pipermail/cgiapp/   ##
> ##  Wiki:          http://cgiapp.erlbaum.net/                 ##
> ##                                                            ##
> ################################################################
> 



More information about the cgiapp mailing list