MIME :: Lite 3.030 - 带有smtps的NET :: SMTP(端口465)

时间:2017-08-09 11:08:01

标签: perl smtp

MIME::Lite可以将额外参数传递给Net::SMTP构造函数 版本MIME::Lite 3.030在其传递的SSL参数列表中不包含Net::SMTP

是否可以更改而不修改MIME::Lite源代码?

   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: $!\n";

1 个答案:

答案 0 :(得分:1)

你可以做的一件事是用__opts包装一些修改参数传递给它的函数。

第2876行:

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

这里的优点是在引用%args之后,其余参数始终是之前定义的数组@net_smtp_opts。不幸的是你不能修改它在远处的值(它是一个词法变量),但是你可以这样做:

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;
};

这样每次拨打MIME::Lite::__opts都会被“截获”,您可以随意修改参数。