http://www.perlmonks.org?node_id=860143


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.

Replies are listed 'Best First'.
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