Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
697 views
in Technique[技术] by (71.8m points)

perl - MIME::Lite 3.030 - NET::SMTP with smtps (port 465)

MIME::Lite can pass extra parameters to Net::SMTP constructor.
Version MIME::Lite 3.030 does not include SSL on its list of passed Net::SMTP parameters.

Is it possible to change it without modifying MIME::Lite source code?

   1 package MIME::Lite;
     ...
 355 $VERSION = '3.030';
     ...
2843 my @_net_smtp_opts = qw( Hello LocalAddr LocalPort Timeout
2844                          Port ExactAddresses Debug );
     ....
2847 sub __opts {
2848     my $args=shift;
2849     return map { exists $args->{$_} ? ( $_ => $args->{$_} ) : () } @_;
2850 }
     ....
2852 sub send_by_smtp {
         ....
2876     my %opts = __opts(\%args, @_net_smtp_opts);
2877     my $smtp = MIME::Lite::SMTP->new( $hostname, %opts )
2878       or Carp::croak "SMTP Failed to connect to mail server: $!
";
See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

One thing you could do is wrapping __opts with some function that modifies the parameters are passed to it.

In line 2876:

my %opts = __opts(\%args, @_net_smtp_opts);

The advantage here is that after the reference to %args, the rest of parameters is always the array @net_smtp_opts defined earlier. Unfortunately you can't modify its value at distance (it's a lexical variable), but you can do something like this:

use strict;
use warnings;

use MIME::Lite;
use Class::Method::Modifiers;

around 'MIME::Lite::__opts' => sub {
  my $orig = shift;
  push(@_,'SSL') if @_ >= 2 && $_[1] eq 'Hello';
  my (@ret) = $orig->(@_);
  return @ret;
};

This way every call to MIME::Lite::__opts is "intercepted", and you have the ability to modify the parameters at your will.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...