MIME::Lite 3.030 - NET::SMTP 与 smtps(端口 465)
Posted
技术标签:
【中文标题】MIME::Lite 3.030 - NET::SMTP 与 smtps(端口 465)【英文标题】:MIME::Lite 3.030 - NET::SMTP with smtps (port 465) 【发布时间】:2018-01-17 05:49:20 【问题描述】:MIME::Lite
可以将额外的参数传递给Net::SMTP
构造函数。
版本 MIME::Lite
3.030 在其传递的 Net::SMTP
参数列表中不包括 SSL
。
是否可以在不修改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】:您可以做的一件事是将__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
的调用都会被“拦截”,你可以随意修改参数。
【讨论】:
before
方法没有得到$orig
参数,而只有原始的@_
。我能够更改现有的@_ 元素,但before
忽略了通过push(@_,'SSL')
附加额外参数的尝试。
正确.. 感谢编辑(很抱歉没有彻底检查)
顺便说一句,我了解您正在尝试推断哪些特定数组已传递给 __opts
查看其内容。一个不太容易出错的版本(如果 RJBS 或其他人更改数组元素顺序怎么办?)可能是 push( @_, 'SSL') if grep /Hello/ @_
转移后$orig
$_[0]
是对正在检查/减少的哈希的引用。无论如何,这是一个肮脏的黑客攻击 => 正确的方法应该是更改/修补 MIME::Lite
源。无论如何,我从我的脚本中清除了MIME::Lite
,但这将需要几个月的时间作为一项非关键任务。 [man MIME::Lite
: MIME::Lite 不被当前维护者推荐。]以上是关于MIME::Lite 3.030 - NET::SMTP 与 smtps(端口 465)的主要内容,如果未能解决你的问题,请参考以下文章