【问题标题】:MIME::Lite 3.030 - NET::SMTP with smtps (port 465)MIME::Lite 3.030 - NET::SMTP 与 smtps(端口 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";

【问题讨论】:

    标签: perl smtp


    【解决方案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 不被当前维护者推荐。]
    猜你喜欢
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-12
    • 1970-01-01
    • 2020-10-22
    • 2014-03-08
    • 2015-12-27
    相关资源
    最近更新 更多