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)的主要内容,如果未能解决你的问题,请参考以下文章

MIME::Lite 不适用于 SMTP

MIME::Lite 附加文件 perl 时出错

MIME::Lite 和内联 CSS 图像

在没有 Outlook 的 Windows 7 上设置 MIME::Lite

使用 MIME::Lite:TT 发送列表

如何在 Perl 5 中保存通过 MIME::Lite 发送的邮件的备份?