Re: pacth for MIME::Lite
[email protected] (fakessh) Fri, 08 Oct 2010 11:42:29 +0200
| Newsgroups | perl.pep |
|---|---|
| Organization | fakessh @ |
| Message-ID | <[email protected]> |
hello pep network
did you apply the patch and did you find the problem of encoding
characters in the lib MIME:: Lite
I thank you for all your possible returns
Le mardi 05 octobre 2010 à 11:21 +0200, fakessh a écrit :
> hello guys
> i am french
> i am love Perl
> i am good in Perl
> 3 level actually for perlmonks
>
> i wrote a patch for MIME::Lite
> i quote
>
> ~]# cat mimelitefinal.patch
> --- Desktop/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-16
> 20:11:16.000000000 +0200
> @@ -404,6 +404,8 @@
> sendmail => [$SENDMAIL ? "$SENDMAIL -t -oi -oem" : undef],
> smtp => [],
> sub => [],
> + tls => [],
> + ssl => [],
> );
>
> ### Boundary counter:
> @@ -2562,25 +2564,23 @@
>
> if ( ref($self) ) { ### instance method:
> my ( $method, @args );
> - if (@_) { ### args; use them just this once
> - $method = 'send_by_' . $meth;
> + if (@_) { ### no args; use defaults
> + $method = 'send_by_'.$meth;
> @args = @_;
> - } else { ### no args; use defaults
> + } elsif (@_) {
> + my @old = ( $Sender, @{ $SenderArgs{$Sender} } );
> + $Sender = $meth;
> + $SenderArgs{$Sender} = [@_]; ### remaining args
> + return @old;
> + } elsif (@_) {
> $method = "send_by_$Sender";
> @args = @{ $SenderArgs{$Sender} || [] };
> - }
> + }
> $self->verify_data if $AUTO_VERIFY; ### prevents missing
> parts!
> Carp::croak "Unknown send method '$meth'" unless
> $self->can($method);
> return $self->$method(@args);
> - } else { ### class method:
> - if (@_) {
> - my @old = ( $Sender, @{ $SenderArgs{$Sender} } );
> - $Sender = $meth;
> - $SenderArgs{$Sender} = [@_]; ### remaining args
> - return @old;
> - } else {
> + } else {
> Carp::croak "class method send must have HOW... arguments
> \n";
> - }
> }
> }
>
> @@ -2829,7 +2829,7 @@
> my @_mail_opts = qw( Size Return Bits Transaction Envelope );
> my @_recip_opts = qw( SkipBad );
> my @_net_smtp_opts = qw( Hello LocalAddr LocalPort Timeout
> - Port ExactAddresses Debug );
> + Port User Password ExactAddresses Debug );
> # internal: qw( NoAuth AuthUser AuthPass To From Host);
>
> sub __opts {
> @@ -2872,7 +2872,7 @@
> if ($smtp->supports('AUTH',500,["Command unknown: 'AUTH'"])) {
> $smtp->auth( $args{AuthUser}, $args{AuthPass} )
> or die "SMTP auth() command failed: $!\n"
> - . $smtp->message . "\n";
> + . $smtp . "\n";
> } else {
> die "SMTP auth() command not supported on $hostname\n";
> }
> @@ -2893,14 +2893,14 @@
> # Send the data
> $smtp->data()
> or die "SMTP data() command failed: $!\n"
> - . $smtp->message . "\n";
> + . $smtp . "\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
> + . $smtp
> . "This probably represents a problem with newline encoding ";
>
> # terminate the session
> @@ -2908,6 +2908,121 @@
>
> return $self->{last_send_successful} = 1;
> }
> +sub send_by_tls {
> + require Net::SMTP::TLS;
> + 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($field);
> + }
> + }
> + 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-Path') );
> + $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";
> +
> + # Send the mail command
> + %opts = __opts( \%args, @_mail_opts);
> + $smtp->mail( $args{From}, %opts ? \%opts : () )
> + or die "SMTP mail() command failed: $!\n"
> + . $smtp . "\n";
> +
> + # Send the recipients command
> + %opts = __opts( \%args, @_recip_opts);
> + $smtp->to( @{ $args{To} }, %opts ? \%opts : () )
> + or die "SMTP recipient() command failed: $!\n"
> + . $smtp . "\n";
> +
> + # Send the data
> + $smtp->data()
> + or die "SMTP data() command failed: $!\n"
> + . $smtp . "\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 . "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;
> + 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($field);
> + }
> + }
> + 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-Path') );
> + $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";
> +
> +
> + # Send the mail command
> + %opts = __opts( \%args, @_mail_opts);
> + $smtp->mail( $args{From}, %opts ? \%opts : () )
> + or die "SMTP mail() command failed: $!\n"
> + . $smtp . "\n";
> +
> + # Send the recipients command
> + %opts = __opts( \%args, @_recip_opts);
> + $smtp->to( @{ $args{To} }, %opts ? \%opts : () )
> + or die "SMTP recipient() command failed: $!\n"
> + . $smtp . "\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 . "This probably represents a problem with newline
> encoding ";
> +
> + # terminate the session
> + $smtp->quit;
> +
> + return $self->{last_send_successful} = 1;
> +}
>
> =item send_by_testfile FILENAME
>
> @@ -3121,10 +3236,92 @@
> $smtp->datasend(@_)
> or Carp::croak( "Net::CMD (Net::SMTP) DATASEND command
> failed.\n"
> . "Last server message was:"
> - . $smtp->message
> + . $smtp
> . "This probably represents a problem with
> newline 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_tls = ( "\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_tls{$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 . "This probably represents a problem
> with newline 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_ssl = ( "\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_ssl{$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 . "This probably represents a problem
> with newline encoding " );
> +}
> +
>
> #============================================================
>
>
>
> it's down in debugger in $mailer->mail('[email protected]')
> and a more
> no error is present in Net::SMTP::TLS
> i know a découvert a bug
> i don't understand this error
>
> more appointment a pleasure
--
http://pgp.mit.edu:11371/pks/lookup?op=get&search=0x092164A7
gpg --keyserver pgp.mit.edu --recv-key 092164A7
signature.asc
(application/pgp-signature, 189 B)
-----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.5 (GNU/Linux) iD8DBQBMrueFtXI/OwkhZKcRAjSCAJ4zk5Dj1a6G6LkY7I/zG9CEqFS9cwCfRt2N ppH06BjRjpZbvqXS8Bmbo6g= =cZyc -----END PGP SIGNATURE-----