Beefy Boxes and Bandwidth Generously Provided by pair Networks
There's more than one way to do things
 
PerlMonks  

Re^3: add to MIME::Lite support for smtp tls on port 587

by Khen1950fx (Canon)
on Sep 14, 2010 at 23:40 UTC ( #860143=note: print w/ replies, xml ) Need Help??


in reply to Re^2: add to MIME::Lite support for smtp tls on port 587
in thread add to MIME::Lite support for smtp tls on port 587

Port 587 requires authentication. Did you give a username and password under %opts? The example from Net::SMTP::TLS:

#!/usr/bin/perl use strict; use warnings; use Net::SMTP::TLS; my $mailer = new Net::SMTP::TLS( 'your.mail.host', Hello => 'some.host.name', Port => 587, User => 'emailuser', Password=> 'password'); $mailer->mail('emailuser@your.mail.host'); $mailer->to('someonecool@somewhere.else'); $mailer->data; $mailer->datasend("Sent thru TLS!"); $mailer->dataend; $mailer->quit;
First, note the use of Hello. It's the hostname used in the EHLO command.

Second, if you are using Postfix, then you'll need to check the config. You might need to specify port 587. For example, find your config and list your transport something like:

transport=Net::SMTP::TLS user@exmple.com Password 12345 Port 587
Check the documentation of Postfix for more info.


Comment on Re^3: add to MIME::Lite support for smtp tls on port 587
Select or Download Code
Re^4: add to MIME::Lite support for smtp tls on port 587
by swilting (Beadle) on Sep 15, 2010 at 00:20 UTC

    First , my config of postfix its ok its perfectly stable . i send mail on port 587 . thank you for your example but I respect the habits of PERL %opts does contain the user name and password . There is an old article about a port problem

    http://prlmnks.org/html/569255.html

    I think I am a victim of problem board and MIME::Lite takes into account the difficulty of the issue of port mail or this it's a httpd probleme was inject directly the mail on the port 25

    i updated my pach for very more compliance i past

    [root@r13151 ~]# diff -u MIME-Lite-3.027/lib/MIME/Lite.pm /usr/lib/pe +rl5/site_perl/5.8.8/MIME/Lite.pm --- MIME-Lite-3.027/lib/MIME/Lite.pm 2009-10-10 04:04:04.000000000 ++0200 +++ /usr/lib/perl5/site_perl/5.8.8/MIME/Lite.pm 2010-09-15 18:47:00.00 +0000000 +0200 @@ -404,6 +404,8 @@ sendmail => [$SENDMAIL ? "$SENDMAIL -t -oi -oem" : undef], smtp => [], sub => [], + tls => [], + ssl => [], ); ### Boundary counter: @@ -2565,22 +2567,28 @@ if (@_) { ### args; use them just this once $method = 'send_by_' . $meth; @args = @_; - } else { ### no args; use defaults + } elsif (@_) { ### no args; use defaults $method = "send_by_$Sender"; @args = @{ $SenderArgs{$Sender} || [] }; - } - $self->verify_data if $AUTO_VERIFY; ### prevents missing p +arts! - Carp::croak "Unknown send method '$meth'" unless $self->can($ +method); - return $self->$method(@args); - } else { ### class method: - if (@_) { + } elsif (@_) { my @old = ( $Sender, @{ $SenderArgs{$Sender} } ); $Sender = $meth; $SenderArgs{$Sender} = [@_]; ### remaining args return @old; - } else { + } elsif (@_) { + $method = "send_by_$Sender"; + @args = @{ $SenderArgs{$Sender} || [] }; + } elsif (@_) { + $method = "send_by_$Sender"; + @args = @{ $SenderArgs{$Sender} || [] }; + + + $self->verify_data if $AUTO_VERIFY; ### prevents missing p +arts! + Carp::croak "Unknown send method '$meth'" unless $self->can($ +method); + return $self->$method(@args); + } else { Carp::croak "class method send must have HOW... arguments +\n"; - } + } } } @@ -2908,6 +2916,150 @@ return $self->{last_send_successful} = 1; } +sub send_by_tls { + require Net::SMTP::TLS; + require Net::SMTP_auth; + my ($self,$hostname,%args) = @_; + # We may need the "From:" and "To:" headers to pass to the + # SMTP mailer also. + $self->{last_send_successful}=0; + + my @hdr_to = extract_only_addrs( scalar $self->get('To') ); + if ($AUTO_CC) { + foreach my $field (qw(Cc Bcc)) { + push @hdr_to, extract_only_addrs($_) for $self->get($fiel +d); + } + } + Carp::croak "send_by_smtp: nobody to send to for host '$hostname'?! +\n" + unless @hdr_to; + + $args{To} ||= \@hdr_to; + $args{From} ||= extract_only_addrs( scalar $self->get('Return-Pat +h') ); + $args{From} ||= extract_only_addrs( scalar $self->get('From') ) ; + + # Create SMTP client. + # MIME::Lite::SMTP is just a wrapper giving a print method + # to the SMTP object. + + my %opts = __opts(\%args, @_net_smtp_opts); + my $smtp = MIME::Lite::SMTP::TLS->new( $hostname, %opts ) + or Carp::croak "SMTP Failed to connect to mail server: $!\n"; + + # Possibly authenticate + if ( defined $args{AuthUser} and defined $args{AuthPass} + and !$args{NoAuth} ) + { + if ($smtp->supports('AUTH',500,["Command unknown: 'AUTH'"])) +{ + $smtp->auth( $args{AuthUser}, $args{AuthPass} ) + or die "SMTP auth() command failed: $!\n" + . $smtp->message . "\n"; + } else { + die "SMTP auth() command not supported on $hostname\n"; + } + } + + # Send the mail command + %opts = __opts( \%args, @_mail_opts); + $smtp->mail( $args{From}, %opts ? \%opts : () ) + or die "SMTP mail() command failed: $!\n" + . $smtp->message . "\n"; + + # Send the recipients command + %opts = __opts( \%args, @_recip_opts); + $smtp->recipient( @{ $args{To} }, %opts ? \%opts : () ) + or die "SMTP recipient() command failed: $!\n" + . $smtp->message . "\n"; + + # Send the data + $smtp->data() + or die "SMTP data() command failed: $!\n" + . $smtp->message . "\n"; + $self->print_for_smtp($smtp); + + # Finish the mail + $smtp->dataend() + or Carp::croak "Net::CMD (Net::SMTP) DATAEND command failed.\n" + . "Last server message was:" + . $smtp->message + . "This probably represents a problem with newline encoding "; + + # terminate the session + $smtp->quit; + + return $self->{last_send_successful} = 1; +} +sub send_by_ssl { + require Net::SMTP::SSL; + require Net::SMTP_auth; + my ($self,$hostname,%args) = @_; + # We may need the "From:" and "To:" headers to pass to the + # SMTP mailer also. + $self->{last_send_successful}=0; + + my @hdr_to = extract_only_addrs( scalar $self->get('To') ); + if ($AUTO_CC) { + foreach my $field (qw(Cc Bcc)) { + push @hdr_to, extract_only_addrs($_) for $self->get($fiel +d); + } + } + Carp::croak "send_by_smtp: nobody to send to for host '$hostname'?! +\n" + unless @hdr_to; + + $args{To} ||= \@hdr_to; + $args{From} ||= extract_only_addrs( scalar $self->get('Return-Pat +h') ); + $args{From} ||= extract_only_addrs( scalar $self->get('From') ) ; + + # Create SMTP client. + # MIME::Lite::SMTP is just a wrapper giving a print method + # to the SMTP object. + + my %opts = __opts(\%args, @_net_smtp_opts); + my $smtp = MIME::Lite::SMTP::SSL->new( $hostname, %opts ) + or Carp::croak "SMTP Failed to connect to mail server: $!\n"; + + # Possibly authenticate + if ( defined $args{AuthUser} and defined $args{AuthPass} + and !$args{NoAuth} ) + { + if ($smtp->supports('AUTH',500,["Command unknown: 'AUTH'"])) +{ + $smtp->auth( $args{AuthUser}, $args{AuthPass} ) + or die "SMTP auth() command failed: $!\n" + . $smtp->message . "\n"; + } else { + die "SMTP auth() command not supported on $hostname\n"; + } + } + + # Send the mail command + %opts = __opts( \%args, @_mail_opts); + $smtp->mail( $args{From}, %opts ? \%opts : () ) + or die "SMTP mail() command failed: $!\n" + . $smtp->message . "\n"; + + # Send the recipients command + %opts = __opts( \%args, @_recip_opts); + $smtp->recipient( @{ $args{To} }, %opts ? \%opts : () ) + or die "SMTP recipient() command failed: $!\n" + . $smtp->message . "\n"; + + # Send the data + $smtp->data() + or die "SMTP data() command failed: $!\n" + . $smtp->message . "\n"; + $self->print_for_smtp($smtp); + + # Finish the mail + $smtp->dataend() + or Carp::croak "Net::CMD (Net::SMTP) DATAEND command failed.\n" + . "Last server message was:" + . $smtp->message + . "This probably represents a problem with newline encoding "; + + # terminate the session + $smtp->quit; + + return $self->{last_send_successful} = 1; +} =item send_by_testfile FILENAME @@ -3125,6 +3277,90 @@ . "This probably represents a problem with newl +ine encoding " ); } +#============================================================ + +package MIME::Lite::SMTP::TLS; + +#============================================================ +# This class just adds a print() method to Net::SMTP. +# Notice that we don't use/require it until it's needed! + +use strict; +use vars qw( @ISA ); +@ISA = qw(Net::SMTP::TLS); + +# some of the below is borrowed from Data::Dumper +my %esc = ( "\a" => "\\a", + "\b" => "\\b", + "\t" => "\\t", + "\n" => "\\n", + "\f" => "\\f", + "\r" => "\\r", + "\e" => "\\e", + ); + +sub _hexify { + local $_ = shift; + my @split = m/(.{1,16})/gs; + foreach my $split (@split) { + ( my $txt = $split ) =~ s/([\a\b\t\n\f\r\e])/$esc{$1}/sg; + $split =~ s/(.)/sprintf("%02X ",ord($1))/sge; + print STDERR "M::L >>> $split : $txt\n"; + } +} + +sub print { + my $smtp = shift; + $MIME::Lite::DEBUG and _hexify( join( "", @_ ) ); + $smtp->datasend(@_) + or Carp::croak( "Net::CMD (Net::SMTP) DATASEND command failed +.\n" + . "Last server message was:" + . $smtp->message + . "This probably represents a problem with new +line encoding " ); +} + +#============================================================ + +package MIME::Lite::SMTP::SSL; + +#============================================================ +# This class just adds a print() method to Net::SMTP. +# Notice that we don't use/require it until it's needed! + +use strict; +use vars qw( @ISA ); +@ISA = qw(Net::SMTP::SSL); + +# some of the below is borrowed from Data::Dumper +my %esc = ( "\a" => "\\a", + "\b" => "\\b", + "\t" => "\\t", + "\n" => "\\n", + "\f" => "\\f", + "\r" => "\\r", + "\e" => "\\e", + ); + +sub _hexify { + local $_ = shift; + my @split = m/(.{1,16})/gs; + foreach my $split (@split) { + ( my $txt = $split ) =~ s/([\a\b\t\n\f\r\e])/$esc{$1}/sg; + $split =~ s/(.)/sprintf("%02X ",ord($1))/sge; + print STDERR "M::L >>> $split : $txt\n"; + } +} + +sub print { + my $smtp = shift; + $MIME::Lite::DEBUG and _hexify( join( "", @_ ) ); + $smtp->datasend(@_) + or Carp::croak( "Net::CMD (Net::SMTP) DATASEND command failed +.\n" + . "Last server message was:" + . $smtp->message + . "This probably represents a problem with new +line encoding " ); +} + #============================================================

    at time email no send

Re^4: add to MIME::Lite support for smtp tls on port 587
by swilting (Beadle) on Sep 15, 2010 at 17:21 UTC

    i rewrite the patch more correctly . i cote

    ~]# diff -u MIME-Lite-3.027/lib/MIME/Lite.pm /usr/lib/perl5/site_perl +/5.8.8/MIME/Lite.pm --- MIME-Lite-3.027/lib/MIME/Lite.pm 2009-10-10 04:04:04.000000000 ++0200 +++ /usr/lib/perl5/site_perl/5.8.8/MIME/Lite.pm 2010-09-15 18:47:00.00 +0000000 +0200 @@ -404,6 +404,8 @@ sendmail => [$SENDMAIL ? "$SENDMAIL -t -oi -oem" : undef], smtp => [], sub => [], + tls => [], + ssl => [], ); ### Boundary counter: @@ -2565,22 +2567,28 @@ if (@_) { ### args; use them just this once $method = 'send_by_' . $meth; @args = @_; - } else { ### no args; use defaults + } elsif (@_) { ### no args; use defaults $method = "send_by_$Sender"; @args = @{ $SenderArgs{$Sender} || [] }; - } - $self->verify_data if $AUTO_VERIFY; ### prevents missing p +arts! - Carp::croak "Unknown send method '$meth'" unless $self->can($ +method); - return $self->$method(@args); - } else { ### class method: - if (@_) { + } elsif (@_) { my @old = ( $Sender, @{ $SenderArgs{$Sender} } ); $Sender = $meth; $SenderArgs{$Sender} = [@_]; ### remaining args return @old; - } else { + } elsif (@_) { + $method = "send_by_$Sender"; + @args = @{ $SenderArgs{$Sender} || [] }; + } elsif (@_) { + $method = "send_by_$Sender"; + @args = @{ $SenderArgs{$Sender} || [] }; + + + $self->verify_data if $AUTO_VERIFY; ### prevents missing p +arts! + Carp::croak "Unknown send method '$meth'" unless $self->can($ +method); + return $self->$method(@args); + } else { Carp::croak "class method send must have HOW... arguments +\n"; - } + } } } @@ -2908,6 +2916,150 @@ return $self->{last_send_successful} = 1; } +sub send_by_tls { + require Net::SMTP::TLS; + require Net::SMTP_auth; + my ($self,$hostname,%args) = @_; + # We may need the "From:" and "To:" headers to pass to the + # SMTP mailer also. + $self->{last_send_successful}=0; + + my @hdr_to = extract_only_addrs( scalar $self->get('To') ); + if ($AUTO_CC) { + foreach my $field (qw(Cc Bcc)) { + push @hdr_to, extract_only_addrs($_) for $self->get($fiel +d); + } + } + Carp::croak "send_by_smtp: nobody to send to for host '$hostname'?! +\n" + unless @hdr_to; + + $args{To} ||= \@hdr_to; + $args{From} ||= extract_only_addrs( scalar $self->get('Return-Pat +h') ); + $args{From} ||= extract_only_addrs( scalar $self->get('From') ) ; + + # Create SMTP client. + # MIME::Lite::SMTP is just a wrapper giving a print method + # to the SMTP object. + + my %opts = __opts(\%args, @_net_smtp_opts); + my $smtp = MIME::Lite::SMTP::TLS->new( $hostname, %opts ) + or Carp::croak "SMTP Failed to connect to mail server: $!\n"; + + # Possibly authenticate + if ( defined $args{AuthUser} and defined $args{AuthPass} + and !$args{NoAuth} ) + { + if ($smtp->supports('AUTH',500,["Command unknown: 'AUTH'"])) +{ + $smtp->auth( $args{AuthUser}, $args{AuthPass} ) + or die "SMTP auth() command failed: $!\n" + . $smtp->message . "\n"; + } else { + die "SMTP auth() command not supported on $hostname\n"; + } + } + + # Send the mail command + %opts = __opts( \%args, @_mail_opts); + $smtp->mail( $args{From}, %opts ? \%opts : () ) + or die "SMTP mail() command failed: $!\n" + . $smtp->message . "\n"; + + # Send the recipients command + %opts = __opts( \%args, @_recip_opts); + $smtp->recipient( @{ $args{To} }, %opts ? \%opts : () ) + or die "SMTP recipient() command failed: $!\n" + . $smtp->message . "\n"; + + # Send the data + $smtp->data() + or die "SMTP data() command failed: $!\n" + . $smtp->message . "\n"; + $self->print_for_smtp($smtp); + + # Finish the mail + $smtp->dataend() + or Carp::croak "Net::CMD (Net::SMTP) DATAEND command failed.\n" + . "Last server message was:" + . $smtp->message + . "This probably represents a problem with newline encoding "; + + # terminate the session + $smtp->quit; + + return $self->{last_send_successful} = 1; +} +sub send_by_ssl { + require Net::SMTP::SSL; + require Net::SMTP_auth; + my ($self,$hostname,%args) = @_; + # We may need the "From:" and "To:" headers to pass to the + # SMTP mailer also. + $self->{last_send_successful}=0; + + my @hdr_to = extract_only_addrs( scalar $self->get('To') ); + if ($AUTO_CC) { + foreach my $field (qw(Cc Bcc)) { + push @hdr_to, extract_only_addrs($_) for $self->get($fiel +d); + } + } + Carp::croak "send_by_smtp: nobody to send to for host '$hostname'?! +\n" + unless @hdr_to; + + $args{To} ||= \@hdr_to; + $args{From} ||= extract_only_addrs( scalar $self->get('Return-Pat +h') ); + $args{From} ||= extract_only_addrs( scalar $self->get('From') ) ; + + # Create SMTP client. + # MIME::Lite::SMTP is just a wrapper giving a print method + # to the SMTP object. + + my %opts = __opts(\%args, @_net_smtp_opts); + my $smtp = MIME::Lite::SMTP::SSL->new( $hostname, %opts ) + or Carp::croak "SMTP Failed to connect to mail server: $!\n"; + + # Possibly authenticate + if ( defined $args{AuthUser} and defined $args{AuthPass} + and !$args{NoAuth} ) + { + if ($smtp->supports('AUTH',500,["Command unknown: 'AUTH'"])) +{ + $smtp->auth( $args{AuthUser}, $args{AuthPass} ) + or die "SMTP auth() command failed: $!\n" + . $smtp->message . "\n"; + } else { + die "SMTP auth() command not supported on $hostname\n"; + } + } + + # Send the mail command + %opts = __opts( \%args, @_mail_opts); + $smtp->mail( $args{From}, %opts ? \%opts : () ) + or die "SMTP mail() command failed: $!\n" + . $smtp->message . "\n"; + + # Send the recipients command + %opts = __opts( \%args, @_recip_opts); + $smtp->recipient( @{ $args{To} }, %opts ? \%opts : () ) + or die "SMTP recipient() command failed: $!\n" + . $smtp->message . "\n"; + + # Send the data + $smtp->data() + or die "SMTP data() command failed: $!\n" + . $smtp->message . "\n"; + $self->print_for_smtp($smtp); + + # Finish the mail + $smtp->dataend() + or Carp::croak "Net::CMD (Net::SMTP) DATAEND command failed.\n" + . "Last server message was:" + . $smtp->message + . "This probably represents a problem with newline encoding "; + + # terminate the session + $smtp->quit; + + return $self->{last_send_successful} = 1; +} =item send_by_testfile FILENAME @@ -3125,6 +3277,90 @@ . "This probably represents a problem with newl +ine encoding " ); } +#============================================================ + +package MIME::Lite::SMTP::TLS; + +#============================================================ +# This class just adds a print() method to Net::SMTP. +# Notice that we don't use/require it until it's needed! + +use strict; +use vars qw( @ISA ); +@ISA = qw(Net::SMTP::TLS); + +# some of the below is borrowed from Data::Dumper +my %esc = ( "\a" => "\\a", + "\b" => "\\b", + "\t" => "\\t", + "\n" => "\\n", + "\f" => "\\f", + "\r" => "\\r", + "\e" => "\\e", + ); + +sub _hexify { + local $_ = shift; + my @split = m/(.{1,16})/gs; + foreach my $split (@split) { + ( my $txt = $split ) =~ s/([\a\b\t\n\f\r\e])/$esc{$1}/sg; + $split =~ s/(.)/sprintf("%02X ",ord($1))/sge; + print STDERR "M::L >>> $split : $txt\n"; + } +} + +sub print { + my $smtp = shift; + $MIME::Lite::DEBUG and _hexify( join( "", @_ ) ); + $smtp->datasend(@_) + or Carp::croak( "Net::CMD (Net::SMTP) DATASEND command failed +.\n" + . "Last server message was:" + . $smtp->message + . "This probably represents a problem with new +line encoding " ); +} + +#============================================================ + +package MIME::Lite::SMTP::SSL; + +#============================================================ +# This class just adds a print() method to Net::SMTP. +# Notice that we don't use/require it until it's needed! + +use strict; +use vars qw( @ISA ); +@ISA = qw(Net::SMTP::SSL); + +# some of the below is borrowed from Data::Dumper +my %esc = ( "\a" => "\\a", + "\b" => "\\b", + "\t" => "\\t", + "\n" => "\\n", + "\f" => "\\f", + "\r" => "\\r", + "\e" => "\\e", + ); + +sub _hexify { + local $_ = shift; + my @split = m/(.{1,16})/gs; + foreach my $split (@split) { + ( my $txt = $split ) =~ s/([\a\b\t\n\f\r\e])/$esc{$1}/sg; + $split =~ s/(.)/sprintf("%02X ",ord($1))/sge; + print STDERR "M::L >>> $split : $txt\n"; + } +} + +sub print { + my $smtp = shift; + $MIME::Lite::DEBUG and _hexify( join( "", @_ ) ); + $smtp->datasend(@_) + or Carp::croak( "Net::CMD (Net::SMTP) DATASEND command failed +.\n" + . "Last server message was:" + . $smtp->message + . "This probably represents a problem with new +line encoding " ); +} + #============================================================

    and now the emails do not go out anymore, not even by the port 25 port 587

    need advice more recommended

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://860143]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others cooling their heels in the Monastery: (10)
As of 2014-10-23 19:02 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    For retirement, I am banking on:










    Results (128 votes), past polls