home *** CD-ROM | disk | FTP | other *** search
- package Mail::Mailer::smtp;
- use vars qw(@ISA);
- use Net::SMTP;
- use Mail::Util qw(mailaddress);
- use Carp;
-
- require Mail::Mailer::rfc822;
- @ISA = qw(Mail::Mailer::rfc822);
-
- sub can_cc { 0 }
-
- sub exec {
- my($self, $exe, $args, $to) = @_;
- my %opt = @$args;
- my $host = $opt{Server} || undef;
- $opt{Debug} ||= 0;
-
- # for Net::SMTP we do not really exec
- my $smtp = Net::SMTP->new($host, %opt)
- or return undef;
-
- ${*$self}{'sock'} = $smtp;
-
- $smtp->mail(mailaddress());
- my $u;
- foreach $u (@$to) {
- $smtp->to($u);
- }
- $smtp->data;
- untie(*$self) if tied *$self;
- tie *$self, 'Mail::Mailer::smtp::pipe',$self;
- $self;
- }
-
- sub set_headers {
- my($self,$hdrs) = @_;
- $self->SUPER::set_headers({
- From => "<" . mailaddress() . ">",
- %$hdrs,
- 'X-Mailer' => "Mail::Mailer[v$Mail::Mailer::VERSION] Net::SMTP[v$Net::SMTP::VERSION]"
- })
- }
-
- sub epilogue {
- my $self = shift;
- my $sock = ${*$self}{'sock'};
- $sock->dataend;
- $sock->quit;
- delete ${*$self}{'sock'};
- untie(*$self);
- }
-
- sub close {
- my($self, @to) = @_;
- my $sock = ${*$self}{'sock'};
- if ($sock && fileno($sock)) {
- $self->epilogue;
- # Epilogue should destroy the SMTP filehandle,
- # but just to be on the safe side.
- if ($sock && fileno($sock)) {
- close $sock
- or croak 'Cannot destroy socket filehandle';
- }
- }
- 1;
- }
-
- package Mail::Mailer::smtp::pipe;
-
- sub TIEHANDLE {
- my $pkg = shift;
- my $self = shift;
- my $sock = ${*$self}{'sock'};
- return bless \$sock;
- }
-
- sub PRINT {
- my $self = shift;
- my $sock = $$self;
- $sock->datasend( @_ );
- }
-
-
- 1;
-